refactor: move top anime and genres to anime.go
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mal/internal/observability"
|
"mal/internal/observability"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -45,6 +47,42 @@ func (c *Client) WarmAnimeRecommendations(id int) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetTopAnime returns the top-rated anime list for a given page.
|
||||||
|
func (c *Client) GetTopAnime(ctx context.Context, page int) (TopAnimeResult, error) {
|
||||||
|
if page < 1 {
|
||||||
|
page = 1
|
||||||
|
}
|
||||||
|
cacheKey := fmt.Sprintf("top:%d", page)
|
||||||
|
|
||||||
|
var result TopAnimeResponse
|
||||||
|
params := url.Values{}
|
||||||
|
params.Set("page", strconv.Itoa(page))
|
||||||
|
reqURL := buildRequestURL(c.baseURL, "/top/anime", params)
|
||||||
|
|
||||||
|
if err := c.getWithCache(ctx, cacheKey, shortCacheTTL, reqURL, &result); err != nil {
|
||||||
|
return TopAnimeResult{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return TopAnimeResult{
|
||||||
|
Animes: result.Data,
|
||||||
|
HasNextPage: result.Pagination.HasNextPage,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAnimeGenres returns list of all anime genres, cached long-term.
|
||||||
|
func (c *Client) GetAnimeGenres(ctx context.Context) ([]Genre, error) {
|
||||||
|
const cacheKey = "anime_genres"
|
||||||
|
|
||||||
|
var result GenresResponse
|
||||||
|
reqURL := fmt.Sprintf("%s/genres/anime", c.baseURL)
|
||||||
|
|
||||||
|
if err := c.getWithCache(ctx, cacheKey, longCacheTTL, reqURL, &result); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Data, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetAnimeByID returns full anime details; finished series cached 30 days, airing cached 1 day.
|
// GetAnimeByID returns full anime details; finished series cached 30 days, airing cached 1 day.
|
||||||
func (c *Client) GetAnimeByID(ctx context.Context, id int) (Anime, error) {
|
func (c *Client) GetAnimeByID(ctx context.Context, id int) (Anime, error) {
|
||||||
cacheKey := fmt.Sprintf("anime:%d", id)
|
cacheKey := fmt.Sprintf("anime:%d", id)
|
||||||
|
|||||||
@@ -67,39 +67,3 @@ func (c *Client) SearchAdvanced(ctx context.Context, query, animeType, status, o
|
|||||||
HasNextPage: result.Pagination.HasNextPage,
|
HasNextPage: result.Pagination.HasNextPage,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTopAnime returns the top-rated anime list for a given page.
|
|
||||||
func (c *Client) GetTopAnime(ctx context.Context, page int) (TopAnimeResult, error) {
|
|
||||||
if page < 1 {
|
|
||||||
page = 1
|
|
||||||
}
|
|
||||||
cacheKey := fmt.Sprintf("top:%d", page)
|
|
||||||
|
|
||||||
var result TopAnimeResponse
|
|
||||||
params := url.Values{}
|
|
||||||
params.Set("page", strconv.Itoa(page))
|
|
||||||
reqURL := buildRequestURL(c.baseURL, "/top/anime", params)
|
|
||||||
|
|
||||||
if err := c.getWithCache(ctx, cacheKey, shortCacheTTL, reqURL, &result); err != nil {
|
|
||||||
return TopAnimeResult{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return TopAnimeResult{
|
|
||||||
Animes: result.Data,
|
|
||||||
HasNextPage: result.Pagination.HasNextPage,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAnimeGenres returns list of all anime genres, cached long-term.
|
|
||||||
func (c *Client) GetAnimeGenres(ctx context.Context) ([]Genre, error) {
|
|
||||||
const cacheKey = "anime_genres"
|
|
||||||
|
|
||||||
var result GenresResponse
|
|
||||||
reqURL := fmt.Sprintf("%s/genres/anime", c.baseURL)
|
|
||||||
|
|
||||||
if err := c.getWithCache(ctx, cacheKey, longCacheTTL, reqURL, &result); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.Data, nil
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user