This commit is contained in:
daru
2022-04-17 19:46:57 +02:00
parent 4612cd1eb0
commit 4107603e22
5 changed files with 121 additions and 23 deletions

View File

@@ -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"`

View File

@@ -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) {

34
nuss.go
View File

@@ -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

47
ober.go
View File

@@ -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

View File

@@ -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 {