diff --git a/internal/anime/repository.go b/internal/anime/repository.go index 62f9f7c9..e2cb5a5a 100644 --- a/internal/anime/repository.go +++ b/internal/anime/repository.go @@ -25,3 +25,10 @@ func (r *animeRepository) GetWatchListEntry(ctx context.Context, params db.GetWa func (r *animeRepository) GetContinueWatchingEntries(ctx context.Context, userID string) ([]db.GetContinueWatchingEntriesRow, error) { return r.queries.GetContinueWatchingEntries(ctx, userID) } + +func (r *animeRepository) GetContinueWatchingCarouselEntries(ctx context.Context, userID string, limit int64) ([]db.GetContinueWatchingEntriesRow, error) { + return r.queries.GetContinueWatchingCarouselEntries(ctx, db.GetContinueWatchingCarouselEntriesParams{ + UserID: userID, + Limit: limit, + }) +} diff --git a/internal/anime/service.go b/internal/anime/service.go index 96ddcf92..c52aa55e 100644 --- a/internal/anime/service.go +++ b/internal/anime/service.go @@ -19,6 +19,8 @@ type animeService struct { repo domain.AnimeRepository } +const continueWatchingCarouselLimit int64 = 24 + func wrapAnimes(in []jikan.Anime) []domain.Anime { out := make([]domain.Anime, 0, len(in)) for _, a := range in { @@ -56,7 +58,7 @@ func (s *animeService) GetCatalogSection(ctx context.Context, userID string, sec if userID != "" && section == "Continue" { g.Go(func() error { var err error - cw, err = s.repo.GetContinueWatchingEntries(gCtx, userID) + cw, err = s.repo.GetContinueWatchingCarouselEntries(gCtx, userID, continueWatchingCarouselLimit) if err != nil { return fmt.Errorf("get continue watching entries for %q: %w", userID, err) } diff --git a/internal/anime/service_test.go b/internal/anime/service_test.go new file mode 100644 index 00000000..cc8f003e --- /dev/null +++ b/internal/anime/service_test.go @@ -0,0 +1,55 @@ +package anime + +import ( + "context" + "mal/internal/db" + "testing" +) + +type catalogRepoStub struct { + allContinueRows []db.GetContinueWatchingEntriesRow + carouselContinueRows []db.GetContinueWatchingEntriesRow + carouselLimit int64 +} + +func (r *catalogRepoStub) GetUserWatchList(ctx context.Context, userID string) ([]db.GetUserWatchListRow, error) { + return nil, nil +} + +func (r *catalogRepoStub) GetWatchListEntry(ctx context.Context, params db.GetWatchListEntryParams) (db.WatchListEntry, error) { + return db.WatchListEntry{}, nil +} + +func (r *catalogRepoStub) GetContinueWatchingEntries(ctx context.Context, userID string) ([]db.GetContinueWatchingEntriesRow, error) { + return r.allContinueRows, nil +} + +func (r *catalogRepoStub) GetContinueWatchingCarouselEntries(ctx context.Context, userID string, limit int64) ([]db.GetContinueWatchingEntriesRow, error) { + r.carouselLimit = limit + return r.carouselContinueRows, nil +} + +func TestGetCatalogSectionLimitsContinueWatchingCarousel(t *testing.T) { + repo := &catalogRepoStub{ + allContinueRows: make([]db.GetContinueWatchingEntriesRow, 30), + carouselContinueRows: []db.GetContinueWatchingEntriesRow{ + {AnimeID: 30}, + {AnimeID: 29}, + }, + } + svc := NewAnimeService(nil, repo) + + got, err := svc.GetCatalogSection(context.Background(), "user-1", "Continue") + if err != nil { + t.Fatalf("GetCatalogSection: %v", err) + } + if repo.carouselLimit != continueWatchingCarouselLimit { + t.Fatalf("carousel limit = %d, want %d", repo.carouselLimit, continueWatchingCarouselLimit) + } + if len(got.ContinueWatching) != len(repo.carouselContinueRows) { + t.Fatalf("len(ContinueWatching) = %d, want %d", len(got.ContinueWatching), len(repo.carouselContinueRows)) + } + if got.ContinueWatching[0].AnimeID != 30 || got.ContinueWatching[1].AnimeID != 29 { + t.Fatalf("ContinueWatching = %+v, want anime IDs [30 29]", got.ContinueWatching) + } +} diff --git a/internal/domain/anime.go b/internal/domain/anime.go index 500d6f4e..d1a69c14 100644 --- a/internal/domain/anime.go +++ b/internal/domain/anime.go @@ -179,4 +179,5 @@ type AnimeRepository interface { GetUserWatchList(ctx context.Context, userID string) ([]db.GetUserWatchListRow, error) GetWatchListEntry(ctx context.Context, params db.GetWatchListEntryParams) (db.WatchListEntry, error) GetContinueWatchingEntries(ctx context.Context, userID string) ([]db.GetContinueWatchingEntriesRow, error) + GetContinueWatchingCarouselEntries(ctx context.Context, userID string, limit int64) ([]db.GetContinueWatchingEntriesRow, error) }