comparison controllers/user.go @ 235:7d1f0ffdfa41

Implemented /users update controller.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 26 Jul 2018 15:42:57 +0200
parents 63dd5216eee4
children 3771788d3dae
comparison
equal deleted inserted replaced
231:694f959ba3e7 235:7d1f0ffdfa41
8 "net/http" 8 "net/http"
9 "regexp" 9 "regexp"
10 "strings" 10 "strings"
11 11
12 "gemma.intevation.de/gemma/auth" 12 "gemma.intevation.de/gemma/auth"
13 "github.com/gorilla/mux"
13 "github.com/jackc/pgx" 14 "github.com/jackc/pgx"
14 ) 15 )
15 16
16 type ( 17 type (
17 Email string 18 Email string
37 38
38 const ( 39 const (
39 createUserSQL = `SELECT sys_admin.create_user($1, $2, $3, $4, NULL, $5)` 40 createUserSQL = `SELECT sys_admin.create_user($1, $2, $3, $4, NULL, $5)`
40 createUserExtentSQL = `SELECT sys_admin.create_user($1, $2, $3, $4, 41 createUserExtentSQL = `SELECT sys_admin.create_user($1, $2, $3, $4,
41 ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9)` 42 ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9)`
43
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,
46 ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10)`
42 ) 47 )
43 48
44 var ( 49 var (
45 // https://stackoverflow.com/questions/201323/how-to-validate-an-email-address-using-a-regular-expression 50 // https://stackoverflow.com/questions/201323/how-to-validate-an-email-address-using-a-regular-expression
46 emailRe = regexp.MustCompile( 51 emailRe = regexp.MustCompile(
113 } 118 }
114 } 119 }
115 return errNoValidRole 120 return errNoValidRole
116 } 121 }
117 122
123 func updateUser(rw http.ResponseWriter, req *http.Request) {
124
125 user := mux.Vars(req)["user"]
126 if user == "" {
127 http.Error(rw, "error: user empty", http.StatusBadRequest)
128 return
129 }
130
131 var newUser User
132
133 defer req.Body.Close()
134 if err := json.NewDecoder(req.Body).Decode(&newUser); err != nil {
135 http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
136 return
137 }
138
139 token, _ := auth.GetToken(req)
140 err := auth.ConnPool.Do(token, func(db *sql.DB) (err error) {
141 if newUser.Extent == nil {
142 _, err = db.Exec(
143 updateUserSQL,
144 user,
145 string(newUser.Role),
146 newUser.User,
147 newUser.Password,
148 string(newUser.Country),
149 string(newUser.Email),
150 )
151 } else {
152 _, err = db.Exec(
153 updateUserExtentSQL,
154 user,
155 string(newUser.Role),
156 newUser.User,
157 newUser.Password,
158 string(newUser.Country),
159 newUser.Extent.X1, newUser.Extent.Y1,
160 newUser.Extent.X2, newUser.Extent.Y2,
161 string(newUser.Email),
162 )
163 }
164 return
165 })
166
167 var res struct {
168 Result string `json:"result"`
169 Code string `json:"code,omitempty"`
170 Message string `json:"message,omitempty"`
171 }
172
173 if err != nil {
174 if pgErr, ok := err.(pgx.PgError); ok {
175 res.Result = "failure"
176 res.Code = pgErr.Code
177 res.Message = pgErr.Message
178 } else {
179 log.Printf("err: %v\n", err)
180 http.Error(rw,
181 "error: "+err.Error(),
182 http.StatusInternalServerError)
183 return
184 }
185 } else {
186 res.Result = "success"
187 }
188
189 rw.Header().Set("Content-Type", "application/json")
190 if err := json.NewEncoder(rw).Encode(&res); err != nil {
191 log.Printf("error: %v\n", err)
192 }
193 }
194
118 func createUser(rw http.ResponseWriter, req *http.Request) { 195 func createUser(rw http.ResponseWriter, req *http.Request) {
119 196
120 var user User 197 var user User
121 198
122 defer req.Body.Close() 199 defer req.Body.Close()