From 887630365ff0531a0556cb71a6b1be0956c41d06 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 12 Jan 2026 08:57:51 +0000 Subject: feat(deck): show due card count on deck list page Display a badge with the number of cards due for study today next to each deck name on the home page. The count is fetched along with deck data from the API to minimize additional network requests. --- src/server/repositories/card.test.ts | 1 + src/server/repositories/card.ts | 14 ++++++++++++++ src/server/repositories/types.ts | 1 + 3 files changed, 16 insertions(+) (limited to 'src/server/repositories') diff --git a/src/server/repositories/card.test.ts b/src/server/repositories/card.test.ts index 0a46a76..b492fd7 100644 --- a/src/server/repositories/card.test.ts +++ b/src/server/repositories/card.test.ts @@ -111,6 +111,7 @@ function createMockCardRepo(): CardRepository { softDelete: vi.fn(), softDeleteByNoteId: vi.fn(), findDueCards: vi.fn(), + countDueCards: vi.fn(), findDueCardsWithNoteData: vi.fn(), findDueCardsForStudy: vi.fn(), updateFSRSFields: vi.fn(), diff --git a/src/server/repositories/card.ts b/src/server/repositories/card.ts index 04425a2..ac03bc6 100644 --- a/src/server/repositories/card.ts +++ b/src/server/repositories/card.ts @@ -204,6 +204,20 @@ export const cardRepository: CardRepository = { return result; }, + async countDueCards(deckId: string, now: Date): Promise { + const result = await db + .select({ count: sql`count(*)::int` }) + .from(cards) + .where( + and( + eq(cards.deckId, deckId), + isNull(cards.deletedAt), + lte(cards.due, now), + ), + ); + return result[0]?.count ?? 0; + }, + async findDueCardsWithNoteData( deckId: string, now: Date, diff --git a/src/server/repositories/types.ts b/src/server/repositories/types.ts index 4768d49..cb3a287 100644 --- a/src/server/repositories/types.ts +++ b/src/server/repositories/types.ts @@ -147,6 +147,7 @@ export interface CardRepository { softDelete(id: string, deckId: string): Promise; softDeleteByNoteId(noteId: string): Promise; findDueCards(deckId: string, now: Date, limit: number): Promise; + countDueCards(deckId: string, now: Date): Promise; findDueCardsWithNoteData( deckId: string, now: Date, -- cgit v1.2.3-70-g09d2