aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-12-08 10:47:13 +0000
committerMohamed Bassem <me@mbassem.com>2025-12-08 10:47:13 +0000
commit6886385ce239f63271639f047093ba307c87f2e6 (patch)
treec76c548fb8c357615951b98f0171ec734248036d
parent20d3761c89d566cf28ef1a22db14ad4f6eef2f17 (diff)
downloadkarakeep-6886385ce239f63271639f047093ba307c87f2e6.tar.zst
fix: fix correctly accounting for text bookmark in import sessions. #2208
-rw-r--r--packages/trpc/models/importSessions.ts44
-rw-r--r--packages/trpc/routers/importSessions.test.ts30
2 files changed, 58 insertions, 16 deletions
diff --git a/packages/trpc/models/importSessions.ts b/packages/trpc/models/importSessions.ts
index 56bcaf9a..c324cf7f 100644
--- a/packages/trpc/models/importSessions.ts
+++ b/packages/trpc/models/importSessions.ts
@@ -123,22 +123,34 @@ export class ImportSession {
};
statusCounts.forEach((statusCount) => {
- stats.totalBookmarks += statusCount.count;
- if (
- statusCount.crawlStatus === "success" &&
- statusCount.taggingStatus === "success"
- ) {
- stats.completedBookmarks += statusCount.count;
- } else if (
- statusCount.crawlStatus === "failure" ||
- statusCount.taggingStatus === "failure"
- ) {
- stats.failedBookmarks += statusCount.count;
- } else if (
- statusCount.crawlStatus === "pending" ||
- statusCount.taggingStatus === "pending"
- ) {
- stats.pendingBookmarks += statusCount.count;
+ const { crawlStatus, taggingStatus, count } = statusCount;
+
+ stats.totalBookmarks += count;
+
+ const isCrawlFailure = crawlStatus === "failure";
+ const isTagFailure = taggingStatus === "failure";
+ if (isCrawlFailure || isTagFailure) {
+ stats.failedBookmarks += count;
+ return;
+ }
+
+ const isCrawlPending = crawlStatus === "pending";
+ const isTagPending = taggingStatus === "pending";
+ if (isCrawlPending || isTagPending) {
+ stats.pendingBookmarks += count;
+ return;
+ }
+
+ const isCrawlSuccessfulOrNotRequired =
+ crawlStatus === "success" || crawlStatus === null;
+ const isTagSuccessfulOrUnknown =
+ taggingStatus === "success" || taggingStatus === null;
+
+ if (isCrawlSuccessfulOrNotRequired && isTagSuccessfulOrUnknown) {
+ stats.completedBookmarks += count;
+ } else {
+ // Fallback to pending to avoid leaving imports unclassified
+ stats.pendingBookmarks += count;
}
});
diff --git a/packages/trpc/routers/importSessions.test.ts b/packages/trpc/routers/importSessions.test.ts
index b28d1421..9ef0de6f 100644
--- a/packages/trpc/routers/importSessions.test.ts
+++ b/packages/trpc/routers/importSessions.test.ts
@@ -1,6 +1,8 @@
+import { eq } from "drizzle-orm";
import { beforeEach, describe, expect, test } from "vitest";
import { z } from "zod";
+import { bookmarks } from "@karakeep/db/schema";
import {
BookmarkTypes,
zNewBookmarkRequestSchema,
@@ -117,6 +119,34 @@ describe("ImportSessions Routes", () => {
});
});
+ test<CustomTestContext>("marks text-only imports as completed when tagging succeeds", async ({
+ apiCallers,
+ db,
+ }) => {
+ const api = apiCallers[0];
+ const session = await api.importSessions.createImportSession({
+ name: "Text Import Session",
+ });
+ const bookmarkId = await createTestBookmark(api, session.id);
+
+ await db
+ .update(bookmarks)
+ .set({ taggingStatus: "success" })
+ .where(eq(bookmarks.id, bookmarkId));
+
+ const stats = await api.importSessions.getImportSessionStats({
+ importSessionId: session.id,
+ });
+
+ expect(stats).toMatchObject({
+ completedBookmarks: 1,
+ pendingBookmarks: 0,
+ failedBookmarks: 0,
+ totalBookmarks: 1,
+ status: "completed",
+ });
+ });
+
test<CustomTestContext>("list import sessions returns all sessions", async ({
apiCallers,
}) => {