view cmd/tokenserver/user.go @ 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
line wrap: on
line source

package main

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"log"
	"net/http"

	"gemma.intevation.de/gemma/auth"
	"github.com/jackc/pgx"
)

type BoundingBox struct {
	X1 float64 `json:"x1"`
	Y1 float64 `json:"y1"`
	X2 float64 `json:"x2"`
	Y2 float64 `json:"y2"`
}

type User struct {
	User     string       `json:"user"`
	Role     string       `json:"role"`
	Password string       `json:"password"`
	Email    string       `json:"email"`
	Country  string       `json:"country"`
	Extent   *BoundingBox `json:"extent"`
}

const (
	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) {

	var user User

	defer req.Body.Close()
	if err := json.NewDecoder(req.Body).Decode(&user); err != nil {
		log.Printf("err: %v\n", err)
		http.Error(rw, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
		return
	}

	token, _ := auth.GetToken(req)
	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
	})

	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,
				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(&res); err != nil {
		log.Printf("error: %v\n", err)
	}
}