diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-12-08 10:47:13 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2025-12-08 10:47:13 +0000 |
| commit | 6886385ce239f63271639f047093ba307c87f2e6 (patch) | |
| tree | c76c548fb8c357615951b98f0171ec734248036d | |
| parent | 20d3761c89d566cf28ef1a22db14ad4f6eef2f17 (diff) | |
| download | karakeep-6886385ce239f63271639f047093ba307c87f2e6.tar.zst | |
fix: fix correctly accounting for text bookmark in import sessions. #2208
| -rw-r--r-- | packages/trpc/models/importSessions.ts | 44 | ||||
| -rw-r--r-- | packages/trpc/routers/importSessions.test.ts | 30 |
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, }) => { |
