changeset 187:51addc0533fe

More complete show case for creating users.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 20 Jul 2018 07:05:11 +0200
parents fe3a88f00b0a
children ee3093966a6d
files cmd/tokenserver/user.go
diffstat 1 files changed, 47 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/tokenserver/user.go	Thu Jul 19 18:33:52 2018 +0200
+++ b/cmd/tokenserver/user.go	Fri Jul 20 07:05:11 2018 +0200
@@ -3,10 +3,12 @@
 import (
 	"database/sql"
 	"encoding/json"
+	"fmt"
 	"log"
 	"net/http"
 
 	"gemma.intevation.de/gemma/auth"
+	"github.com/jackc/pgx"
 )
 
 type BoundingBox struct {
@@ -26,7 +28,9 @@
 }
 
 const (
-	createUserSQL = `SELECT create_user($1, $2, $3, $4, $5, $6)`
+	createUserSQL       = `SELECT create_user($1, $2, $3, $4, NULL, $5)`
+	createUserExtentSQL = `SELECT create_user($1, $2, $3, $4,
+  ST_SetSRID(ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), 4326), $9)`
 )
 
 func createUser(rw http.ResponseWriter, req *http.Request) {
@@ -41,32 +45,55 @@
 	}
 
 	token, _ := auth.GetToken(req)
-	err := auth.ConnPool.Do(token, func(db *sql.DB) error {
-		_, err := db.Exec(
-			createUserSQL,
-			user.Role,
-			user.User,
-			user.Password,
-			user.Country,
-			nil,
-		)
-		return err
+	err := auth.ConnPool.Do(token, func(db *sql.DB) (err error) {
+		if user.Extent == nil {
+			_, err = db.Exec(
+				createUserSQL,
+				user.Role,
+				user.User,
+				user.Password,
+				user.Country,
+				user.Email,
+			)
+		} else {
+			_, err = db.Exec(
+				createUserSQL,
+				user.Role,
+				user.User,
+				user.Password,
+				user.Country,
+				user.Extent.X1, user.Extent.Y1,
+				user.Extent.X2, user.Extent.Y2,
+				user.Email,
+			)
+		}
+		return
 	})
 
-	if err != nil {
-		log.Printf("err: %v\n", err)
-		http.Error(rw, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
-		return
+	var res struct {
+		Result  string `json:"result"`
+		Code    string `json:"code,omitempty"`
+		Message string `json:"message,omitempty"`
 	}
 
-	var result = struct {
-		Result string `json:"result"`
-	}{
-		Result: "success",
+	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,
+				fmt.Sprintf("error: %s", err.Error()),
+				http.StatusInternalServerError)
+			return
+		}
+	} else {
+		res.Result = "success"
 	}
 
 	rw.Header().Set("Content-Type", "application/json")
-	if err := json.NewEncoder(rw).Encode(&result); err != nil {
+	if err := json.NewEncoder(rw).Encode(&res); err != nil {
 		log.Printf("error: %v\n", err)
 	}
 }