changeset 235:7d1f0ffdfa41

Implemented /users update controller.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 26 Jul 2018 15:42:57 +0200
parents 694f959ba3e7
children 664fe6536141
files controllers/routes.go controllers/user.go
diffstat 2 files changed, 78 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/controllers/routes.go	Thu Jul 26 13:47:38 2018 +0200
+++ b/controllers/routes.go	Thu Jul 26 15:42:57 2018 +0200
@@ -14,6 +14,7 @@
 
 	sysAdmin := auth.EnsureRole("sys_admin")
 
+	api.Handle("/users/{user}", sysAdmin(updateUser)).Methods(http.MethodPut)
 	api.Handle("/users", sysAdmin(createUser)).Methods(http.MethodPost)
 
 	api.HandleFunc("/login", login).
--- a/controllers/user.go	Thu Jul 26 13:47:38 2018 +0200
+++ b/controllers/user.go	Thu Jul 26 15:42:57 2018 +0200
@@ -10,6 +10,7 @@
 	"strings"
 
 	"gemma.intevation.de/gemma/auth"
+	"github.com/gorilla/mux"
 	"github.com/jackc/pgx"
 )
 
@@ -39,6 +40,10 @@
 	createUserSQL       = `SELECT sys_admin.create_user($1, $2, $3, $4, NULL, $5)`
 	createUserExtentSQL = `SELECT sys_admin.create_user($1, $2, $3, $4,
   ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9)`
+
+	updateUserSQL       = `SELECT sys_admin.update_user($1, $2, $3, $4, $5, NULL, $6)`
+	updateUserExtentSQL = `SELECT sys_admin.update_user($1, $2, $3, $4, $5,
+  ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10)`
 )
 
 var (
@@ -115,6 +120,78 @@
 	return errNoValidRole
 }
 
+func updateUser(rw http.ResponseWriter, req *http.Request) {
+
+	user := mux.Vars(req)["user"]
+	if user == "" {
+		http.Error(rw, "error: user empty", http.StatusBadRequest)
+		return
+	}
+
+	var newUser User
+
+	defer req.Body.Close()
+	if err := json.NewDecoder(req.Body).Decode(&newUser); err != nil {
+		http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	token, _ := auth.GetToken(req)
+	err := auth.ConnPool.Do(token, func(db *sql.DB) (err error) {
+		if newUser.Extent == nil {
+			_, err = db.Exec(
+				updateUserSQL,
+				user,
+				string(newUser.Role),
+				newUser.User,
+				newUser.Password,
+				string(newUser.Country),
+				string(newUser.Email),
+			)
+		} else {
+			_, err = db.Exec(
+				updateUserExtentSQL,
+				user,
+				string(newUser.Role),
+				newUser.User,
+				newUser.Password,
+				string(newUser.Country),
+				newUser.Extent.X1, newUser.Extent.Y1,
+				newUser.Extent.X2, newUser.Extent.Y2,
+				string(newUser.Email),
+			)
+		}
+		return
+	})
+
+	var res struct {
+		Result  string `json:"result"`
+		Code    string `json:"code,omitempty"`
+		Message string `json:"message,omitempty"`
+	}
+
+	if err != nil {
+		if pgErr, ok := err.(pgx.PgError); ok {
+			res.Result = "failure"
+			res.Code = pgErr.Code
+			res.Message = pgErr.Message
+		} else {
+			log.Printf("err: %v\n", err)
+			http.Error(rw,
+				"error: "+err.Error(),
+				http.StatusInternalServerError)
+			return
+		}
+	} else {
+		res.Result = "success"
+	}
+
+	rw.Header().Set("Content-Type", "application/json")
+	if err := json.NewEncoder(rw).Encode(&res); err != nil {
+		log.Printf("error: %v\n", err)
+	}
+}
+
 func createUser(rw http.ResponseWriter, req *http.Request) {
 
 	var user User