aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories/review-log.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/repositories/review-log.ts')
-rw-r--r--src/server/repositories/review-log.ts21
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;
+ },
};