diff --git a/src/controllers/popular/category/anilist.ts b/src/controllers/popular/category/anilist.ts index 60dbcdb..7ada0df 100644 --- a/src/controllers/popular/category/anilist.ts +++ b/src/controllers/popular/category/anilist.ts @@ -14,6 +14,9 @@ const TrendingQuery = graphql( media(sort: TRENDING_DESC, type: ANIME, isAdult: false) { ...HomeTitle } + pageInfo { + hasNextPage + } } } `, @@ -38,6 +41,9 @@ const PopularQuery = graphql( ) { ...HomeTitle } + pageInfo { + hasNextPage + } } } `, @@ -62,6 +68,9 @@ const UpcomingQuery = graphql( ) { ...HomeTitle } + pageInfo { + hasNextPage + } } } `, @@ -78,9 +87,10 @@ export function fetchPopularTitlesFromAnilist( const { current, next } = getCurrentAndNextSeason(); switch (category) { case "trending": - return client - .request(TrendingQuery, { limit, page }) - .then((data) => data?.trending?.media?.map((title) => mapTitle(title))); + return client.request(TrendingQuery, { limit, page }).then((data) => ({ + results: data?.trending?.media?.map((title) => mapTitle(title)), + hasNextPage: data?.trending?.pageInfo?.hasNextPage, + })); case "popular": return client .request(PopularQuery, { @@ -89,7 +99,10 @@ export function fetchPopularTitlesFromAnilist( season: current.season, seasonYear: current.year, }) - .then((data) => data?.Page?.media?.map((title) => mapTitle(title))); + .then((data) => ({ + results: data?.Page?.media?.map((title) => mapTitle(title)), + hasNextPage: data?.Page?.pageInfo?.hasNextPage, + })); case "upcoming": return client .request(UpcomingQuery, { @@ -98,7 +111,10 @@ export function fetchPopularTitlesFromAnilist( nextSeason: next.season, nextSeasonYear: next.year, }) - .then((data) => data?.Page?.media?.map((title) => mapTitle(title))); + .then((data) => ({ + results: data?.Page?.media?.map((title) => mapTitle(title)), + hasNextPage: data?.Page?.pageInfo?.hasNextPage, + })); default: throw new Error(`Unknown category: ${category}`); } diff --git a/src/controllers/popular/category/index.ts b/src/controllers/popular/category/index.ts index e0d06b6..b8b449a 100644 --- a/src/controllers/popular/category/index.ts +++ b/src/controllers/popular/category/index.ts @@ -1,12 +1,16 @@ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; -import { ErrorResponse, SuccessResponseSchema } from "~/types/schema"; +import { + ErrorResponse, + PaginatedResponseSchema, + SuccessResponseSchema, +} from "~/types/schema"; import { HomeTitle } from "~/types/title/homeTitle"; import { fetchPopularTitlesFromAnilist } from "./anilist"; import { PopularCategory } from "./enum"; -const BrowsePopularResponse = SuccessResponseSchema(z.array(HomeTitle)); +const BrowsePopularResponse = PaginatedResponseSchema(HomeTitle); const app = new OpenAPIHono(); @@ -53,7 +57,11 @@ app.openapi(route, async (c) => { return c.json(ErrorResponse, { status: 500 }); } - return c.json({ success: true, result: response }); + return c.json({ + success: true, + results: response.results, + hasNextPage: response.hasNextPage ?? false, + }); }); export default app;