Skip to content
Snippets Groups Projects
Select Git revision
  • master
  • entra protected
  • kasszasch protected
  • radlaci97-modern-web
  • revert-8b053a7c
  • manifest-background-color
  • 18-ui-pimping protected
  • payout protected
  • v1.8.5 protected
  • v1.8.4 protected
  • v1.8.3 protected
  • v1.8.2 protected
  • v1.8.1 protected
  • v1.8.0 protected
  • v1.7.1 protected
  • v1.7.0 protected
  • v1.6.21 protected
  • v1.6.20 protected
  • v1.6.19 protected
  • v1.6.18 protected
  • v1.6.17 protected
  • v1.6.16 protected
  • v1.6.15 protected
  • v1.16.15 protected
  • v1.6.14 protected
  • v1.6.13 protected
  • v1.6.12 protected
  • v1.6.11 protected
28 results

api.go

Blame
  • 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
    		}
    	}
    }