diff options
| author | Mohamed Bassem <me@mbassem.com> | 2024-12-27 19:21:43 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2024-12-27 19:34:04 +0000 |
| commit | 3f56389f55ef116f8cea17c15c684798fb942290 (patch) | |
| tree | 1a398accbcfc75674c5cc4970bc85fd27c637911 /apps | |
| parent | 86d74e3f32dd5bccc8df195b55391e206df9a1c4 (diff) | |
| download | karakeep-3f56389f55ef116f8cea17c15c684798fb942290.tar.zst | |
feat: Add REST APIs for manipulating highlights. Fixes #620
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/web/app/api/v1/bookmarks/[bookmarkId]/highlights/route.ts | 18 | ||||
| -rw-r--r-- | apps/web/app/api/v1/highlights/[highlightId]/route.ts | 50 | ||||
| -rw-r--r-- | apps/web/app/api/v1/highlights/route.ts | 30 | ||||
| -rw-r--r-- | apps/web/app/api/v1/utils/pagination.ts | 6 |
4 files changed, 100 insertions, 4 deletions
diff --git a/apps/web/app/api/v1/bookmarks/[bookmarkId]/highlights/route.ts b/apps/web/app/api/v1/bookmarks/[bookmarkId]/highlights/route.ts new file mode 100644 index 00000000..4e1f87a0 --- /dev/null +++ b/apps/web/app/api/v1/bookmarks/[bookmarkId]/highlights/route.ts @@ -0,0 +1,18 @@ +import { NextRequest } from "next/server"; +import { buildHandler } from "@/app/api/v1/utils/handler"; + +export const dynamic = "force-dynamic"; + +export const GET = ( + req: NextRequest, + params: { params: { bookmarkId: string } }, +) => + buildHandler({ + req, + handler: async ({ api }) => { + const resp = await api.highlights.getForBookmark({ + bookmarkId: params.params.bookmarkId, + }); + return { status: 200, resp }; + }, + }); diff --git a/apps/web/app/api/v1/highlights/[highlightId]/route.ts b/apps/web/app/api/v1/highlights/[highlightId]/route.ts new file mode 100644 index 00000000..aa92e7ce --- /dev/null +++ b/apps/web/app/api/v1/highlights/[highlightId]/route.ts @@ -0,0 +1,50 @@ +import { NextRequest } from "next/server"; +import { buildHandler } from "@/app/api/v1/utils/handler"; + +import { zUpdateHighlightSchema } from "@hoarder/shared/types/highlights"; + +export const dynamic = "force-dynamic"; + +export const GET = ( + req: NextRequest, + { params }: { params: { highlightId: string } }, +) => + buildHandler({ + req, + handler: async ({ api }) => { + const highlight = await api.highlights.get({ + highlightId: params.highlightId, + }); + return { status: 200, resp: highlight }; + }, + }); + +export const PATCH = ( + req: NextRequest, + { params }: { params: { highlightId: string } }, +) => + buildHandler({ + req, + bodySchema: zUpdateHighlightSchema.omit({ highlightId: true }), + handler: async ({ api, body }) => { + const highlight = await api.highlights.update({ + highlightId: params.highlightId, + ...body!, + }); + return { status: 200, resp: highlight }; + }, + }); + +export const DELETE = ( + req: NextRequest, + { params }: { params: { highlightId: string } }, +) => + buildHandler({ + req, + handler: async ({ api }) => { + const highlight = await api.highlights.delete({ + highlightId: params.highlightId, + }); + return { status: 200, resp: highlight }; + }, + }); diff --git a/apps/web/app/api/v1/highlights/route.ts b/apps/web/app/api/v1/highlights/route.ts new file mode 100644 index 00000000..ebb96bae --- /dev/null +++ b/apps/web/app/api/v1/highlights/route.ts @@ -0,0 +1,30 @@ +import { NextRequest } from "next/server"; +import { buildHandler } from "@/app/api/v1/utils/handler"; + +import { zNewHighlightSchema } from "@hoarder/shared/types/highlights"; + +import { adaptPagination, zPagination } from "../utils/pagination"; + +export const dynamic = "force-dynamic"; + +export const GET = (req: NextRequest) => + buildHandler({ + req, + searchParamsSchema: zPagination, + handler: async ({ api, searchParams }) => { + const resp = await api.highlights.getAll({ + ...searchParams, + }); + return { status: 200, resp: adaptPagination(resp) }; + }, + }); + +export const POST = (req: NextRequest) => + buildHandler({ + req, + bodySchema: zNewHighlightSchema, + handler: async ({ body, api }) => { + const resp = await api.highlights.create(body!); + return { status: 200, resp }; + }, + }); diff --git a/apps/web/app/api/v1/utils/pagination.ts b/apps/web/app/api/v1/utils/pagination.ts index 5ce9ac8f..1b438217 100644 --- a/apps/web/app/api/v1/utils/pagination.ts +++ b/apps/web/app/api/v1/utils/pagination.ts @@ -1,9 +1,7 @@ import { z } from "zod"; -import { - MAX_NUM_BOOKMARKS_PER_PAGE, - zCursorV2, -} from "@hoarder/shared/types/bookmarks"; +import { MAX_NUM_BOOKMARKS_PER_PAGE } from "@hoarder/shared/types/bookmarks"; +import { zCursorV2 } from "@hoarder/shared/types/pagination"; export const zPagination = z.object({ limit: z.coerce.number().max(MAX_NUM_BOOKMARKS_PER_PAGE).optional(), |
