import { Router } from "@oak/oak"; import { parseOptionalAuth } from "../lib/auth.ts"; import { parsePagination } from "../lib/pagination.ts"; import { searchDumps } from "../services/dump-service.ts"; import { searchUsersGlobal } from "../services/user-service.ts"; import { searchPlaylists } from "../services/playlist-service.ts"; import type { APIResponse, SearchResults } from "../model/interfaces.ts"; const router = new Router({ prefix: "/api/search" }); router.get("/", async (ctx) => { const params = ctx.request.url.searchParams; const q = (params.get("q") ?? "").trim(); const { page, limit } = parsePagination(params); const requestingUserId = (await parseOptionalAuth(ctx)) ?? undefined; if (!q) { const responseBody: APIResponse = { success: true, data: { dumps: { items: [], total: 0, hasMore: false }, users: [], playlists: [], }, }; ctx.response.body = responseBody; return; } const { items: dumpItems, total: dumpTotal } = searchDumps( q, page, limit, requestingUserId, ); const users = searchUsersGlobal(q, 20); const playlists = searchPlaylists(q, 20, requestingUserId); const responseBody: APIResponse = { success: true, data: { dumps: { items: dumpItems, total: dumpTotal, hasMore: page * limit < dumpTotal, }, users, playlists, }, }; ctx.response.body = responseBody; }); export default router;