From 4107603e22fb0afdc4f0c7313fe7cd09f4b058b7 Mon Sep 17 00:00:00 2001 From: daru Date: Sun, 17 Apr 2022 19:46:57 +0200 Subject: [PATCH] GET user --- klotz.go | 12 ++++++++++++ knecht.go | 37 +++++++++++++++++++++---------------- nuss.go | 34 +++++++++++++++++++++++++++++----- ober.go | 47 +++++++++++++++++++++++++++++++++++++++++++++-- schaffer.go | 14 ++++++++++++++ 5 files changed, 121 insertions(+), 23 deletions(-) diff --git a/klotz.go b/klotz.go index fce1794..d274c46 100644 --- a/klotz.go +++ b/klotz.go @@ -65,6 +65,18 @@ type UserData struct { Secret string `json:"secret"` } +type User struct { + MalID int64 `json:"id"` + Username string `json:"username"` + URL string `json:"url"` + ImageURL string `json:"imageUrl"` + LastOnline time.Time `json:"lastOnline"` + Gender string `json:"gender"` + Birthday time.Time `json:"birthday"` + Location string `json:"location"` + Joined time.Time `json:"joined"` +} + type RegisterData struct { Username string `json:"username"` MalID int64 `json:"malId"` diff --git a/knecht.go b/knecht.go index fe59444..c8c8534 100644 --- a/knecht.go +++ b/knecht.go @@ -54,30 +54,35 @@ func GetUserAnimeListBytes(username, status string) ([]byte, error) { return GetDataMal(userApiMal + username + "/animelist?limit=1000&status=" + status) } -func GetUserData(username string) (*UserJikan, []byte, error) { - var user UserJikan - body, err := GetUserBytesCached(username) - if err != nil { - return nil, body, err - } - err = json.Unmarshal(body, &user) - return &user, body, err -} - -func GetUserBytesCached(username string) ([]byte, error) { +func GetUserData(username string) (*User, []byte, error) { + var user User data, err := userCache.Get(username) if err != nil { - data, err = GetDataJikan(username) + err = nil + dataJikan, err := GetDataJikan(userApiJikan + username) if err != nil { - return data, err + return nil, nil, err } if strings.Contains(string(data), "BadResponseException") { - return data, fmt.Errorf("user not found: %s", username) + return nil, nil, fmt.Errorf("user not found: %s", username) + } + var userJikan UserJikan + err = json.Unmarshal(dataJikan, &userJikan) + if err != nil { + return nil, nil, err + } + // convert to user + user = UserConvert(&userJikan) + data, err = json.Marshal(&user) + if err != nil { + return &user, data, err } userCache.Set(username, data) - return data, err + } else { + err = json.Unmarshal(data, &user) } - return data, err + + return &user, data, err } func GetSeasonDataAll() ([]Anime, []byte, error) { diff --git a/nuss.go b/nuss.go index 822aebd..4910a35 100644 --- a/nuss.go +++ b/nuss.go @@ -41,7 +41,7 @@ func AddUserToAnime(username string, userId, animeId int64) (*AnimeUser, error) users = make([]WatchUser, 0) } else { // parse user list - users, err = parseUserList(e.Value) + users, err = parseWatchUserList(e.Value) if err != nil { return err } @@ -87,7 +87,7 @@ func DeleteUserFromAnime(username string, userId, animeId int64) (*AnimeUser, er users = make([]WatchUser, 0) } else { // parse user list - users, err = parseUserList(e.Value) + users, err = parseWatchUserList(e.Value) if err != nil { return err } @@ -129,7 +129,7 @@ func DeleteUserFromAnimes(userId int64) error { // iterate entries for _, e := range entries { // parse user list - users, err := parseUserList(e.Value) + users, err := parseWatchUserList(e.Value) if err != nil { return err } @@ -164,6 +164,30 @@ func DeleteUserFromAnimes(userId int64) error { }) } +func ReadRegisteredUsers() ([]UserData, error) { + var users []UserData + err := db.View( + func(tx *nutsdb.Tx) error { + entries, err := tx.GetAll(bucketUsers) + if err != nil { + return err + } + users = make([]UserData, 0) + // iterate entries + for _, e := range entries { + // parse user + var user UserData + err := json.Unmarshal(e.Value, &user) + if err != nil { + return err + } + users = append(users, user) + } + return nil + }) + return users, err +} + func ReadAnimeUsers() ([]AnimeUser, error) { var animes []AnimeUser err := db.View( @@ -181,7 +205,7 @@ func ReadAnimeUsers() ([]AnimeUser, error) { return err } // parse user list - users, err := parseUserList(e.Value) + users, err := parseWatchUserList(e.Value) if err != nil { return err } @@ -235,7 +259,7 @@ func DbDelete(bucket, key string) error { }) } -func parseUserList(data []byte) ([]WatchUser, error) { +func parseWatchUserList(data []byte) ([]WatchUser, error) { var users []WatchUser err := json.Unmarshal(data, &users) return users, err diff --git a/ober.go b/ober.go index 98912fc..91a6f46 100644 --- a/ober.go +++ b/ober.go @@ -17,7 +17,7 @@ func RunWebserv() { r.GET("/", Headers(Start)) r.GET("/api/season", Headers(Season)) r.GET("/api/anime/{id}", Headers(AnimeGet)) - r.GET("/api/user/{id?}", Headers(AnimeGet)) + r.GET("/api/user/{user?}", Headers(UserGet)) r.GET("/api/watch/{user?}", Headers(WatchGet)) r.POST("/api/register", Headers(Register)) r.POST("/api/watch/{user}", Headers(WatchPost)) @@ -95,6 +95,49 @@ func AnimeGet(ctx *fasthttp.RequestCtx) { ctx.SetStatusCode(fasthttp.StatusOK) } +func UserGet(ctx *fasthttp.RequestCtx) { + usrVal := ctx.UserValue("user") + users := make([]User, 0) + if usrVal != nil { + // get specific user + user, _, err := GetUserData(fmt.Sprintf("%s", usrVal)) + if err != nil { + ctx.WriteString(err.Error()) + ctx.SetStatusCode(fasthttp.StatusNotFound) + return + } + users = append(users, *user) + } else { + regUsers, err := ReadRegisteredUsers() + if err != nil { + addErrorToCtx(ctx, err) + return + } + for _, u := range regUsers { + user, _, err := GetUserData(u.Username) + if err != nil { + addErrorToCtx(ctx, err) + return + } + users = append(users, *user) + } + } + + bytes, err := json.Marshal(users) + 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 WatchGet(ctx *fasthttp.RequestCtx) { usrVal := ctx.UserValue("user") var userId int64 @@ -185,7 +228,7 @@ func Register(ctx *fasthttp.RequestCtx) { ctx.SetStatusCode(fasthttp.StatusExpectationFailed) return } - if userData.Data.MalID != register.MalID { + if userData.MalID != register.MalID { ctx.WriteString("Dich gibts nicht auf MAL") ctx.SetStatusCode(fasthttp.StatusExpectationFailed) return diff --git a/schaffer.go b/schaffer.go index 95c9277..4621bf5 100644 --- a/schaffer.go +++ b/schaffer.go @@ -91,6 +91,20 @@ func MalConvert(mal *AnimeDetailMal) Anime { return res } +func UserConvert(user *UserJikan) User { + return User{ + MalID: user.Data.MalID, + Username: user.Data.Username, + URL: user.Data.URL, + ImageURL: user.Data.Images.Jpg.ImageURL, + LastOnline: user.Data.LastOnline, + Gender: user.Data.Gender, + Birthday: user.Data.Birthday, + Location: user.Data.Location, + Joined: user.Data.Joined, + } +} + func GetSeasonCache() ([]Anime, error) { data, err := seasoncache.Get(seasonApiJikan) if err != nil {