diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-04 22:31:13 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-04 22:43:15 +0900 |
| commit | a047cdd517efe7693ccd41162f9267f48cd67955 (patch) | |
| tree | 969c6582d53429085c066aa88881d09f42185aca /src/server/repositories/review-log.ts | |
| parent | 87d925c8dfb9c0502a739275df19d1dde8b32230 (diff) | |
| download | kioku-a047cdd517efe7693ccd41162f9267f48cd67955.tar.gz kioku-a047cdd517efe7693ccd41162f9267f48cd67955.tar.zst kioku-a047cdd517efe7693ccd41162f9267f48cd67955.zip | |
feat(study): enforce newCardsPerDay limit in study API
Split due card fetching into new cards and review cards, applying
the deck's newCardsPerDay limit to new cards while leaving review
cards unrestricted. New cards are placed before review cards in
the response.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/server/repositories/review-log.ts')
| -rw-r--r-- | src/server/repositories/review-log.ts | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/server/repositories/review-log.ts b/src/server/repositories/review-log.ts index c8950d6..591c647 100644 --- a/src/server/repositories/review-log.ts +++ b/src/server/repositories/review-log.ts @@ -1,5 +1,6 @@ +import { and, eq, gte, sql } from "drizzle-orm"; import { db } from "../db/index.js"; -import { reviewLogs } from "../db/schema.js"; +import { CardState, cards, reviewLogs } from "../db/schema.js"; import type { ReviewLog, ReviewLogRepository } from "./types.js"; export const reviewLogRepository: ReviewLogRepository = { @@ -29,4 +30,22 @@ export const reviewLogRepository: ReviewLogRepository = { } return reviewLog; }, + + async countTodayNewCardReviews(deckId: string, now: Date): Promise<number> { + const startOfDay = new Date(now); + startOfDay.setHours(0, 0, 0, 0); + + const result = await db + .select({ count: sql<number>`count(distinct ${reviewLogs.cardId})::int` }) + .from(reviewLogs) + .innerJoin(cards, eq(reviewLogs.cardId, cards.id)) + .where( + and( + eq(cards.deckId, deckId), + eq(reviewLogs.state, CardState.New), + gte(reviewLogs.reviewedAt, startOfDay), + ), + ); + return result[0]?.count ?? 0; + }, }; |
