aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/app/api/v1
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-01-11 18:09:51 +0000
committerMohamed Bassem <me@mbassem.com>2025-01-11 18:09:51 +0000
commit10506173cd5309e7c63d83055243abc67cecad4f (patch)
treef37f7dd704c63e34a1e5b0bffdda442b03179d9c /apps/web/app/api/v1
parent107d923b3abd60329463957ca4604107b3427b2c (diff)
downloadkarakeep-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.ts54
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 });
+}