view cmd/tokenserver/user.go @ 186:fe3a88f00b0a

Experimental user creation support.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 19 Jul 2018 18:33:52 +0200
parents
children 51addc0533fe
line wrap: on
line source

package main

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

	"gemma.intevation.de/gemma/auth"
)

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, $5, $6)`
)

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) error {
		_, err := db.Exec(
			createUserSQL,
			user.Role,
			user.User,
			user.Password,
			user.Country,
			nil,
		)
		return err
	})

	if err != nil {
		log.Printf("err: %v\n", err)
		http.Error(rw, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
		return
	}

	var result = struct {
		Result string `json:"result"`
	}{
		Result: "success",
	}

	rw.Header().Set("Content-Type", "application/json")
	if err := json.NewEncoder(rw).Encode(&result); err != nil {
		log.Printf("error: %v\n", err)
	}
}