Mercurial > gemma
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 } |