diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-01-11 18:09:51 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2025-01-11 18:09:51 +0000 |
| commit | 10506173cd5309e7c63d83055243abc67cecad4f (patch) | |
| tree | f37f7dd704c63e34a1e5b0bffdda442b03179d9c /apps/web/app/api/v1 | |
| parent | 107d923b3abd60329463957ca4604107b3427b2c (diff) | |
| download | karakeep-10506173cd5309e7c63d83055243abc67cecad4f.tar.zst | |
feat: Add support for singlefile extension uploads. #172
Diffstat (limited to 'apps/web/app/api/v1')
| -rw-r--r-- | apps/web/app/api/v1/bookmarks/singlefile/route.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/apps/web/app/api/v1/bookmarks/singlefile/route.ts b/apps/web/app/api/v1/bookmarks/singlefile/route.ts new file mode 100644 index 00000000..3f8ac2f7 --- /dev/null +++ b/apps/web/app/api/v1/bookmarks/singlefile/route.ts @@ -0,0 +1,54 @@ +import { createContextFromRequest } from "@/server/api/client"; +import { TRPCError } from "@trpc/server"; + +import serverConfig from "@hoarder/shared/config"; +import { BookmarkTypes } from "@hoarder/shared/types/bookmarks"; +import { createCallerFactory } from "@hoarder/trpc"; +import { appRouter } from "@hoarder/trpc/routers/_app"; + +import { uploadFromPostData } from "../../../assets/route"; + +export const dynamic = "force-dynamic"; + +export async function POST(req: Request) { + const ctx = await createContextFromRequest(req); + if (!ctx.user) { + return Response.json({ error: "Unauthorized" }, { status: 401 }); + } + if (serverConfig.demoMode) { + throw new TRPCError({ + message: "Mutations are not allowed in demo mode", + code: "FORBIDDEN", + }); + } + const formData = await req.formData(); + const up = await uploadFromPostData(ctx.user, ctx.db, formData); + + if ("error" in up) { + return Response.json({ error: up.error }, { status: up.status }); + } + + const url = formData.get("url"); + if (!url) { + throw new TRPCError({ + message: "URL is required", + code: "BAD_REQUEST", + }); + } + if (typeof url !== "string") { + throw new TRPCError({ + message: "URL must be a string", + code: "BAD_REQUEST", + }); + } + + const createCaller = createCallerFactory(appRouter); + const api = createCaller(ctx); + + const bookmark = await api.bookmarks.createBookmark({ + type: BookmarkTypes.LINK, + url, + precrawledArchiveId: up.assetId, + }); + return Response.json(bookmark, { status: 201 }); +} |
