From b965d9432b4037dd2f65bb4c8690965e090228ca Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 7 Dec 2025 18:44:05 +0900 Subject: feat(server): add study session API with FSRS integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/server/repositories/review-log.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/server/repositories/review-log.ts (limited to 'src/server/repositories/review-log.ts') 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 { + 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; + }, +}; -- cgit v1.2.3-70-g09d2