annotate controllers/user.go @ 253:322c3d0e05ef

The column in sys_admin.list_users is called rolname not rolename.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 27 Jul 2018 12:12:48 +0200
parents deabc2712634
children de6fdb316b8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
226
63dd5216eee4 Refactored gemma server to be more REST-like.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 218
diff changeset
1 package controllers
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import (
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 "database/sql"
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
5 "database/sql/driver"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 "encoding/json"
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
7 "errors"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 "net/http"
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
9 "regexp"
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
10 "strings"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11
241
3b688fe04c39 No omitempty if JSON serialising PostgreSQL errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 240
diff changeset
12 "github.com/gorilla/mux"
3b688fe04c39 No omitempty if JSON serialising PostgreSQL errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 240
diff changeset
13
240
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
14 "gemma.intevation.de/gemma/auth"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 )
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
17 type (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
18 Email string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
19 Country string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
20 Role string
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
22 BoundingBox struct {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
23 X1 float64 `json:"x1"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
24 Y1 float64 `json:"y1"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
25 X2 float64 `json:"x2"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
26 Y2 float64 `json:"y2"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
27 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
28
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
29 User struct {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
30 User string `json:"user"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
31 Role Role `json:"role"`
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
32 Password string `json:"password,omitempty"`
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
33 Email Email `json:"email"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
34 Country Country `json:"country"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
35 Extent *BoundingBox `json:"extent"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
36 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
37 )
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 const (
216
494a257e7715 Called schema prefixed sys_admin.create_user instead of create_user.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 206
diff changeset
40 createUserSQL = `SELECT sys_admin.create_user($1, $2, $3, $4, NULL, $5)`
494a257e7715 Called schema prefixed sys_admin.create_user instead of create_user.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 206
diff changeset
41 createUserExtentSQL = `SELECT sys_admin.create_user($1, $2, $3, $4,
188
ee3093966a6d ST_SetSRID should be not need as the map extent column does not have any SRID code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 187
diff changeset
42 ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9)`
235
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
43
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
44 updateUserSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5, NULL, $6)`
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
45 updateUserExtentSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5,
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
46 ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10)`
240
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
47
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
48 deleteUserSQL = `SELECT sys_admin.delete_user($1)`
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
49
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
50 listUsersSQL = `SELECT
253
322c3d0e05ef The column in sys_admin.list_users is called rolname not rolename.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 250
diff changeset
51 rolname,
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
52 username,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
53 country,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
54 email_address,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
55 ST_XMin(map_extent), ST_YMin(map_extent),
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
56 ST_XMax(map_extent), ST_YMax(map_extent)
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
57 FROM sys_admin.list_users`
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 )
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
60 var errNoString = errors.New("Not a string")
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
61
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
62 var (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
63 // https://stackoverflow.com/questions/201323/how-to-validate-an-email-address-using-a-regular-expression
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
64 emailRe = regexp.MustCompile(
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
65 `(?:[a-z0-9!#$%&'*+/=?^_` + "`" +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
66 `{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_` + "`" +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
67 `{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]` +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
68 `|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")` +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
69 `@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?` +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
70 `|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}` +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
71 `(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]` +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
72 `:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]` +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
73 `|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])`)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
74 errNoEmailAddress = errors.New("Not a valid email address")
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
75 )
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
76
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
77 func (e *Email) UnmarshalJSON(data []byte) error {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
78 var s string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
79 if err := json.Unmarshal(data, &s); err != nil {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
80 return err
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
81 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
82 if !emailRe.MatchString(s) {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
83 return errNoEmailAddress
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
84 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
85 *e = Email(s)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
86 return nil
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
87 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
88
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
89 func (e Email) Value() (driver.Value, error) {
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
90 return string(e), nil
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
91 }
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
92
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
93 func (e *Email) Scan(src interface{}) (err error) {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
94 if s, ok := src.(string); ok {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
95 *e = Email(s)
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
96 } else {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
97 err = errNoString
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
98 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
99 return
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
100 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
101
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
102 var (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
103 validCountries = []string{
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
104 "AT", "BG", "DE", "HU", "HR",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
105 "MD", "RO", "RS", "SK", "UA",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
106 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
107 errNoValidCountry = errors.New("Not a valid country")
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
108 )
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
109
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
110 func (c *Country) UnmarshalJSON(data []byte) error {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
111 var s string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
112 if err := json.Unmarshal(data, &s); err != nil {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
113 return err
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
114 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
115 s = strings.ToUpper(s)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
116 for _, v := range validCountries {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
117 if v == s {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
118 *c = Country(v)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
119 return nil
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
120 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
121 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
122 return errNoValidCountry
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
123 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
124
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
125 func (c Country) Value() (driver.Value, error) {
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
126 return string(c), nil
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
127 }
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
128
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
129 func (c *Country) Scan(src interface{}) (err error) {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
130 if s, ok := src.(string); ok {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
131 *c = Country(s)
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
132 } else {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
133 err = errNoString
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
134 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
135 return
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
136 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
137
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
138 var (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
139 validRoles = []string{
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
140 "waterway_user",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
141 "waterway_admin",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
142 "sys_admin",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
143 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
144 errNoValidRole = errors.New("Not a valid role")
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
145 )
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
146
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
147 func (r Role) Value() (driver.Value, error) {
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
148 return string(r), nil
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
149 }
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
150
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
151 func (r *Role) Scan(src interface{}) (err error) {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
152 if s, ok := src.(string); ok {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
153 *r = Role(s)
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
154 } else {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
155 err = errNoString
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
156 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
157 return
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
158 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
159
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
160 func (r *Role) UnmarshalJSON(data []byte) error {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
161 var s string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
162 if err := json.Unmarshal(data, &s); err != nil {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
163 return err
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
164 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
165 s = strings.ToLower(s)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
166 for _, v := range validRoles {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
167 if v == s {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
168 *r = Role(v)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
169 return nil
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
170 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
171 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
172 return errNoValidRole
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
173 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
174
240
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
175 func deleteUser(
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
176 rw http.ResponseWriter, req *http.Request,
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
177 input interface{}, db *sql.DB,
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
178 ) (jr JSONResult, err error) {
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
179
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
180 user := mux.Vars(req)["user"]
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
181 if user == "" {
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
182 err = JSONError{http.StatusBadRequest, "error: user empty"}
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
183 return
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
184 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
185
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
186 session, _ := auth.GetSession(req)
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
187 if session.User == user {
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
188 err = JSONError{http.StatusBadRequest, "error: cannot delete yourself"}
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
189 return
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
190 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
191
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
192 if _, err = db.Exec(deleteUserSQL, user); err != nil {
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
193 return
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
194 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
195
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
196 // Running in a go routine should not be necessary.
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
197 go func() { auth.ConnPool.Logout(user) }()
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
198
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
199 jr = JSONResult{Code: http.StatusNoContent}
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
200 return
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
201 }
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
202
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
203 func updateUser(
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
204 rw http.ResponseWriter, req *http.Request,
240
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
205 input interface{}, db *sql.DB,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
206 ) (jr JSONResult, err error) {
235
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
207
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
208 user := mux.Vars(req)["user"]
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
209 if user == "" {
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
210 err = JSONError{http.StatusBadRequest, "error: user empty"}
235
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
211 return
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
212 }
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
213
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
214 newUser := input.(*User)
235
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
215
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
216 if newUser.Extent == nil {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
217 _, err = db.Exec(
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
218 updateUserSQL,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
219 user,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
220 newUser.Role,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
221 newUser.User,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
222 newUser.Password,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
223 newUser.Country,
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
224 newUser.Email,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
225 )
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
226 } else {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
227 _, err = db.Exec(
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
228 updateUserExtentSQL,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
229 user,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
230 newUser.Role,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
231 newUser.User,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
232 newUser.Password,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
233 newUser.Country,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
234 newUser.Extent.X1, newUser.Extent.Y1,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
235 newUser.Extent.X2, newUser.Extent.Y2,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
236 newUser.Email,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
237 )
235
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
238 }
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
239
7d1f0ffdfa41 Implemented /users update controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 226
diff changeset
240 if err != nil {
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
241 return
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
242 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
243
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
244 jr = JSONResult{
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
245 Code: http.StatusCreated,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
246 Result: struct {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
247 Result string `json:"result"`
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
248 }{
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
249 Result: "success",
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
250 },
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
251 }
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
252 return
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
253 }
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
254
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
255 func createUser(
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
256 rw http.ResponseWriter, req *http.Request,
240
9012e4045da4 Implemented /user delete controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 237
diff changeset
257 input interface{}, db *sql.DB,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
258 ) (jr JSONResult, err error) {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
259
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
260 user := input.(*User)
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
261
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
262 if user.Extent == nil {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
263 _, err = db.Exec(
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
264 createUserSQL,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
265 user.Role,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
266 user.User,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
267 user.Password,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
268 user.Country,
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
269 user.Email,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
270 )
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
271 } else {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
272 _, err = db.Exec(
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
273 createUserExtentSQL,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
274 user.Role,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
275 user.User,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
276 user.Password,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
277 user.Country,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
278 user.Extent.X1, user.Extent.Y1,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
279 user.Extent.X2, user.Extent.Y2,
243
d39f897fae16 Made models for email, user and country driver.Valuer to get rid of some conversions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 241
diff changeset
280 user.Email,
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
281 )
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
284 if err != nil {
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
285 return
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
288 jr = JSONResult{
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
289 Code: http.StatusCreated,
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
290 Result: struct {
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
291 Result string `json:"result"`
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
292 }{
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
293 Result: "success",
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
294 },
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 }
237
3771788d3dae Reduce boilerplate code when writing JSON parsing/generating endpoints.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 235
diff changeset
296 return
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297 }
250
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
298
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
299 func listUsers(
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
300 rw http.ResponseWriter, req *http.Request,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
301 input interface{}, db *sql.DB,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
302 ) (jr JSONResult, err error) {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
303
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
304 var rows *sql.Rows
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
305
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
306 rows, err = db.Query(listUsersSQL)
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
307 if err != nil {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
308 return
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
309 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
310 defer rows.Close()
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
311
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
312 var users []*User
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
313
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
314 for rows.Next() {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
315 user := &User{Extent: &BoundingBox{}}
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
316 if err = rows.Scan(
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
317 &user.Role,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
318 &user.User,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
319 &user.Country,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
320 &user.Email,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
321 &user.Extent.X1, &user.Extent.Y1,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
322 &user.Extent.X2, &user.Extent.Y2,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
323 ); err != nil {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
324 return
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
325 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
326 users = append(users, user)
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
327 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
328
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
329 jr = JSONResult{
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
330 Result: struct {
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
331 Users []*User `json:"users"`
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
332 }{
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
333 Users: users,
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
334 },
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
335 }
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
336 return
deabc2712634 Implemented /users GET as list of users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 243
diff changeset
337 }