From 38b8fc0e9927c4146b4c8b309b2bcc644abd63d0 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 25 Feb 2026 23:02:35 +0900 Subject: feat(decks): add default note type setting per deck Allow each deck to specify a default note type that is auto-selected when creating new notes. Includes DB schema migration, server API updates, sync layer support, and UI for editing the default in the deck settings modal. Co-Authored-By: Claude Opus 4.6 --- src/client/sync/conflict.test.ts | 20 ++++++++++++++++++++ src/client/sync/conflict.ts | 1 + src/client/sync/crdt/concurrent-edits.test.ts | 1 + src/client/sync/crdt/document-manager.test.ts | 9 +++++++++ src/client/sync/crdt/document-manager.ts | 3 +++ src/client/sync/crdt/migration.test.ts | 1 + src/client/sync/crdt/repositories.test.ts | 6 ++++++ src/client/sync/crdt/types.test.ts | 2 ++ src/client/sync/crdt/types.ts | 1 + src/client/sync/manager.test.ts | 2 ++ src/client/sync/pull.test.ts | 21 +++++++++++++++++++++ src/client/sync/pull.ts | 2 ++ src/client/sync/push.test.ts | 17 +++++++++++++++++ src/client/sync/push.ts | 2 ++ src/client/sync/queue.test.ts | 12 ++++++++++++ 15 files changed, 100 insertions(+) (limited to 'src/client/sync') diff --git a/src/client/sync/conflict.test.ts b/src/client/sync/conflict.test.ts index d11e150..ba6586f 100644 --- a/src/client/sync/conflict.test.ts +++ b/src/client/sync/conflict.test.ts @@ -155,6 +155,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Name", description: "Local description", + defaultNoteTypeId: null, }); const serverDeck = { @@ -165,6 +166,7 @@ describe("ConflictResolver", () => { createdAt: new Date("2024-01-01"), updatedAt: new Date("2024-01-03"), deletedAt: null, + defaultNoteTypeId: null, syncVersion: 5, }; @@ -186,6 +188,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const localCard = await localCardRepository.create({ @@ -236,11 +239,13 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Deck 1", description: null, + defaultNoteTypeId: null, }); const deck2 = await localDeckRepository.create({ userId: "user-1", name: "Local Deck 2", description: null, + defaultNoteTypeId: null, }); const pushResult: SyncPushResult = { @@ -267,6 +272,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Deck 1", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -277,6 +283,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Deck 2", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -306,6 +313,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const card = await localCardRepository.create({ @@ -388,6 +396,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -415,6 +424,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Only Deck", description: null, + defaultNoteTypeId: null, }); const pushResult: SyncPushResult = { @@ -451,6 +461,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Name", description: null, + defaultNoteTypeId: null, }); const pushResult: SyncPushResult = { @@ -471,6 +482,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Name", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -501,6 +513,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Deck Name", description: "Local description", + defaultNoteTypeId: null, }); // Store local CRDT document @@ -518,6 +531,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Deck Name", description: "Server description", + defaultNoteTypeId: null, createdAt: localDeck.createdAt, updatedAt: new Date(Date.now() + 1000), deletedAt: null, @@ -575,6 +589,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Name", description: null, + defaultNoteTypeId: null, }); const serverDeck = { @@ -582,6 +597,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Name", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -632,6 +648,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Name", description: null, + defaultNoteTypeId: null, }); const serverDeck = { @@ -639,6 +656,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Name", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -680,6 +698,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Local Name", description: null, + defaultNoteTypeId: null, }); const serverDeck = { @@ -687,6 +706,7 @@ describe("ConflictResolver", () => { userId: "user-1", name: "Server Name", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, diff --git a/src/client/sync/conflict.ts b/src/client/sync/conflict.ts index 64287a1..fcb5bf4 100644 --- a/src/client/sync/conflict.ts +++ b/src/client/sync/conflict.ts @@ -67,6 +67,7 @@ function serverDeckToLocal(deck: ServerDeck): LocalDeck { userId: deck.userId, name: deck.name, description: deck.description, + defaultNoteTypeId: deck.defaultNoteTypeId, createdAt: new Date(deck.createdAt), updatedAt: new Date(deck.updatedAt), deletedAt: deck.deletedAt ? new Date(deck.deletedAt) : null, diff --git a/src/client/sync/crdt/concurrent-edits.test.ts b/src/client/sync/crdt/concurrent-edits.test.ts index d55b233..e9d7b58 100644 --- a/src/client/sync/crdt/concurrent-edits.test.ts +++ b/src/client/sync/crdt/concurrent-edits.test.ts @@ -34,6 +34,7 @@ function createTestDeck(overrides: Partial = {}): LocalDeck { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, diff --git a/src/client/sync/crdt/document-manager.test.ts b/src/client/sync/crdt/document-manager.test.ts index b578c77..2da92a1 100644 --- a/src/client/sync/crdt/document-manager.test.ts +++ b/src/client/sync/crdt/document-manager.test.ts @@ -51,6 +51,7 @@ describe("createDocument", () => { userId: "user-1", name: "My Deck", description: null, + defaultNoteTypeId: null, createdAt: Date.now(), deletedAt: null, }, @@ -153,6 +154,7 @@ describe("saveDocument and loadDocument", () => { userId: "user-1", name: "Test Deck", description: "A test deck", + defaultNoteTypeId: null, createdAt: 1234567890, deletedAt: null, }, @@ -222,6 +224,7 @@ describe("deckToCrdtDocument and crdtDocumentToDeck", () => { userId: "user-1", name: "My Deck", description: "A deck for testing", + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -246,6 +249,7 @@ describe("deckToCrdtDocument and crdtDocumentToDeck", () => { userId: "user-1", name: "Deleted Deck", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: deletedAt, deletedAt: deletedAt, @@ -271,6 +275,7 @@ describe("deckToCrdtDocument and crdtDocumentToDeck", () => { userId: "user-2", name: "Converted Deck", description: "Converted from CRDT", + defaultNoteTypeId: null, createdAt: now - 10000, deletedAt: null, }, @@ -456,6 +461,7 @@ describe("createDocumentFromEntity", () => { userId: "user-1", name: "Test", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -536,6 +542,7 @@ describe("getLastModified", () => { userId: "user-1", name: "Test", description: null, + defaultNoteTypeId: null, createdAt: timestamp, deletedAt: null, }, @@ -558,6 +565,7 @@ describe("isDeleted", () => { userId: "user-1", name: "Test", description: null, + defaultNoteTypeId: null, createdAt: Date.now(), deletedAt: null, }, @@ -578,6 +586,7 @@ describe("isDeleted", () => { userId: "user-1", name: "Test", description: null, + defaultNoteTypeId: null, createdAt: Date.now(), deletedAt: Date.now(), }, diff --git a/src/client/sync/crdt/document-manager.ts b/src/client/sync/crdt/document-manager.ts index b753d88..ab121ec 100644 --- a/src/client/sync/crdt/document-manager.ts +++ b/src/client/sync/crdt/document-manager.ts @@ -187,6 +187,7 @@ function getEmptyDocumentData( userId: "", name: "", description: null, + defaultNoteTypeId: null, createdAt: 0, deletedAt: null, }, @@ -300,6 +301,7 @@ export function deckToCrdtDocument(deck: LocalDeck): CrdtDeckDocument { userId: deck.userId, name: deck.name, description: deck.description, + defaultNoteTypeId: deck.defaultNoteTypeId, createdAt: deck.createdAt.getTime(), deletedAt: deck.deletedAt?.getTime() ?? null, }, @@ -317,6 +319,7 @@ export function crdtDocumentToDeck( userId: doc.data.userId, name: doc.data.name, description: doc.data.description, + defaultNoteTypeId: doc.data.defaultNoteTypeId ?? null, createdAt: new Date(doc.data.createdAt), updatedAt: new Date(doc.meta.lastModified), deletedAt: doc.data.deletedAt ? new Date(doc.data.deletedAt) : null, diff --git a/src/client/sync/crdt/migration.test.ts b/src/client/sync/crdt/migration.test.ts index ba90be2..531e8fe 100644 --- a/src/client/sync/crdt/migration.test.ts +++ b/src/client/sync/crdt/migration.test.ts @@ -109,6 +109,7 @@ describe("migration", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, diff --git a/src/client/sync/crdt/repositories.test.ts b/src/client/sync/crdt/repositories.test.ts index f7b75b3..c400b22 100644 --- a/src/client/sync/crdt/repositories.test.ts +++ b/src/client/sync/crdt/repositories.test.ts @@ -35,6 +35,7 @@ describe("crdtDeckRepository", () => { userId: "user-1", name: "Test Deck", description: "A test deck", + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -378,6 +379,7 @@ describe("entitiesToCrdtDocuments", () => { userId: "user-1", name: "Deck 1", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -389,6 +391,7 @@ describe("entitiesToCrdtDocuments", () => { userId: "user-1", name: "Deck 2", description: "Second deck", + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -415,6 +418,7 @@ describe("mergeAndConvert", () => { userId: "user-1", name: "Remote Deck", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -436,6 +440,7 @@ describe("mergeAndConvert", () => { userId: "user-1", name: "Original", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, @@ -476,6 +481,7 @@ describe("mergeAndConvert", () => { userId: "user-1", name: "Same", description: null, + defaultNoteTypeId: null, createdAt: now, updatedAt: now, deletedAt: null, diff --git a/src/client/sync/crdt/types.test.ts b/src/client/sync/crdt/types.test.ts index 07ae0f2..7a501b2 100644 --- a/src/client/sync/crdt/types.test.ts +++ b/src/client/sync/crdt/types.test.ts @@ -149,6 +149,7 @@ describe("CRDT Document type structures", () => { userId: "user-1", name: "My Deck", description: "A test deck", + defaultNoteTypeId: null, createdAt: now, deletedAt: null, }, @@ -303,6 +304,7 @@ describe("CRDT Document type structures", () => { userId: "user-1", name: "Deleted Deck", description: null, + defaultNoteTypeId: null, createdAt: now - 86400000, deletedAt: now, }, diff --git a/src/client/sync/crdt/types.ts b/src/client/sync/crdt/types.ts index e2f5d4c..434f3b0 100644 --- a/src/client/sync/crdt/types.ts +++ b/src/client/sync/crdt/types.ts @@ -36,6 +36,7 @@ export interface CrdtDeckDocument { userId: string; name: string; description: string | null; + defaultNoteTypeId: string | null; createdAt: number; // Unix timestamp in ms deletedAt: number | null; }; diff --git a/src/client/sync/manager.test.ts b/src/client/sync/manager.test.ts index a9be10d..97e99d2 100644 --- a/src/client/sync/manager.test.ts +++ b/src/client/sync/manager.test.ts @@ -83,6 +83,7 @@ describe("SyncManager", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); } @@ -411,6 +412,7 @@ describe("SyncManager", () => { userId: "user-1", name: "Server Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, diff --git a/src/client/sync/pull.test.ts b/src/client/sync/pull.test.ts index 0f1b689..56213bb 100644 --- a/src/client/sync/pull.test.ts +++ b/src/client/sync/pull.test.ts @@ -48,6 +48,7 @@ describe("pullResultToLocalData", () => { userId: "user-1", name: "Test Deck", description: "A description", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -68,6 +69,7 @@ describe("pullResultToLocalData", () => { userId: "user-1", name: "Test Deck", description: "A description", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -83,6 +85,7 @@ describe("pullResultToLocalData", () => { userId: "user-1", name: "Deleted Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-03T12:00:00Z"), deletedAt: new Date("2024-01-03T12:00:00Z"), @@ -535,6 +538,7 @@ describe("PullService", () => { userId: "user-1", name: "Server Deck", description: "From server", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T10:00:00Z"), deletedAt: null, @@ -567,6 +571,7 @@ describe("PullService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -668,6 +673,7 @@ describe("PullService", () => { userId: "user-1", name: "Old Name", description: null, + defaultNoteTypeId: null, }); const pullFromServer = vi.fn().mockResolvedValue({ @@ -677,6 +683,7 @@ describe("PullService", () => { userId: "user-1", name: "Updated Name", description: "Updated description", + defaultNoteTypeId: null, createdAt: existingDeck.createdAt, updatedAt: new Date(), deletedAt: null, @@ -709,6 +716,7 @@ describe("PullService", () => { userId: "user-1", name: "Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -865,6 +873,7 @@ describe("PullService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -919,6 +928,7 @@ describe("PullService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -988,6 +998,7 @@ describe("PullService", () => { userId: "user-1", name: "Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -1167,6 +1178,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Test Deck", description: "A test description", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1199,6 +1211,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Local Deck", description: "Local description", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-01T12:00:00Z"), deletedAt: null, @@ -1221,6 +1234,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Remote Deck", description: "Remote description", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), // Later timestamp deletedAt: null, @@ -1251,6 +1265,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Deck 1", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1262,6 +1277,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Deck 2", description: "Second deck", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1300,6 +1316,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1354,6 +1371,7 @@ describe("applyCrdtChanges", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1451,6 +1469,7 @@ describe("PullService with CRDT changes", () => { userId: "user-1", name: "CRDT Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1501,6 +1520,7 @@ describe("PullService with CRDT changes", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -1577,6 +1597,7 @@ describe("PullService with CRDT changes", () => { userId: "user-1", name: "Regular Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, diff --git a/src/client/sync/pull.ts b/src/client/sync/pull.ts index ce4d992..5fa561b 100644 --- a/src/client/sync/pull.ts +++ b/src/client/sync/pull.ts @@ -30,6 +30,7 @@ export interface ServerDeck { userId: string; name: string; description: string | null; + defaultNoteTypeId: string | null; createdAt: Date; updatedAt: Date; deletedAt: Date | null; @@ -167,6 +168,7 @@ function serverDeckToLocal(deck: ServerDeck): LocalDeck { userId: deck.userId, name: deck.name, description: deck.description, + defaultNoteTypeId: deck.defaultNoteTypeId, createdAt: new Date(deck.createdAt), updatedAt: new Date(deck.updatedAt), deletedAt: deck.deletedAt ? new Date(deck.deletedAt) : null, diff --git a/src/client/sync/push.test.ts b/src/client/sync/push.test.ts index 8605ede..0efc796 100644 --- a/src/client/sync/push.test.ts +++ b/src/client/sync/push.test.ts @@ -81,6 +81,7 @@ describe("pendingChangesToPushData", () => { userId: "user-1", name: "Test Deck", description: "A description", + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -101,6 +102,7 @@ describe("pendingChangesToPushData", () => { id: "deck-1", name: "Test Deck", description: "A description", + defaultNoteTypeId: null, createdAt: "2024-01-01T10:00:00.000Z", updatedAt: "2024-01-02T15:30:00.000Z", deletedAt: null, @@ -114,6 +116,7 @@ describe("pendingChangesToPushData", () => { userId: "user-1", name: "Deleted Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-03T12:00:00Z"), deletedAt: new Date("2024-01-03T12:00:00Z"), @@ -527,6 +530,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const pushToServer = vi.fn().mockResolvedValue({ @@ -565,6 +569,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -611,6 +616,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -668,6 +674,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const pushToServer = vi.fn().mockResolvedValue({ @@ -695,6 +702,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const pushToServer = vi.fn().mockResolvedValue({ @@ -720,6 +728,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const pushToServer = vi @@ -739,6 +748,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const card = await localCardRepository.create({ @@ -884,6 +894,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -931,6 +942,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -994,6 +1006,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const noteType = await localNoteTypeRepository.create({ @@ -1080,6 +1093,7 @@ describe("PushService", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const pushService = new PushService({ @@ -1102,6 +1116,7 @@ describe("generateCrdtChanges", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1339,6 +1354,7 @@ describe("generateCrdtChanges", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, @@ -1480,6 +1496,7 @@ describe("pendingChangesToPushData with crdtChanges", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date("2024-01-01T10:00:00Z"), updatedAt: new Date("2024-01-02T15:30:00Z"), deletedAt: null, diff --git a/src/client/sync/push.ts b/src/client/sync/push.ts index e5c5fd4..79df825 100644 --- a/src/client/sync/push.ts +++ b/src/client/sync/push.ts @@ -39,6 +39,7 @@ export interface SyncDeckData { id: string; name: string; description: string | null; + defaultNoteTypeId: string | null; createdAt: string; updatedAt: string; deletedAt: string | null; @@ -153,6 +154,7 @@ function deckToSyncData(deck: LocalDeck): SyncDeckData { id: deck.id, name: deck.name, description: deck.description, + defaultNoteTypeId: deck.defaultNoteTypeId, createdAt: deck.createdAt.toISOString(), updatedAt: deck.updatedAt.toISOString(), deletedAt: deck.deletedAt?.toISOString() ?? null, diff --git a/src/client/sync/queue.test.ts b/src/client/sync/queue.test.ts index 436046b..dd4e116 100644 --- a/src/client/sync/queue.test.ts +++ b/src/client/sync/queue.test.ts @@ -68,6 +68,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const changes = await syncQueue.getPendingChanges(); @@ -80,6 +81,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localCardRepository.create({ deckId: deck.id, @@ -99,6 +101,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const card = await localCardRepository.create({ deckId: deck.id, @@ -127,6 +130,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -141,6 +145,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localCardRepository.create({ deckId: deck.id, @@ -174,6 +179,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const hasPending = await syncQueue.hasPendingChanges(); @@ -298,6 +304,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await syncQueue.markSynced({ @@ -320,6 +327,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const card = await localCardRepository.create({ deckId: deck.id, @@ -349,6 +357,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const card = await localCardRepository.create({ deckId: deck.id, @@ -408,6 +417,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Server Deck", description: null, + defaultNoteTypeId: null, createdAt: new Date(), updatedAt: new Date(), deletedAt: null, @@ -435,6 +445,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); await localDeckRepository.markSynced(deck.id, 1); @@ -481,6 +492,7 @@ describe("SyncQueue", () => { userId: "user-1", name: "Test Deck", description: null, + defaultNoteTypeId: null, }); const card = await localCardRepository.create({ deckId: deck.id, -- cgit v1.3-1-g0d28