aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/app/api
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/app/api')
-rw-r--r--apps/web/app/api/bookmarks/export/route.tsx56
1 files changed, 41 insertions, 15 deletions
diff --git a/apps/web/app/api/bookmarks/export/route.tsx b/apps/web/app/api/bookmarks/export/route.tsx
index e550fcb5..f568b9f7 100644
--- a/apps/web/app/api/bookmarks/export/route.tsx
+++ b/apps/web/app/api/bookmarks/export/route.tsx
@@ -1,15 +1,23 @@
-import { toExportFormat, zExportSchema } from "@/lib/exportBookmarks";
+import { NextRequest } from "next/server";
+import {
+ toExportFormat,
+ toNetscapeFormat,
+ zExportSchema,
+} from "@/lib/exportBookmarks";
import { api, createContextFromRequest } from "@/server/api/client";
import { z } from "zod";
import { MAX_NUM_BOOKMARKS_PER_PAGE } from "@karakeep/shared/types/bookmarks";
export const dynamic = "force-dynamic";
-export async function GET(request: Request) {
+export async function GET(request: NextRequest) {
const ctx = await createContextFromRequest(request);
if (!ctx.user) {
return Response.json({ error: "Unauthorized" }, { status: 401 });
}
+
+ const format = request.nextUrl.searchParams.get("format") ?? "json";
+
const req = {
limit: MAX_NUM_BOOKMARKS_PER_PAGE,
useCursorV2: true,
@@ -17,25 +25,43 @@ export async function GET(request: Request) {
};
let resp = await api.bookmarks.getBookmarks(req);
- let results = resp.bookmarks.map(toExportFormat);
+ let bookmarks = resp.bookmarks;
while (resp.nextCursor) {
resp = await api.bookmarks.getBookmarks({
- ...request,
+ ...req,
cursor: resp.nextCursor,
});
- results = [...results, ...resp.bookmarks.map(toExportFormat)];
+ bookmarks = [...bookmarks, ...resp.bookmarks];
}
- const exportData: z.infer<typeof zExportSchema> = {
- bookmarks: results.filter((b) => b.content !== null),
- };
+ if (format === "json") {
+ // Default JSON format
+ const exportData: z.infer<typeof zExportSchema> = {
+ bookmarks: bookmarks
+ .map(toExportFormat)
+ .filter((b) => b.content !== null),
+ };
- return new Response(JSON.stringify(exportData), {
- status: 200,
- headers: {
- "Content-type": "application/json",
- "Content-disposition": `attachment; filename="karakeep-export-${new Date().toISOString()}.json"`,
- },
- });
+ return new Response(JSON.stringify(exportData), {
+ status: 200,
+ headers: {
+ "Content-type": "application/json",
+ "Content-disposition": `attachment; filename="hoarder-export-${new Date().toISOString()}.json"`,
+ },
+ });
+ } else if (format === "netscape") {
+ // Netscape format
+ const netscapeContent = toNetscapeFormat(bookmarks);
+
+ return new Response(netscapeContent, {
+ status: 200,
+ headers: {
+ "Content-type": "text/html",
+ "Content-disposition": `attachment; filename="bookmarks-${new Date().toISOString()}.html"`,
+ },
+ });
+ } else {
+ return Response.json({ error: "Invalid format" }, { status: 400 });
+ }
}