aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/app
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-01-05 12:01:42 +0000
committerMohamed Bassem <me@mbassem.com>2025-01-05 12:01:42 +0000
commit1f5d5668b7558ec4d0a77129041cba3ba6d72cb7 (patch)
tree547276fbc89d5337c2f32ff6bcb37abe05f5c5dc /apps/web/app
parentce16eda75f4d93646e485b7115398e81e7c88acc (diff)
downloadkarakeep-1f5d5668b7558ec4d0a77129041cba3ba6d72cb7.tar.zst
feat: Expose the search functionality in the REST API
Diffstat (limited to 'apps/web/app')
-rw-r--r--apps/web/app/api/v1/bookmarks/search/route.ts39
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,
+ },
+ };
+ },
+ });