aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/routes/decks.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-05 22:49:03 +0900
committernsfisis <nsfisis@gmail.com>2026-02-05 22:49:03 +0900
commit504ff72fea72eb3d7c4cf45be1bd9620cb12a796 (patch)
treeffc4761292a60c039e8388ac4b4a020bf1c8d401 /src/server/routes/decks.ts
parent792891c4bb1cce34a4d11bd7fd5388804bff4ca6 (diff)
downloadkioku-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.ts29
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,
});