From b074a4901c630ee5c5f7dcff79fa6ff911a14ded Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 31 Dec 2025 14:19:22 +0900 Subject: feat(schema): make note_id and is_reversed NOT NULL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All cards now require note association - legacy card support removed. This aligns with the note-based card architecture introduced in Phase 8. - Add database migration for NOT NULL constraints - Update client Dexie schema to version 3 - Remove LegacyCardItem component and legacy card handling - Update sync schemas and type definitions - Update all tests to use note-based cards 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/server/repositories/card.ts | 56 +++++++++++------------------------------ 1 file changed, 15 insertions(+), 41 deletions(-) (limited to 'src/server/repositories/card.ts') diff --git a/src/server/repositories/card.ts b/src/server/repositories/card.ts index 7116642..4c4fc81 100644 --- a/src/server/repositories/card.ts +++ b/src/server/repositories/card.ts @@ -47,20 +47,15 @@ export const cardRepository: CardRepository = { return undefined; } - if (!card.noteId) { - return { - ...card, - note: null, - fieldValues: [], - }; - } - const noteResult = await db .select() .from(notes) .where(and(eq(notes.id, card.noteId), isNull(notes.deletedAt))); - const note = noteResult[0] ?? null; + const note = noteResult[0]; + if (!note) { + return undefined; + } const fieldValuesResult = await db .select() @@ -85,6 +80,8 @@ export const cardRepository: CardRepository = { async create( deckId: string, data: { + noteId: string; + isReversed: boolean; front: string; back: string; }, @@ -93,6 +90,8 @@ export const cardRepository: CardRepository = { .insert(cards) .values({ deckId, + noteId: data.noteId, + isReversed: data.isReversed, front: data.front, back: data.back, state: CardState.New, @@ -200,21 +199,16 @@ export const cardRepository: CardRepository = { 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 note = noteResult[0]; + if (!note) { + // Note was deleted, skip this card + continue; + } const fieldValuesResult = await db .select() @@ -241,16 +235,6 @@ export const cardRepository: CardRepository = { const cardsForStudy: CardForStudy[] = []; for (const card of dueCards) { - // Legacy card (no note association) - if (!card.noteId) { - cardsForStudy.push({ - ...card, - noteType: null, - fieldValuesMap: {}, - }); - continue; - } - // Fetch note to get noteTypeId const noteResult = await db .select() @@ -259,12 +243,7 @@ export const cardRepository: CardRepository = { const note = noteResult[0]; if (!note) { - // Note was deleted, treat as legacy card - cardsForStudy.push({ - ...card, - noteType: null, - fieldValuesMap: {}, - }); + // Note was deleted, skip this card continue; } @@ -281,12 +260,7 @@ export const cardRepository: CardRepository = { const noteType = noteTypeResult[0]; if (!noteType) { - // Note type was deleted, treat as legacy card - cardsForStudy.push({ - ...card, - noteType: null, - fieldValuesMap: {}, - }); + // Note type was deleted, skip this card continue; } -- cgit v1.2.3-70-g09d2