import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; import { fetchFromMultipleSources } from "~/libs/fetchFromMultipleSources"; import { PaginatedResponseSchema } from "~/types/schema"; import { HomeTitle } from "~/types/title/homeTitle"; import { fetchSearchResultsFromAnilist } from "./anilist"; const app = new OpenAPIHono(); const route = createRoute({ tags: ["aniplay", "title"], operationId: "search", summary: "Search for a title", method: "get", path: "/", request: { query: z.object({ query: z.string(), page: z.number({ coerce: true }).int().min(1).default(1), limit: z.number({ coerce: true }).int().default(10), }), }, responses: { 200: { content: { "application/json": { schema: PaginatedResponseSchema(HomeTitle), }, }, description: "Returns a list of paginated results for the query", }, }, }); app.openapi(route, async (c) => { const query = c.req.query("query") ?? ""; const page = Number(c.req.query("page") ?? 1); const limit = Number(c.req.query("limit") ?? 10); // Check if we should use mock data const { useMockData } = await import("~/libs/useMockData"); if (useMockData()) { const { mockSearchResults } = await import("~/mocks"); // Paginate mock results const startIndex = (page - 1) * limit; const endIndex = startIndex + limit; const paginatedResults = mockSearchResults.slice(startIndex, endIndex); const hasNextPage = endIndex < mockSearchResults.length; return c.json( { success: true, results: paginatedResults, hasNextPage, }, 200, ); } const { result: response, errorOccurred } = await fetchFromMultipleSources([ () => fetchSearchResultsFromAnilist(query, page, limit), ]); if (!response) { return c.json({ success: !errorOccurred, results: [], hasNextPage: false, }); } return c.json( { success: true, results: response.results, hasNextPage: response.hasNextPage ?? false, }, 200, ); }); export default app;