aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories/review-log.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-12-07 18:44:05 +0900
committernsfisis <nsfisis@gmail.com>2025-12-07 18:44:05 +0900
commitb965d9432b4037dd2f65bb4c8690965e090228ca (patch)
treed9ad4da71d1f2bdc98e7b1f96b6efaeb58399efc /src/server/repositories/review-log.ts
parentc2609af9d8bac65d3e70b3860160ac8bfe097241 (diff)
downloadkioku-b965d9432b4037dd2f65bb4c8690965e090228ca.tar.gz
kioku-b965d9432b4037dd2f65bb4c8690965e090228ca.tar.zst
kioku-b965d9432b4037dd2f65bb4c8690965e090228ca.zip
feat(server): add study session API with FSRS integration
Implement study endpoints for spaced repetition learning: - GET /api/decks/:deckId/study to fetch due cards - POST /api/decks/:deckId/study/:cardId to submit reviews - Integrate ts-fsrs library for scheduling algorithm - Add ReviewLog repository for tracking review history 🤖 Generated with [Claude Code](https://claude.com/claude-code) 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.ts32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/server/repositories/review-log.ts b/src/server/repositories/review-log.ts
new file mode 100644
index 0000000..c8950d6
--- /dev/null
+++ b/src/server/repositories/review-log.ts
@@ -0,0 +1,32 @@
+import { db } from "../db/index.js";
+import { reviewLogs } from "../db/schema.js";
+import type { ReviewLog, ReviewLogRepository } from "./types.js";
+
+export const reviewLogRepository: ReviewLogRepository = {
+ async create(data: {
+ cardId: string;
+ userId: string;
+ rating: number;
+ state: number;
+ scheduledDays: number;
+ elapsedDays: number;
+ durationMs?: number | null;
+ }): Promise<ReviewLog> {
+ const [reviewLog] = await db
+ .insert(reviewLogs)
+ .values({
+ cardId: data.cardId,
+ userId: data.userId,
+ rating: data.rating,
+ state: data.state,
+ scheduledDays: data.scheduledDays,
+ elapsedDays: data.elapsedDays,
+ durationMs: data.durationMs ?? null,
+ })
+ .returning();
+ if (!reviewLog) {
+ throw new Error("Failed to create review log");
+ }
+ return reviewLog;
+ },
+};