annotate controllers/user.go @ 226:63dd5216eee4

Refactored gemma server to be more REST-like.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 26 Jul 2018 12:24:30 +0200
parents cmd/gemma/user.go@bcd9016dcd4d
children 7d1f0ffdfa41
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"
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 "encoding/json"
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
6 "errors"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 "log"
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
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 "gemma.intevation.de/gemma/auth"
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
13 "github.com/jackc/pgx"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 )
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
16 type (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
17 Email string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
18 Country string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
19 Role string
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
21 BoundingBox struct {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
22 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
23 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
24 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
25 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
26 }
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 User struct {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
29 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
30 Role Role `json:"role"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
31 Password string `json:"password"`
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
32 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
33 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
34 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
35 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
36 )
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 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
39 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
40 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
41 ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9)`
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 )
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
44 var (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
45 // 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
46 emailRe = regexp.MustCompile(
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
47 `(?:[a-z0-9!#$%&'*+/=?^_` + "`" +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
48 `{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_` + "`" +
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
49 `{|}~-]+)*|"(?:[\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
50 `|\\[\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
51 `@(?:(?:[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
52 `|\[(?:(?:(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
53 `(?:(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
54 `:(?:[\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
55 `|\\[\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
56 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
57 )
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
58
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
59 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
60 var s string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
61 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
62 return err
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
63 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
64 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
65 return errNoEmailAddress
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
66 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
67 *e = Email(s)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
68 return nil
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
69 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
70
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
71 var (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
72 validCountries = []string{
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
73 "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
74 "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
75 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
76 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
77 )
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
78
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
79 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
80 var s string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
81 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
82 return err
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
83 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
84 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
85 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
86 if v == s {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
87 *c = Country(v)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
88 return nil
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
89 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
90 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
91 return errNoValidCountry
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
92 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
93
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
94 var (
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
95 validRoles = []string{
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
96 "waterway_user",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
97 "waterway_admin",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
98 "sys_admin",
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
99 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
100 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
101 )
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
102
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
103 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
104 var s string
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
105 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
106 return err
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
107 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
108 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
109 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
110 if v == s {
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
111 *r = Role(v)
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
112 return nil
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
113 }
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 return errNoValidRole
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
116 }
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
117
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 func createUser(rw http.ResponseWriter, req *http.Request) {
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
120 var user User
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122 defer req.Body.Close()
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 if err := json.NewDecoder(req.Body).Decode(&user); err != nil {
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
124 http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 return
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
128 token, _ := auth.GetToken(req)
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
129 err := auth.ConnPool.Do(token, func(db *sql.DB) (err error) {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
130 if user.Extent == nil {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
131 _, err = db.Exec(
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
132 createUserSQL,
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
133 string(user.Role),
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
134 user.User,
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
135 user.Password,
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
136 string(user.Country),
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
137 string(user.Email),
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
138 )
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
139 } else {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
140 _, err = db.Exec(
218
bcd9016dcd4d Use correct statement for user.Extent case.
Sascha Wilde <wilde@intevation.de>
parents: 216
diff changeset
141 createUserExtentSQL,
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
142 string(user.Role),
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
143 user.User,
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
144 user.Password,
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
145 string(user.Country),
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
146 user.Extent.X1, user.Extent.Y1,
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
147 user.Extent.X2, user.Extent.Y2,
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
148 string(user.Email),
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
149 )
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
150 }
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
151 return
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152 })
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
154 var res struct {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
155 Result string `json:"result"`
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
156 Code string `json:"code,omitempty"`
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
157 Message string `json:"message,omitempty"`
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
160 if err != nil {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
161 if pgErr, ok := err.(pgx.PgError); ok {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
162 res.Result = "failure"
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
163 res.Code = pgErr.Code
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
164 res.Message = pgErr.Message
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
165 } else {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
166 log.Printf("err: %v\n", err)
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
167 http.Error(rw,
189
96bb671cdd98 Some input checking for email, roles and valid countries.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 188
diff changeset
168 "error: "+err.Error(),
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
169 http.StatusInternalServerError)
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
170 return
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
171 }
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
172 } else {
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
173 res.Result = "success"
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 rw.Header().Set("Content-Type", "application/json")
187
51addc0533fe More complete show case for creating users.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 186
diff changeset
177 if err := json.NewEncoder(rw).Encode(&res); err != nil {
186
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178 log.Printf("error: %v\n", err)
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 }
fe3a88f00b0a Experimental user creation support.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 }