comparison controllers/user.go @ 250:deabc2712634

Implemented /users GET as list of users.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 27 Jul 2018 11:05:03 +0200
parents d39f897fae16
children 322c3d0e05ef
comparison
equal deleted inserted replaced
248:21cf31a7d9e1 250:deabc2712634
27 } 27 }
28 28
29 User struct { 29 User struct {
30 User string `json:"user"` 30 User string `json:"user"`
31 Role Role `json:"role"` 31 Role Role `json:"role"`
32 Password string `json:"password"` 32 Password string `json:"password,omitempty"`
33 Email Email `json:"email"` 33 Email Email `json:"email"`
34 Country Country `json:"country"` 34 Country Country `json:"country"`
35 Extent *BoundingBox `json:"extent"` 35 Extent *BoundingBox `json:"extent"`
36 } 36 }
37 ) 37 )
44 updateUserSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5, NULL, $6)` 44 updateUserSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5, NULL, $6)`
45 updateUserExtentSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5, 45 updateUserExtentSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5,
46 ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10)` 46 ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10)`
47 47
48 deleteUserSQL = `SELECT sys_admin.delete_user($1)` 48 deleteUserSQL = `SELECT sys_admin.delete_user($1)`
49 ) 49
50 listUsersSQL = `SELECT
51 rolename,
52 username,
53 country,
54 email_address,
55 ST_XMin(map_extent), ST_YMin(map_extent),
56 ST_XMax(map_extent), ST_YMax(map_extent)
57 FROM sys_admin.list_users`
58 )
59
60 var errNoString = errors.New("Not a string")
50 61
51 var ( 62 var (
52 // https://stackoverflow.com/questions/201323/how-to-validate-an-email-address-using-a-regular-expression 63 // https://stackoverflow.com/questions/201323/how-to-validate-an-email-address-using-a-regular-expression
53 emailRe = regexp.MustCompile( 64 emailRe = regexp.MustCompile(
54 `(?:[a-z0-9!#$%&'*+/=?^_` + "`" + 65 `(?:[a-z0-9!#$%&'*+/=?^_` + "`" +
77 88
78 func (e Email) Value() (driver.Value, error) { 89 func (e Email) Value() (driver.Value, error) {
79 return string(e), nil 90 return string(e), nil
80 } 91 }
81 92
93 func (e *Email) Scan(src interface{}) (err error) {
94 if s, ok := src.(string); ok {
95 *e = Email(s)
96 } else {
97 err = errNoString
98 }
99 return
100 }
101
82 var ( 102 var (
83 validCountries = []string{ 103 validCountries = []string{
84 "AT", "BG", "DE", "HU", "HR", 104 "AT", "BG", "DE", "HU", "HR",
85 "MD", "RO", "RS", "SK", "UA", 105 "MD", "RO", "RS", "SK", "UA",
86 } 106 }
104 124
105 func (c Country) Value() (driver.Value, error) { 125 func (c Country) Value() (driver.Value, error) {
106 return string(c), nil 126 return string(c), nil
107 } 127 }
108 128
129 func (c *Country) Scan(src interface{}) (err error) {
130 if s, ok := src.(string); ok {
131 *c = Country(s)
132 } else {
133 err = errNoString
134 }
135 return
136 }
137
109 var ( 138 var (
110 validRoles = []string{ 139 validRoles = []string{
111 "waterway_user", 140 "waterway_user",
112 "waterway_admin", 141 "waterway_admin",
113 "sys_admin", 142 "sys_admin",
115 errNoValidRole = errors.New("Not a valid role") 144 errNoValidRole = errors.New("Not a valid role")
116 ) 145 )
117 146
118 func (r Role) Value() (driver.Value, error) { 147 func (r Role) Value() (driver.Value, error) {
119 return string(r), nil 148 return string(r), nil
149 }
150
151 func (r *Role) Scan(src interface{}) (err error) {
152 if s, ok := src.(string); ok {
153 *r = Role(s)
154 } else {
155 err = errNoString
156 }
157 return
120 } 158 }
121 159
122 func (r *Role) UnmarshalJSON(data []byte) error { 160 func (r *Role) UnmarshalJSON(data []byte) error {
123 var s string 161 var s string
124 if err := json.Unmarshal(data, &s); err != nil { 162 if err := json.Unmarshal(data, &s); err != nil {
255 Result: "success", 293 Result: "success",
256 }, 294 },
257 } 295 }
258 return 296 return
259 } 297 }
298
299 func listUsers(
300 rw http.ResponseWriter, req *http.Request,
301 input interface{}, db *sql.DB,
302 ) (jr JSONResult, err error) {
303
304 var rows *sql.Rows
305
306 rows, err = db.Query(listUsersSQL)
307 if err != nil {
308 return
309 }
310 defer rows.Close()
311
312 var users []*User
313
314 for rows.Next() {
315 user := &User{Extent: &BoundingBox{}}
316 if err = rows.Scan(
317 &user.Role,
318 &user.User,
319 &user.Country,
320 &user.Email,
321 &user.Extent.X1, &user.Extent.Y1,
322 &user.Extent.X2, &user.Extent.Y2,
323 ); err != nil {
324 return
325 }
326 users = append(users, user)
327 }
328
329 jr = JSONResult{
330 Result: struct {
331 Users []*User `json:"users"`
332 }{
333 Users: users,
334 },
335 }
336 return
337 }