package stats import ( "context" "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "time" "github.com/FrankenBotDev/FrankenAPI/ent" "github.com/FrankenBotDev/FrankenAPI/ent/user" "github.com/FrankenBotDev/FrankenAPI/pkg/routes/logger" "github.com/FrankenBotDev/FrankenAPI/pkg/sys" "github.com/go-chi/chi/v5" ) // TODO: error handle route properly func StatsRouter() http.Handler { r := chi.NewRouter() r.Post("/user", createUser) r.Get("/user", getUser) r.Get("/server", getServer) r.Put("/user", updateUser) return r } /* ========================================================== ROUTE DEFINITIONS =========================================================== */ func createUser(w http.ResponseWriter, r *http.Request) { // fetch data userJson := make(map[string]any) userData, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, `"type":"error", "code":"could_not_find_data_in_request"`, http.StatusInternalServerError) return } // process data err = json.Unmarshal(userData, &userJson) if err != nil { http.Error(w, `{"type":"error", "code":"could_not_proccess_data"}`, http.StatusInternalServerError) return } if userJson["commiterid"].(string) != "" { if userJson["serverid"].(string) != "" { if userJson["userid"].(string) != "" { if userJson["username"].(string) != "" { // push data to database _, err = r.Context().Value(sys.EntClientKey).(*ent.Client).User.Create(). SetServerid(userJson["serverid"].(string)). SetUserid(userJson["userid"].(string)). SetLevel(1). SetUsername(userJson["username"].(string)). SetXp(0). SetMsgs(0). SetCreated(time.Now()). Save(r.Context().Value(sys.ContextClientKey).(context.Context)) if err != nil { sys.ErrorJsonResponse(w, "could_not_add_data_to_database", errors.New("data could not be added to the database")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("username needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("userid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set")) } } func updateUser(w http.ResponseWriter, r *http.Request) { // daten fetchen userData, err := ioutil.ReadAll(r.Body) if err != nil { sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("the request appears to be empty")) } // proccess data userJson := make(map[string]any) err = json.Unmarshal(userData, &userJson) if err != nil { sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed")) } if userJson["committerid"].(string) != "" { if userJson["serverid"].(string) != "" { if userJson["userid"].(string) != "" { if levelNum, ok := userJson["level"].(float64); ok { if xpNum, ok := userJson["xp"].(float64); ok { if msgsNum, ok := userJson["msgs"].(float64); ok { _, err := r.Context().Value(sys.EntClientKey).(*ent.Client).User.Update(). Where(user.Serverid(userJson["serverid"].(string)), user.Userid(userJson["userid"].(string))). SetLevel(int(levelNum)). SetXp(int(xpNum)). SetMsgs(int(msgsNum)). Save(r.Context().Value(sys.ContextClientKey).(context.Context)) if err != nil { fmt.Println(err) } logger.Logtodb([]string{ userJson["committerid"].(string), "Updated User with UserID: " + userJson["userid"].(string), "User Update", userJson["serverid"].(string), }, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context)) } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("msgs needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("xp needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("level needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("userid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set")) } } func getUser(w http.ResponseWriter, r *http.Request) { userData := r.URL.Query() fmt.Println(userData) if userData.Get("commiterid") != "" { if userData.Get("serverid") != "" { if userData.Get("userid") != "" { // replace with actual api data user, err := r.Context().Value(sys.EntClientKey).(*ent.Client).User.Query(). Where(user.Serverid(userData.Get("serverid")), user.Userid(userData.Get("userid"))). All(r.Context().Value(sys.ContextClientKey).(context.Context)) if err != nil { sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database")) } sys.SuccessJsonResponse(w, user) } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("userid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set")) } } func getServer(w http.ResponseWriter, r *http.Request) { serverData := r.URL.Query() if serverData.Get("commiterid") != "" { if serverData.Get("serverid") != "" { // replace with actual api data user, err := r.Context().Value(sys.EntClientKey).(*ent.Client).User.Query(). Where(user.Serverid(serverData.Get("serverid"))). All(r.Context().Value(sys.ContextClientKey).(context.Context)) if err != nil { sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database")) } sys.SuccessJsonResponse(w, user) } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set")) } } else { sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set")) } }