diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-01-05 12:01:42 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2025-01-05 12:01:42 +0000 |
| commit | 1f5d5668b7558ec4d0a77129041cba3ba6d72cb7 (patch) | |
| tree | 547276fbc89d5337c2f32ff6bcb37abe05f5c5dc /apps/web/app/api | |
| parent | ce16eda75f4d93646e485b7115398e81e7c88acc (diff) | |
| download | karakeep-1f5d5668b7558ec4d0a77129041cba3ba6d72cb7.tar.zst | |
feat: Expose the search functionality in the REST API
Diffstat (limited to 'apps/web/app/api')
| -rw-r--r-- | apps/web/app/api/v1/bookmarks/search/route.ts | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/apps/web/app/api/v1/bookmarks/search/route.ts b/apps/web/app/api/v1/bookmarks/search/route.ts new file mode 100644 index 00000000..f0c5417a --- /dev/null +++ b/apps/web/app/api/v1/bookmarks/search/route.ts @@ -0,0 +1,39 @@ +import { NextRequest } from "next/server"; +import { z } from "zod"; + +import { buildHandler } from "../../utils/handler"; + +export const dynamic = "force-dynamic"; + +export const GET = (req: NextRequest) => + buildHandler({ + req, + searchParamsSchema: z.object({ + q: z.string(), + limit: z.coerce.number().optional(), + cursor: z + .string() + // Search cursor V1 is just a number + .pipe(z.coerce.number()) + .transform((val) => { + return { ver: 1 as const, offset: val }; + }) + .optional(), + }), + handler: async ({ api, searchParams }) => { + const bookmarks = await api.bookmarks.searchBookmarks({ + text: searchParams.q, + cursor: searchParams.cursor, + limit: searchParams.limit, + }); + return { + status: 200, + resp: { + bookmarks: bookmarks.bookmarks, + nextCursor: bookmarks.nextCursor + ? `${bookmarks.nextCursor.offset}` + : null, + }, + }; + }, + }); |
