refactor: decouple domain types from jikan
This commit is contained in:
@@ -308,15 +308,74 @@ func (s *animeService) GetProducers(ctx context.Context, query string, page int,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetGenres(ctx context.Context) ([]domain.Genre, error) {
|
func (s *animeService) GetGenres(ctx context.Context) ([]domain.Genre, error) {
|
||||||
return s.jikan.GetAnimeGenres(ctx)
|
genres, err := s.jikan.GetAnimeGenres(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out := make([]domain.Genre, 0, len(genres))
|
||||||
|
for _, g := range genres {
|
||||||
|
if g.MalID <= 0 || strings.TrimSpace(g.Name) == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out = append(out, domain.Genre{MalID: g.MalID, Name: g.Name})
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetCharacters(ctx context.Context, id int) ([]domain.Character, error) {
|
func (s *animeService) GetCharacters(ctx context.Context, id int) ([]domain.CharacterEntry, error) {
|
||||||
return s.jikan.GetAnimeCharacters(ctx, id)
|
items, err := s.jikan.GetAnimeCharacters(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make([]domain.CharacterEntry, 0, len(items))
|
||||||
|
for _, it := range items {
|
||||||
|
var mapped domain.CharacterEntry
|
||||||
|
mapped.Character.MalID = it.Character.MalID
|
||||||
|
mapped.Character.URL = it.Character.URL
|
||||||
|
mapped.Character.Name = it.Character.Name
|
||||||
|
mapped.Character.Images.Jpg.ImageURL = it.Character.Images.Jpg.ImageURL
|
||||||
|
mapped.Character.Images.Webp.ImageURL = it.Character.Images.Webp.ImageURL
|
||||||
|
mapped.Character.Images.Webp.SmallImageURL = it.Character.Images.Webp.SmallImageURL
|
||||||
|
mapped.Role = it.Role
|
||||||
|
|
||||||
|
if len(it.VoiceActors) > 0 {
|
||||||
|
mapped.VoiceActors = make([]domain.CharacterVoiceActor, 0, len(it.VoiceActors))
|
||||||
|
for _, va := range it.VoiceActors {
|
||||||
|
var mappedVA domain.CharacterVoiceActor
|
||||||
|
mappedVA.Language = va.Language
|
||||||
|
mappedVA.Person.MalID = va.Person.MalID
|
||||||
|
mappedVA.Person.URL = va.Person.URL
|
||||||
|
mappedVA.Person.Name = va.Person.Name
|
||||||
|
mappedVA.Person.Images.Jpg.ImageURL = va.Person.Images.Jpg.ImageURL
|
||||||
|
mapped.VoiceActors = append(mapped.VoiceActors, mappedVA)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out = append(out, mapped)
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetRecommendations(ctx context.Context, id int) ([]domain.Recommendation, error) {
|
func (s *animeService) GetRecommendations(ctx context.Context, id int) ([]domain.RecommendationEntry, error) {
|
||||||
return s.jikan.GetAnimeRecommendations(ctx, id)
|
items, err := s.jikan.GetAnimeRecommendations(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make([]domain.RecommendationEntry, 0, len(items))
|
||||||
|
for _, it := range items {
|
||||||
|
var mapped domain.RecommendationEntry
|
||||||
|
mapped.Entry.MalID = it.Entry.MalID
|
||||||
|
mapped.Entry.URL = it.Entry.URL
|
||||||
|
mapped.Entry.Title = it.Entry.Title
|
||||||
|
mapped.Entry.Images.Webp.LargeImageURL = it.Entry.Images.Webp.LargeImageURL
|
||||||
|
mapped.URL = it.URL
|
||||||
|
mapped.Votes = it.Votes
|
||||||
|
out = append(out, mapped)
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetRelations(ctx context.Context, id int) ([]jikan.RelationEntry, error) {
|
func (s *animeService) GetRelations(ctx context.Context, id int) ([]jikan.RelationEntry, error) {
|
||||||
@@ -328,15 +387,56 @@ func (s *animeService) GetEpisodes(ctx context.Context, id int, page int) (jikan
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetStaff(ctx context.Context, id int) ([]domain.StaffEntry, error) {
|
func (s *animeService) GetStaff(ctx context.Context, id int) ([]domain.StaffEntry, error) {
|
||||||
return s.jikan.GetAnimeStaff(ctx, id)
|
items, err := s.jikan.GetAnimeStaff(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make([]domain.StaffEntry, 0, len(items))
|
||||||
|
for _, it := range items {
|
||||||
|
var mapped domain.StaffEntry
|
||||||
|
mapped.Person.MalID = it.Person.MalID
|
||||||
|
mapped.Person.URL = it.Person.URL
|
||||||
|
mapped.Person.Name = it.Person.Name
|
||||||
|
mapped.Person.Images.Jpg.ImageURL = it.Person.Images.Jpg.ImageURL
|
||||||
|
mapped.Positions = append([]string(nil), it.Positions...)
|
||||||
|
out = append(out, mapped)
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetStatistics(ctx context.Context, id int) (domain.Statistics, error) {
|
func (s *animeService) GetStatistics(ctx context.Context, id int) (domain.Statistics, error) {
|
||||||
return s.jikan.GetAnimeStatistics(ctx, id)
|
stats, err := s.jikan.GetAnimeStatistics(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return domain.Statistics{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
out := domain.Statistics{
|
||||||
|
Watching: stats.Watching,
|
||||||
|
Completed: stats.Completed,
|
||||||
|
OnHold: stats.OnHold,
|
||||||
|
Dropped: stats.Dropped,
|
||||||
|
PlanToWatch: stats.PlanToWatch,
|
||||||
|
Total: stats.Total,
|
||||||
|
}
|
||||||
|
if len(stats.Scores) > 0 {
|
||||||
|
out.Scores = make([]domain.StatisticsScore, 0, len(stats.Scores))
|
||||||
|
for _, s := range stats.Scores {
|
||||||
|
out.Scores = append(out.Scores, domain.StatisticsScore{Score: s.Score, Votes: s.Votes, Percentage: s.Percentage})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetThemes(ctx context.Context, id int) (domain.ThemesData, error) {
|
func (s *animeService) GetThemes(ctx context.Context, id int) (domain.ThemesData, error) {
|
||||||
return s.jikan.GetAnimeThemes(ctx, id)
|
themes, err := s.jikan.GetAnimeThemes(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return domain.ThemesData{}, err
|
||||||
|
}
|
||||||
|
return domain.ThemesData{
|
||||||
|
Openings: append([]string(nil), themes.Openings...),
|
||||||
|
Endings: append([]string(nil), themes.Endings...),
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetReviews(ctx context.Context, id int, page int) ([]domain.ReviewEntry, bool, error) {
|
func (s *animeService) GetReviews(ctx context.Context, id int, page int) ([]domain.ReviewEntry, bool, error) {
|
||||||
@@ -344,7 +444,38 @@ func (s *animeService) GetReviews(ctx context.Context, id int, page int) ([]doma
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
return data, pag.HasNextPage, nil
|
out := make([]domain.ReviewEntry, 0, len(data))
|
||||||
|
for _, it := range data {
|
||||||
|
mapped := domain.ReviewEntry{
|
||||||
|
MalID: it.MalID,
|
||||||
|
URL: it.URL,
|
||||||
|
Type: it.Type,
|
||||||
|
Date: it.Date,
|
||||||
|
Review: it.Review,
|
||||||
|
Score: it.Score,
|
||||||
|
Tags: append([]string(nil), it.Tags...),
|
||||||
|
IsSpoiler: it.IsSpoiler,
|
||||||
|
IsPreliminary: it.IsPreliminary,
|
||||||
|
EpisodesSeen: it.EpisodesSeen,
|
||||||
|
Reactions: domain.ReviewReactions{
|
||||||
|
Overall: it.Reactions.Overall,
|
||||||
|
Nice: it.Reactions.Nice,
|
||||||
|
LoveIt: it.Reactions.LoveIt,
|
||||||
|
Funny: it.Reactions.Funny,
|
||||||
|
Confusing: it.Reactions.Confusing,
|
||||||
|
Informative: it.Reactions.Informative,
|
||||||
|
WellWritten: it.Reactions.WellWritten,
|
||||||
|
Creative: it.Reactions.Creative,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
mapped.User.URL = it.User.URL
|
||||||
|
mapped.User.Username = it.User.Username
|
||||||
|
mapped.User.Images.Jpg.ImageURL = it.User.Images.Jpg.ImageURL
|
||||||
|
mapped.User.Images.Webp.ImageURL = it.User.Images.Webp.ImageURL
|
||||||
|
out = append(out, mapped)
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, pag.HasNextPage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *animeService) GetRandomAnime(ctx context.Context) (domain.Anime, error) {
|
func (s *animeService) GetRandomAnime(ctx context.Context) (domain.Anime, error) {
|
||||||
|
|||||||
@@ -9,14 +9,126 @@ import (
|
|||||||
type Anime struct {
|
type Anime struct {
|
||||||
jikan.Anime
|
jikan.Anime
|
||||||
}
|
}
|
||||||
type TopAnimeResult = jikan.TopAnimeResult
|
|
||||||
type Genre = jikan.Genre
|
type Genre struct {
|
||||||
type Character = jikan.CharacterEntry
|
MalID int
|
||||||
type Recommendation = jikan.RecommendationEntry
|
Name string
|
||||||
type StaffEntry = jikan.StaffEntry
|
}
|
||||||
type Statistics = jikan.Statistics
|
|
||||||
type ThemesData = jikan.ThemesData
|
type CharacterPerson struct {
|
||||||
type ReviewEntry = jikan.ReviewEntry
|
MalID int
|
||||||
|
URL string
|
||||||
|
Name string
|
||||||
|
Images struct {
|
||||||
|
Jpg struct {
|
||||||
|
ImageURL string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type CharacterVoiceActor struct {
|
||||||
|
Person CharacterPerson
|
||||||
|
Language string
|
||||||
|
}
|
||||||
|
|
||||||
|
type CharacterEntry struct {
|
||||||
|
Character struct {
|
||||||
|
MalID int
|
||||||
|
URL string
|
||||||
|
Name string
|
||||||
|
Images struct {
|
||||||
|
Jpg struct {
|
||||||
|
ImageURL string
|
||||||
|
}
|
||||||
|
Webp struct {
|
||||||
|
ImageURL string
|
||||||
|
SmallImageURL string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Role string
|
||||||
|
VoiceActors []CharacterVoiceActor
|
||||||
|
}
|
||||||
|
|
||||||
|
type RecommendationEntry struct {
|
||||||
|
Entry struct {
|
||||||
|
MalID int
|
||||||
|
URL string
|
||||||
|
Title string
|
||||||
|
Images struct {
|
||||||
|
Webp struct {
|
||||||
|
LargeImageURL string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
URL string
|
||||||
|
Votes int
|
||||||
|
}
|
||||||
|
|
||||||
|
type StaffEntry struct {
|
||||||
|
Person CharacterPerson
|
||||||
|
Positions []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type StatisticsScore struct {
|
||||||
|
Score int
|
||||||
|
Votes int
|
||||||
|
Percentage float64
|
||||||
|
}
|
||||||
|
|
||||||
|
type Statistics struct {
|
||||||
|
Watching int
|
||||||
|
Completed int
|
||||||
|
OnHold int
|
||||||
|
Dropped int
|
||||||
|
PlanToWatch int
|
||||||
|
Total int
|
||||||
|
Scores []StatisticsScore
|
||||||
|
}
|
||||||
|
|
||||||
|
type ThemesData struct {
|
||||||
|
Openings []string
|
||||||
|
Endings []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReviewReactions struct {
|
||||||
|
Overall int
|
||||||
|
Nice int
|
||||||
|
LoveIt int
|
||||||
|
Funny int
|
||||||
|
Confusing int
|
||||||
|
Informative int
|
||||||
|
WellWritten int
|
||||||
|
Creative int
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReviewUser struct {
|
||||||
|
URL string
|
||||||
|
Username string
|
||||||
|
Images struct {
|
||||||
|
Jpg struct {
|
||||||
|
ImageURL string
|
||||||
|
}
|
||||||
|
Webp struct {
|
||||||
|
ImageURL string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReviewEntry struct {
|
||||||
|
MalID int
|
||||||
|
URL string
|
||||||
|
Type string
|
||||||
|
Reactions ReviewReactions
|
||||||
|
Date string
|
||||||
|
Review string
|
||||||
|
Score int
|
||||||
|
Tags []string
|
||||||
|
IsSpoiler bool
|
||||||
|
IsPreliminary bool
|
||||||
|
EpisodesSeen int
|
||||||
|
User ReviewUser
|
||||||
|
}
|
||||||
|
|
||||||
type AnimeCatalogService interface {
|
type AnimeCatalogService interface {
|
||||||
GetCatalogSection(ctx context.Context, userID string, section string) (CatalogSectionData, error)
|
GetCatalogSection(ctx context.Context, userID string, section string) (CatalogSectionData, error)
|
||||||
@@ -37,8 +149,8 @@ type AnimeSearchService interface {
|
|||||||
|
|
||||||
type AnimeDetailsService interface {
|
type AnimeDetailsService interface {
|
||||||
GetAnimeByID(ctx context.Context, id int) (Anime, error)
|
GetAnimeByID(ctx context.Context, id int) (Anime, error)
|
||||||
GetCharacters(ctx context.Context, id int) ([]Character, error)
|
GetCharacters(ctx context.Context, id int) ([]CharacterEntry, error)
|
||||||
GetRecommendations(ctx context.Context, id int) ([]Recommendation, error)
|
GetRecommendations(ctx context.Context, id int) ([]RecommendationEntry, error)
|
||||||
GetRelations(ctx context.Context, id int) ([]jikan.RelationEntry, error)
|
GetRelations(ctx context.Context, id int) ([]jikan.RelationEntry, error)
|
||||||
GetEpisodes(ctx context.Context, id int, page int) (jikan.EpisodesResponse, error)
|
GetEpisodes(ctx context.Context, id int, page int) (jikan.EpisodesResponse, error)
|
||||||
GetAllEpisodes(ctx context.Context, id int) ([]EpisodeData, error)
|
GetAllEpisodes(ctx context.Context, id int) ([]EpisodeData, error)
|
||||||
|
|||||||
Reference in New Issue
Block a user