package main import ( "crypto/sha512" "encoding/json" "fmt" "log" "strconv" "strings" "github.com/fasthttp/router" "github.com/valyala/fasthttp" "github.com/xujiajun/nutsdb" ) func RunWebserv() { r := router.New() r.GET("/", Start) r.GET("/api/season", Season) r.GET("/api/watch/{user?}", WatchGet) r.POST("/api/register", Register) r.POST("/api/watch/{user}", WatchPost) r.PATCH("/api/watch/{user}", Start) r.DELETE("/api/watch/{user}", Start) log.Fatal(fasthttp.ListenAndServe(":"+strconv.Itoa(*webServerPort), r.Handler)) } func Start(ctx *fasthttp.RequestCtx) { data, err := cache.Get(seasonApiJikan) if err != nil { addErrorToCtx(ctx, err) return } var seasonData SeasonJikan err = json.Unmarshal(data, &seasonData) if err != nil { addErrorToCtx(ctx, err) return } WriteIndex(ctx, &seasonData) ctx.SetContentType("text/html; charset=utf-8") ctx.SetStatusCode(fasthttp.StatusOK) } func Season(ctx *fasthttp.RequestCtx) { data, err := cache.Get(seasonApiJikan) if err != nil { addErrorToCtx(ctx, err) return } var seasonData SeasonJikan err = json.Unmarshal(data, &seasonData) if err != nil { addErrorToCtx(ctx, err) return } _, err = ctx.Write(data) if err != nil { addErrorToCtx(ctx, err) return } ctx.SetContentType("application/json; charset=utf-8") ctx.SetStatusCode(fasthttp.StatusOK) } func WatchGet(ctx *fasthttp.RequestCtx) { usrVal := ctx.UserValue("user") var userId int64 if usrVal != nil { // check user exists user, err := ReadUser(fmt.Sprintf("%s", usrVal)) if err != nil { ctx.WriteString("Dich gibts nicht") ctx.SetStatusCode(fasthttp.StatusNotFound) return } userId = user.MalID } animes, err := ReadAnimes() if err != nil { // check if no anime were inserted if err != nutsdb.ErrBucketEmpty { addErrorToCtx(ctx, err) return } animes = make([]Anime, 0) } // apply single user logic if usrVal != nil { filteredAnimes := make([]Anime, 0) for _, a := range animes { for _, u := range a.Users { if u.MalID == userId { filteredAnimes = append(filteredAnimes, a) break } } } animes = filteredAnimes } bytes, err := json.Marshal(animes) if err != nil { addErrorToCtx(ctx, err) return } _, err = ctx.Write(bytes) if err != nil { addErrorToCtx(ctx, err) return } ctx.SetContentType("application/json; charset=utf-8") ctx.SetStatusCode(fasthttp.StatusOK) } func Register(ctx *fasthttp.RequestCtx) { if string(ctx.Request.Header.ContentType()) != "application/json" { ctx.SetStatusCode(fasthttp.StatusBadRequest) return } body := ctx.PostBody() var register RegisterData err := json.Unmarshal(body, ®ister) if err != nil { ctx.WriteString(err.Error()) ctx.SetStatusCode(fasthttp.StatusBadRequest) return } if register.MalID == 0 || register.Username == "" || register.Secret == "" || register.Sauce == "" { ctx.WriteString("Sprich JSON du Hurensohn") ctx.SetStatusCode(fasthttp.StatusBadRequest) return } calcSauce := fmt.Sprintf("%x", sha512.Sum512([]byte(registerSecret+strconv.FormatInt(register.MalID, 10)+register.Username))) if calcSauce != strings.ToLower(register.Sauce) { ctx.WriteString("Möge die Sauce mit dir sein") ctx.SetStatusCode(fasthttp.StatusBadRequest) return } // check user exists _, err = ReadUser(register.Username) if err == nil { ctx.WriteString("Nicht drängeln") ctx.SetStatusCode(fasthttp.StatusConflict) return } // check user legit userData, _, err := GetUserData(register.Username) if err != nil { ctx.WriteString(err.Error()) ctx.SetStatusCode(fasthttp.StatusExpectationFailed) return } if userData.Data.MalID != register.MalID { ctx.WriteString("Dich gibts nicht auf MAL") ctx.SetStatusCode(fasthttp.StatusExpectationFailed) return } // REGISTER user := UserData{ Username: register.Username, MalID: register.MalID, Secret: register.Secret, } err = SaveUser(&user) if err != nil { addErrorToCtx(ctx, err) return } ctx.SetBody(body) ctx.SetStatusCode(fasthttp.StatusOK) } func WatchPost(ctx *fasthttp.RequestCtx) { // } func addErrorToCtx(ctx *fasthttp.RequestCtx, err error) { ctx.WriteString(err.Error()) ctx.SetStatusCode(fasthttp.StatusInternalServerError) }