aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2024-12-27 19:21:43 +0000
committerMohamed Bassem <me@mbassem.com>2024-12-27 19:34:04 +0000
commit3f56389f55ef116f8cea17c15c684798fb942290 (patch)
tree1a398accbcfc75674c5cc4970bc85fd27c637911 /apps
parent86d74e3f32dd5bccc8df195b55391e206df9a1c4 (diff)
downloadkarakeep-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.ts18
-rw-r--r--apps/web/app/api/v1/highlights/[highlightId]/route.ts50
-rw-r--r--apps/web/app/api/v1/highlights/route.ts30
-rw-r--r--apps/web/app/api/v1/utils/pagination.ts6
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(),