aboutsummaryrefslogtreecommitdiffstats
path: root/packages/api
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-06-01 20:53:12 +0000
committerMohamed Bassem <me@mbassem.com>2025-06-01 20:53:12 +0000
commite59be245d5e3005b5b5dadf78ad7115cc800c663 (patch)
tree67e973a0d2c54cc3c5c64829d811999c219b6fca /packages/api
parentea1d0023bfee55358ebb1a96f3d06e783a219c0d (diff)
downloadkarakeep-e59be245d5e3005b5b5dadf78ad7115cc800c663.tar.zst
feat: Allow specifying the overwrite mode for singlefile archives. Fixes #1125
Diffstat (limited to 'packages/api')
-rw-r--r--packages/api/routes/bookmarks.ts69
1 files changed, 68 insertions, 1 deletions
diff --git a/packages/api/routes/bookmarks.ts b/packages/api/routes/bookmarks.ts
index fbc46d2f..abf0daae 100644
--- a/packages/api/routes/bookmarks.ts
+++ b/packages/api/routes/bookmarks.ts
@@ -90,6 +90,21 @@ const app = new Hono()
.post(
"/singlefile",
zValidator(
+ "query",
+ z.object({
+ ifexists: z
+ .enum([
+ "skip",
+ "overwrite",
+ "overwrite-recrawl",
+ "append",
+ "append-recrawl",
+ ])
+ .optional()
+ .default("skip"),
+ }),
+ ),
+ zValidator(
"form",
z.object({
url: z.string(),
@@ -107,7 +122,59 @@ const app = new Hono()
url: form.url,
precrawledArchiveId: up.assetId,
});
- return c.json(bookmark, 201);
+ if (bookmark.alreadyExists) {
+ const ifexists = c.req.valid("query").ifexists;
+ switch (ifexists) {
+ case "skip":
+ break;
+ case "overwrite-recrawl":
+ case "overwrite": {
+ const existingPrecrawledArchiveId = bookmark.assets
+ .filter((a) => a.assetType == "precrawledArchive")
+ .at(-1)?.id;
+ if (existingPrecrawledArchiveId) {
+ await c.var.api.assets.replaceAsset({
+ bookmarkId: bookmark.id,
+ oldAssetId: existingPrecrawledArchiveId,
+ newAssetId: up.assetId,
+ });
+ } else {
+ await c.var.api.assets.attachAsset({
+ bookmarkId: bookmark.id,
+ asset: {
+ id: up.assetId,
+ assetType: "precrawledArchive",
+ },
+ });
+ }
+ if (ifexists == "overwrite-recrawl") {
+ await c.var.api.bookmarks.recrawlBookmark({
+ bookmarkId: bookmark.id,
+ });
+ }
+ break;
+ }
+ case "append-recrawl":
+ case "append": {
+ await c.var.api.assets.attachAsset({
+ bookmarkId: bookmark.id,
+ asset: {
+ id: up.assetId,
+ assetType: "precrawledArchive",
+ },
+ });
+ if (ifexists == "append-recrawl") {
+ await c.var.api.bookmarks.recrawlBookmark({
+ bookmarkId: bookmark.id,
+ });
+ }
+ break;
+ }
+ }
+ return c.json(bookmark, 200);
+ } else {
+ return c.json(bookmark, 201);
+ }
},
)