aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/sync/push.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/sync/push.ts')
-rw-r--r--src/client/sync/push.ts157
1 files changed, 154 insertions, 3 deletions
diff --git a/src/client/sync/push.ts b/src/client/sync/push.ts
index 2493e4e..f5c9275 100644
--- a/src/client/sync/push.ts
+++ b/src/client/sync/push.ts
@@ -1,4 +1,12 @@
-import type { LocalCard, LocalDeck, LocalReviewLog } from "../db/index";
+import type {
+ LocalCard,
+ LocalDeck,
+ LocalNote,
+ LocalNoteFieldType,
+ LocalNoteFieldValue,
+ LocalNoteType,
+ LocalReviewLog,
+} from "../db/index";
import type { PendingChanges, SyncQueue } from "./queue";
/**
@@ -8,6 +16,10 @@ export interface SyncPushData {
decks: SyncDeckData[];
cards: SyncCardData[];
reviewLogs: SyncReviewLogData[];
+ noteTypes: SyncNoteTypeData[];
+ noteFieldTypes: SyncNoteFieldTypeData[];
+ notes: SyncNoteData[];
+ noteFieldValues: SyncNoteFieldValueData[];
}
export interface SyncDeckData {
@@ -23,6 +35,8 @@ export interface SyncDeckData {
export interface SyncCardData {
id: string;
deckId: string;
+ noteId: string | null;
+ isReversed: boolean | null;
front: string;
back: string;
state: number;
@@ -50,6 +64,46 @@ export interface SyncReviewLogData {
durationMs: number | null;
}
+export interface SyncNoteTypeData {
+ id: string;
+ name: string;
+ frontTemplate: string;
+ backTemplate: string;
+ isReversible: boolean;
+ createdAt: string;
+ updatedAt: string;
+ deletedAt: string | null;
+}
+
+export interface SyncNoteFieldTypeData {
+ id: string;
+ noteTypeId: string;
+ name: string;
+ order: number;
+ fieldType: string;
+ createdAt: string;
+ updatedAt: string;
+ deletedAt: string | null;
+}
+
+export interface SyncNoteData {
+ id: string;
+ deckId: string;
+ noteTypeId: string;
+ createdAt: string;
+ updatedAt: string;
+ deletedAt: string | null;
+}
+
+export interface SyncNoteFieldValueData {
+ id: string;
+ noteId: string;
+ noteFieldTypeId: string;
+ value: string;
+ createdAt: string;
+ updatedAt: string;
+}
+
/**
* Response from push endpoint
*/
@@ -57,9 +111,17 @@ export interface SyncPushResult {
decks: { id: string; syncVersion: number }[];
cards: { id: string; syncVersion: number }[];
reviewLogs: { id: string; syncVersion: number }[];
+ noteTypes: { id: string; syncVersion: number }[];
+ noteFieldTypes: { id: string; syncVersion: number }[];
+ notes: { id: string; syncVersion: number }[];
+ noteFieldValues: { id: string; syncVersion: number }[];
conflicts: {
decks: string[];
cards: string[];
+ noteTypes: string[];
+ noteFieldTypes: string[];
+ notes: string[];
+ noteFieldValues: string[];
};
}
@@ -93,6 +155,8 @@ function cardToSyncData(card: LocalCard): SyncCardData {
return {
id: card.id,
deckId: card.deckId,
+ noteId: card.noteId,
+ isReversed: card.isReversed,
front: card.front,
back: card.back,
state: card.state,
@@ -127,6 +191,70 @@ function reviewLogToSyncData(log: LocalReviewLog): SyncReviewLogData {
}
/**
+ * Convert local note type to sync format
+ */
+function noteTypeToSyncData(noteType: LocalNoteType): SyncNoteTypeData {
+ return {
+ id: noteType.id,
+ name: noteType.name,
+ frontTemplate: noteType.frontTemplate,
+ backTemplate: noteType.backTemplate,
+ isReversible: noteType.isReversible,
+ createdAt: noteType.createdAt.toISOString(),
+ updatedAt: noteType.updatedAt.toISOString(),
+ deletedAt: noteType.deletedAt?.toISOString() ?? null,
+ };
+}
+
+/**
+ * Convert local note field type to sync format
+ */
+function noteFieldTypeToSyncData(
+ fieldType: LocalNoteFieldType,
+): SyncNoteFieldTypeData {
+ return {
+ id: fieldType.id,
+ noteTypeId: fieldType.noteTypeId,
+ name: fieldType.name,
+ order: fieldType.order,
+ fieldType: fieldType.fieldType,
+ createdAt: fieldType.createdAt.toISOString(),
+ updatedAt: fieldType.updatedAt.toISOString(),
+ deletedAt: fieldType.deletedAt?.toISOString() ?? null,
+ };
+}
+
+/**
+ * Convert local note to sync format
+ */
+function noteToSyncData(note: LocalNote): SyncNoteData {
+ return {
+ id: note.id,
+ deckId: note.deckId,
+ noteTypeId: note.noteTypeId,
+ createdAt: note.createdAt.toISOString(),
+ updatedAt: note.updatedAt.toISOString(),
+ deletedAt: note.deletedAt?.toISOString() ?? null,
+ };
+}
+
+/**
+ * Convert local note field value to sync format
+ */
+function noteFieldValueToSyncData(
+ fieldValue: LocalNoteFieldValue,
+): SyncNoteFieldValueData {
+ return {
+ id: fieldValue.id,
+ noteId: fieldValue.noteId,
+ noteFieldTypeId: fieldValue.noteFieldTypeId,
+ value: fieldValue.value,
+ createdAt: fieldValue.createdAt.toISOString(),
+ updatedAt: fieldValue.updatedAt.toISOString(),
+ };
+}
+
+/**
* Convert pending changes to sync push data format
*/
export function pendingChangesToPushData(
@@ -136,6 +264,10 @@ export function pendingChangesToPushData(
decks: changes.decks.map(deckToSyncData),
cards: changes.cards.map(cardToSyncData),
reviewLogs: changes.reviewLogs.map(reviewLogToSyncData),
+ noteTypes: changes.noteTypes.map(noteTypeToSyncData),
+ noteFieldTypes: changes.noteFieldTypes.map(noteFieldTypeToSyncData),
+ notes: changes.notes.map(noteToSyncData),
+ noteFieldValues: changes.noteFieldValues.map(noteFieldValueToSyncData),
};
}
@@ -171,13 +303,28 @@ export class PushService {
if (
pendingChanges.decks.length === 0 &&
pendingChanges.cards.length === 0 &&
- pendingChanges.reviewLogs.length === 0
+ pendingChanges.reviewLogs.length === 0 &&
+ pendingChanges.noteTypes.length === 0 &&
+ pendingChanges.noteFieldTypes.length === 0 &&
+ pendingChanges.notes.length === 0 &&
+ pendingChanges.noteFieldValues.length === 0
) {
return {
decks: [],
cards: [],
reviewLogs: [],
- conflicts: { decks: [], cards: [] },
+ noteTypes: [],
+ noteFieldTypes: [],
+ notes: [],
+ noteFieldValues: [],
+ conflicts: {
+ decks: [],
+ cards: [],
+ noteTypes: [],
+ noteFieldTypes: [],
+ notes: [],
+ noteFieldValues: [],
+ },
};
}
@@ -192,6 +339,10 @@ export class PushService {
decks: result.decks,
cards: result.cards,
reviewLogs: result.reviewLogs,
+ noteTypes: result.noteTypes,
+ noteFieldTypes: result.noteFieldTypes,
+ notes: result.notes,
+ noteFieldValues: result.noteFieldValues,
});
return result;