Select Git revision
-
Tóth Miklós Tibor authoredTóth Miklós Tibor authored
api.go 4.05 KiB
package api
import (
"encoding/json"
"fmt"
"git.sch.bme.hu/disappointment-industries/becskasszasch/db"
"git.sch.bme.hu/disappointment-industries/becskasszasch/helpers"
"git.sch.bme.hu/disappointment-industries/becskasszasch/homepage"
"net/http"
)
var router = http.NewServeMux()
var Handler = pultoschMW(router)
func init() {
router.Handle("/product", adminMW(http.HandlerFunc(ProductHandler)))
router.HandleFunc("/products", ProductHandler)
router.Handle("/user", adminMW(http.HandlerFunc(UpdateUserHandler)))
router.HandleFunc("/users", GetUsers)
router.HandleFunc("/cart", BuyInPult)
}
func adminMW(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
admin, err := homepage.GetUserInfoBySession(r)
if err != nil {
helpers.Logger.Println(err)
return
}
if admin.IsAdmin {
h.ServeHTTP(w, r)
} else {
w.WriteHeader(http.StatusForbidden)
}
})
}
func pultoschMW(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user, err := homepage.GetUserInfoBySession(r)
if err != nil {
helpers.Logger.Println(err)
return
}
if user.IsPultosch {
h.ServeHTTP(w, r)
} else {
w.WriteHeader(http.StatusForbidden)
}
})
}
func ProductHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodPut:
var product db.Product
if err := json.NewDecoder(r.Body).Decode(&product); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
err := product.Save()
if err != nil {
// TODO: handle error
return
}
w.WriteHeader(http.StatusOK)
case http.MethodPatch:
var product db.Product
if err := json.NewDecoder(r.Body).Decode(&product); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
err := product.Save()
if err != nil {
// TODO: handle error
return
}
w.WriteHeader(http.StatusOK)
case http.MethodGet:
var product db.Product
id := r.URL.Query().Get("id")
product.ID = id
product.Load()
json.NewEncoder(w).Encode(product)
default:
http.Error(w, "Invalid method", http.StatusMethodNotAllowed)
}
}
func UpdateUserHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodPatch:
var user db.User
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
oldUser := db.User{SchAcc: user.SchAcc}
err := oldUser.Load()
if err != nil {
// TODO: handle error
return
}
user.Money = oldUser.Money
user.Spends = oldUser.Spends
user.Name = oldUser.Name
err = user.Save()
if err != nil {
// TODO: handle error
return
}
w.WriteHeader(http.StatusOK)
default:
http.Error(w, "Invalid method", http.StatusMethodNotAllowed)
}
}
func GetUsers(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
users, err := db.GetUsersSorted(db.GetDB())
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
json.NewEncoder(w).Encode(users)
}
}
func BuyInPult(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodPost:
dec := json.NewDecoder(r.Body)
var pult PultAPIData
err := dec.Decode(&pult)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
user, err := db.GetUser(pult.UserID)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
pultosch, err := homepage.GetUserInfoBySession(r)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
var spends []*db.Spend
for _, purchase := range pult.Purchases {
if purchase.Amount == 0 {
continue
}
spend := db.Spend{
User: user,
SchAcc: user.SchAcc,
ProdID: purchase.ProductID,
Amount: purchase.Amount,
Notes: fmt.Sprintf("Pultosch: %s (%s)", pultosch.User.Name, pultosch.User.SchAcc),
}
spends = append(spends, &spend)
}
err = db.SaveMultipleSpend(spends)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
}