From 6886385ce239f63271639f047093ba307c87f2e6 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Mon, 8 Dec 2025 10:47:13 +0000 Subject: fix: fix correctly accounting for text bookmark in import sessions. #2208 --- packages/trpc/models/importSessions.ts | 44 ++++++++++++++++++---------- packages/trpc/routers/importSessions.test.ts | 30 +++++++++++++++++++ 2 files changed, 58 insertions(+), 16 deletions(-) (limited to 'packages') 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("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("list import sessions returns all sessions", async ({ apiCallers, }) => { -- cgit v1.2.3-70-g09d2