2022-09-26 22:38:13 +02:00

195 lines
6.1 KiB
Go

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"))
}
}