diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-31 01:18:37 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-31 01:20:00 +0900 |
| commit | ef65c4e6d31b5df36bfff3254d614f61bf659bed (patch) | |
| tree | 4cfab0983a1aa3f58c1b90c1a8bc17fa37c4049e /src/server/repositories | |
| parent | 139dd1a9ec77921ad757ec6bb9b2b97f9b1162c4 (diff) | |
| download | kioku-ef65c4e6d31b5df36bfff3254d614f61bf659bed.tar.gz kioku-ef65c4e6d31b5df36bfff3254d614f61bf659bed.tar.zst kioku-ef65c4e6d31b5df36bfff3254d614f61bf659bed.zip | |
feat(api): include note data in Card and Study route responses
Update Card GET endpoint to return note and field values when available,
and Study GET endpoint to include note data for card display rendering.
This enables the frontend to render note-based cards with their templates.
🤖 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')
| -rw-r--r-- | src/server/repositories/card.test.ts | 1 | ||||
| -rw-r--r-- | src/server/repositories/card.ts | 41 | ||||
| -rw-r--r-- | src/server/repositories/types.ts | 5 |
3 files changed, 47 insertions, 0 deletions
diff --git a/src/server/repositories/card.test.ts b/src/server/repositories/card.test.ts index 22d0f41..64c071e 100644 --- a/src/server/repositories/card.test.ts +++ b/src/server/repositories/card.test.ts @@ -96,6 +96,7 @@ function createMockCardRepo(): CardRepository { softDelete: vi.fn(), softDeleteByNoteId: vi.fn(), findDueCards: vi.fn(), + findDueCardsWithNoteData: vi.fn(), updateFSRSFields: vi.fn(), }; } diff --git a/src/server/repositories/card.ts b/src/server/repositories/card.ts index 830b2f7..92811d4 100644 --- a/src/server/repositories/card.ts +++ b/src/server/repositories/card.ts @@ -178,6 +178,47 @@ export const cardRepository: CardRepository = { return result; }, + async findDueCardsWithNoteData( + deckId: string, + now: Date, + limit: number, + ): Promise<CardWithNoteData[]> { + const dueCards = await this.findDueCards(deckId, now, limit); + + const cardsWithNoteData: CardWithNoteData[] = []; + + for (const card of dueCards) { + if (!card.noteId) { + cardsWithNoteData.push({ + ...card, + note: null, + fieldValues: [], + }); + continue; + } + + const noteResult = await db + .select() + .from(notes) + .where(and(eq(notes.id, card.noteId), isNull(notes.deletedAt))); + + const note = noteResult[0] ?? null; + + const fieldValuesResult = await db + .select() + .from(noteFieldValues) + .where(eq(noteFieldValues.noteId, card.noteId)); + + cardsWithNoteData.push({ + ...card, + note, + fieldValues: fieldValuesResult, + }); + } + + return cardsWithNoteData; + }, + async updateFSRSFields( id: string, deckId: string, diff --git a/src/server/repositories/types.ts b/src/server/repositories/types.ts index 3b910f3..8b86061 100644 --- a/src/server/repositories/types.ts +++ b/src/server/repositories/types.ts @@ -134,6 +134,11 @@ export interface CardRepository { softDelete(id: string, deckId: string): Promise<boolean>; softDeleteByNoteId(noteId: string): Promise<boolean>; findDueCards(deckId: string, now: Date, limit: number): Promise<Card[]>; + findDueCardsWithNoteData( + deckId: string, + now: Date, + limit: number, + ): Promise<CardWithNoteData[]>; updateFSRSFields( id: string, deckId: string, |
