148 lines
4.2 KiB
Go
148 lines
4.2 KiB
Go
package usercontroller
|
|
|
|
import (
|
|
d "WWWShop/wwwshop/dao/database"
|
|
u "WWWShop/wwwshop/dao/usermanager"
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
"errors"
|
|
)
|
|
|
|
type UserController struct{}
|
|
|
|
func New() UserController {
|
|
return UserController{}
|
|
}
|
|
|
|
func (self UserController) DELETE(w http.ResponseWriter, r *http.Request) {
|
|
ids, usernames, _, err := self.SetupInputForFilter(w, r)
|
|
user_manager := u.New(d.DB())
|
|
|
|
if err != nil {
|
|
if err != nil {
|
|
json_response,_ := EncodeJSONResponse(NewResponseError(err.Error()))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
}
|
|
deleted_users, err := user_manager.Delete(ids, usernames)
|
|
if err != nil {
|
|
json_response, _ := EncodeJSONResponse(NewResponseError(err.Error()))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
deleted_users_json, _ := EncodeJSONResponse(deleted_users)
|
|
fmt.Fprintf(w, deleted_users_json)
|
|
}
|
|
|
|
func (self UserController) SetupInputForFilter(w http.ResponseWriter, r *http.Request) ([]int64, []string, *int64, error) {
|
|
query := r.URL.Query()
|
|
usernames, _ := query["username"]
|
|
ids, _ := query["id"]
|
|
pages, _ := query["page"]
|
|
var page int64
|
|
if len(pages) == 0 {
|
|
page = 0
|
|
} else {
|
|
var err error
|
|
page, err = strconv.ParseInt(pages[0], 0, 64)
|
|
if err != nil {
|
|
return nil, nil, nil, errors.New("Unable to parse int page.")
|
|
}
|
|
}
|
|
ids_int := make([]int64, 0)
|
|
for _, id := range ids {
|
|
id_int, err := strconv.ParseInt(id, 0, 64)
|
|
if err != nil {
|
|
return nil, nil, nil, errors.New("Unable to parse int id.")
|
|
}
|
|
ids_int = append(ids_int, id_int)
|
|
}
|
|
return ids_int, usernames, &page, nil
|
|
}
|
|
|
|
func (self UserController) GET(w http.ResponseWriter, r *http.Request) {
|
|
user_manager := u.New(d.DB())
|
|
ids, usernames, page, err := self.SetupInputForFilter(w, r)
|
|
if err != nil {
|
|
json_response, _ := EncodeJSONResponse(NewResponseError(err.Error()))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
users, err := user_manager.Retrieve(*page, ids, usernames)
|
|
if err != nil {
|
|
json_response, _ := EncodeJSONResponse(NewResponseError(strings.Join([]string{"Unable to retrieve users ", err.Error()}, "")))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
json_response, _ := EncodeJSONResponse(users)
|
|
fmt.Fprintf(w, json_response)
|
|
}
|
|
|
|
func (self UserController) POST(w http.ResponseWriter, r *http.Request) {
|
|
var decoded_user_struct POSTUser
|
|
decoder := json.NewDecoder(r.Body)
|
|
err := decoder.Decode(&decoded_user_struct)
|
|
if err != nil {
|
|
json_response, _ := EncodeJSONResponse(NewResponseError("Unable to decode json"))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
if decoded_user_struct.Username == "" {
|
|
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
|
json_response, _ := EncodeJSONResponse(NewResponseError("Unable to get username"))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
if decoded_user_struct.PasswordPlaintext == "" {
|
|
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
|
json_response, _ := EncodeJSONResponse(NewResponseError("Unable to get password"))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
user_manager := u.New(d.DB())
|
|
user, err := user_manager.AddWithPlainPassword(decoded_user_struct.Username, decoded_user_struct.PasswordPlaintext)
|
|
if err != nil {
|
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
|
json_response, _ := EncodeJSONResponse(NewResponseError(strings.Join(
|
|
[]string{"Unable to create user ", err.Error()},
|
|
"")))
|
|
fmt.Fprintf(w, json_response)
|
|
return
|
|
}
|
|
json_response, err := EncodeJSONResponse(user)
|
|
fmt.Fprintf(w, json_response)
|
|
}
|
|
|
|
type Response interface{}
|
|
|
|
type ResponseError struct {
|
|
Error string `json:"error"`
|
|
}
|
|
|
|
func NewResponseError(error_str string) ResponseError {
|
|
return ResponseError{
|
|
Error: error_str,
|
|
}
|
|
}
|
|
|
|
type POSTUser struct {
|
|
Username string `json:"username"`
|
|
PasswordPlaintext string `json:"password"`
|
|
}
|
|
|
|
func EncodeJSONResponse(response Response) (string, error) {
|
|
var buffer bytes.Buffer
|
|
encoder := json.NewEncoder(&buffer)
|
|
err := encoder.Encode(response)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return buffer.String(), nil
|
|
}
|