diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-05 22:49:03 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-05 22:49:03 +0900 |
| commit | 504ff72fea72eb3d7c4cf45be1bd9620cb12a796 (patch) | |
| tree | ffc4761292a60c039e8388ac4b4a020bf1c8d401 /src/server/routes/decks.ts | |
| parent | 792891c4bb1cce34a4d11bd7fd5388804bff4ca6 (diff) | |
| download | kioku-504ff72fea72eb3d7c4cf45be1bd9620cb12a796.tar.gz kioku-504ff72fea72eb3d7c4cf45be1bd9620cb12a796.tar.zst kioku-504ff72fea72eb3d7c4cf45be1bd9620cb12a796.zip | |
fix(decks): align due card count with study screen limits
The deck list was showing all due cards without applying the
newCardsPerDay limit or review card limit (100), causing a mismatch
with the actual number of cards available in the study screen.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/server/routes/decks.ts')
| -rw-r--r-- | src/server/routes/decks.ts | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/server/routes/decks.ts b/src/server/routes/decks.ts index 2e170db..6a24c66 100644 --- a/src/server/routes/decks.ts +++ b/src/server/routes/decks.ts @@ -7,20 +7,25 @@ import { cardRepository, type DeckRepository, deckRepository, + type ReviewLogRepository, + reviewLogRepository, } from "../repositories/index.js"; import { createDeckSchema, updateDeckSchema } from "../schemas/index.js"; export interface DeckDependencies { deckRepo: DeckRepository; cardRepo: CardRepository; + reviewLogRepo: ReviewLogRepository; } const deckIdParamSchema = z.object({ id: z.uuid(), }); +const REVIEW_CARDS_LIMIT = 100; + export function createDecksRouter(deps: DeckDependencies) { - const { deckRepo, cardRepo } = deps; + const { deckRepo, cardRepo, reviewLogRepo } = deps; return new Hono() .use("*", authMiddleware) @@ -30,7 +35,26 @@ export function createDecksRouter(deps: DeckDependencies) { const now = new Date(); const decksWithDueCount = await Promise.all( decks.map(async (deck) => { - const dueCardCount = await cardRepo.countDueCards(deck.id, now); + const [dueNewCards, dueReviewCards, reviewedNewCards] = + await Promise.all([ + cardRepo.countDueNewCards(deck.id, now), + cardRepo.countDueReviewCards(deck.id, now), + reviewLogRepo.countTodayNewCardReviews(deck.id, now), + ]); + + // Apply the same limits as the study screen + const newCardBudget = Math.max( + 0, + deck.newCardsPerDay - reviewedNewCards, + ); + const newCardsToStudy = Math.min(dueNewCards, newCardBudget); + const reviewCardsToStudy = Math.min( + dueReviewCards, + REVIEW_CARDS_LIMIT, + ); + + const dueCardCount = newCardsToStudy + reviewCardsToStudy; + return { ...deck, dueCardCount }; }), ); @@ -93,4 +117,5 @@ export function createDecksRouter(deps: DeckDependencies) { export const decks = createDecksRouter({ deckRepo: deckRepository, cardRepo: cardRepository, + reviewLogRepo: reviewLogRepository, }); |
