aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/sync/pull.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/sync/pull.ts')
-rw-r--r--src/client/sync/pull.ts153
1 files changed, 152 insertions, 1 deletions
diff --git a/src/client/sync/pull.ts b/src/client/sync/pull.ts
index fa0899b..55c859c 100644
--- a/src/client/sync/pull.ts
+++ b/src/client/sync/pull.ts
@@ -1,7 +1,12 @@
import type {
CardStateType,
+ FieldTypeType,
LocalCard,
LocalDeck,
+ LocalNote,
+ LocalNoteFieldType,
+ LocalNoteFieldValue,
+ LocalNoteType,
LocalReviewLog,
RatingType,
} from "../db/index";
@@ -64,12 +69,73 @@ export interface ServerReviewLog {
}
/**
+ * Server note type data format from pull response
+ */
+export interface ServerNoteType {
+ id: string;
+ userId: string;
+ name: string;
+ frontTemplate: string;
+ backTemplate: string;
+ isReversible: boolean;
+ createdAt: Date;
+ updatedAt: Date;
+ deletedAt: Date | null;
+ syncVersion: number;
+}
+
+/**
+ * Server note field type data format from pull response
+ */
+export interface ServerNoteFieldType {
+ id: string;
+ noteTypeId: string;
+ name: string;
+ order: number;
+ fieldType: string;
+ createdAt: Date;
+ updatedAt: Date;
+ deletedAt: Date | null;
+ syncVersion: number;
+}
+
+/**
+ * Server note data format from pull response
+ */
+export interface ServerNote {
+ id: string;
+ deckId: string;
+ noteTypeId: string;
+ createdAt: Date;
+ updatedAt: Date;
+ deletedAt: Date | null;
+ syncVersion: number;
+}
+
+/**
+ * Server note field value data format from pull response
+ */
+export interface ServerNoteFieldValue {
+ id: string;
+ noteId: string;
+ noteFieldTypeId: string;
+ value: string;
+ createdAt: Date;
+ updatedAt: Date;
+ syncVersion: number;
+}
+
+/**
* Response from pull endpoint
*/
export interface SyncPullResult {
decks: ServerDeck[];
cards: ServerCard[];
reviewLogs: ServerReviewLog[];
+ noteTypes: ServerNoteType[];
+ noteFieldTypes: ServerNoteFieldType[];
+ notes: ServerNote[];
+ noteFieldValues: ServerNoteFieldValue[];
currentSyncVersion: number;
}
@@ -147,17 +213,98 @@ function serverReviewLogToLocal(log: ServerReviewLog): LocalReviewLog {
}
/**
+ * Convert server note type to local note type format
+ */
+function serverNoteTypeToLocal(noteType: ServerNoteType): LocalNoteType {
+ return {
+ id: noteType.id,
+ userId: noteType.userId,
+ name: noteType.name,
+ frontTemplate: noteType.frontTemplate,
+ backTemplate: noteType.backTemplate,
+ isReversible: noteType.isReversible,
+ createdAt: new Date(noteType.createdAt),
+ updatedAt: new Date(noteType.updatedAt),
+ deletedAt: noteType.deletedAt ? new Date(noteType.deletedAt) : null,
+ syncVersion: noteType.syncVersion,
+ _synced: true,
+ };
+}
+
+/**
+ * Convert server note field type to local note field type format
+ */
+function serverNoteFieldTypeToLocal(
+ fieldType: ServerNoteFieldType,
+): LocalNoteFieldType {
+ return {
+ id: fieldType.id,
+ noteTypeId: fieldType.noteTypeId,
+ name: fieldType.name,
+ order: fieldType.order,
+ fieldType: fieldType.fieldType as FieldTypeType,
+ createdAt: new Date(fieldType.createdAt),
+ updatedAt: new Date(fieldType.updatedAt),
+ deletedAt: fieldType.deletedAt ? new Date(fieldType.deletedAt) : null,
+ syncVersion: fieldType.syncVersion,
+ _synced: true,
+ };
+}
+
+/**
+ * Convert server note to local note format
+ */
+function serverNoteToLocal(note: ServerNote): LocalNote {
+ return {
+ id: note.id,
+ deckId: note.deckId,
+ noteTypeId: note.noteTypeId,
+ createdAt: new Date(note.createdAt),
+ updatedAt: new Date(note.updatedAt),
+ deletedAt: note.deletedAt ? new Date(note.deletedAt) : null,
+ syncVersion: note.syncVersion,
+ _synced: true,
+ };
+}
+
+/**
+ * Convert server note field value to local note field value format
+ */
+function serverNoteFieldValueToLocal(
+ fieldValue: ServerNoteFieldValue,
+): LocalNoteFieldValue {
+ return {
+ id: fieldValue.id,
+ noteId: fieldValue.noteId,
+ noteFieldTypeId: fieldValue.noteFieldTypeId,
+ value: fieldValue.value,
+ createdAt: new Date(fieldValue.createdAt),
+ updatedAt: new Date(fieldValue.updatedAt),
+ syncVersion: fieldValue.syncVersion,
+ _synced: true,
+ };
+}
+
+/**
* Convert server pull result to local format for storage
*/
export function pullResultToLocalData(result: SyncPullResult): {
decks: LocalDeck[];
cards: LocalCard[];
reviewLogs: LocalReviewLog[];
+ noteTypes: LocalNoteType[];
+ noteFieldTypes: LocalNoteFieldType[];
+ notes: LocalNote[];
+ noteFieldValues: LocalNoteFieldValue[];
} {
return {
decks: result.decks.map(serverDeckToLocal),
cards: result.cards.map(serverCardToLocal),
reviewLogs: result.reviewLogs.map(serverReviewLogToLocal),
+ noteTypes: result.noteTypes.map(serverNoteTypeToLocal),
+ noteFieldTypes: result.noteFieldTypes.map(serverNoteFieldTypeToLocal),
+ notes: result.notes.map(serverNoteToLocal),
+ noteFieldValues: result.noteFieldValues.map(serverNoteFieldValueToLocal),
};
}
@@ -196,7 +343,11 @@ export class PullService {
if (
result.decks.length > 0 ||
result.cards.length > 0 ||
- result.reviewLogs.length > 0
+ result.reviewLogs.length > 0 ||
+ result.noteTypes.length > 0 ||
+ result.noteFieldTypes.length > 0 ||
+ result.notes.length > 0 ||
+ result.noteFieldValues.length > 0
) {
const localData = pullResultToLocalData(result);
await this.syncQueue.applyPulledChanges(localData);