aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/routes/sync.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/routes/sync.ts')
-rw-r--r--src/server/routes/sync.ts21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/server/routes/sync.ts b/src/server/routes/sync.ts
index fca099b..c571f8a 100644
--- a/src/server/routes/sync.ts
+++ b/src/server/routes/sync.ts
@@ -1,6 +1,7 @@
import { zValidator } from "@hono/zod-validator";
import { Hono } from "hono";
import { z } from "zod";
+import { CrdtEntityType } from "../db/schema-crdt.js";
import { authMiddleware, getAuthUser } from "../middleware/index.js";
import {
type SyncPullQuery,
@@ -95,6 +96,25 @@ const syncNoteFieldValueSchema = z.object({
updatedAt: z.string().datetime(),
});
+/**
+ * Schema for CRDT sync payload
+ * Used for conflict-free synchronization of entity data
+ */
+const crdtSyncPayloadSchema = z.object({
+ documentId: z.string().min(1),
+ entityType: z.enum([
+ CrdtEntityType.Deck,
+ CrdtEntityType.NoteType,
+ CrdtEntityType.NoteFieldType,
+ CrdtEntityType.Note,
+ CrdtEntityType.NoteFieldValue,
+ CrdtEntityType.Card,
+ CrdtEntityType.ReviewLog,
+ ]),
+ entityId: z.uuid(),
+ binary: z.string().min(1), // Base64-encoded Automerge binary
+});
+
const syncPushSchema = z.object({
decks: z.array(syncDeckSchema).default([]),
cards: z.array(syncCardSchema).default([]),
@@ -103,6 +123,7 @@ const syncPushSchema = z.object({
noteFieldTypes: z.array(syncNoteFieldTypeSchema).default([]),
notes: z.array(syncNoteSchema).default([]),
noteFieldValues: z.array(syncNoteFieldValueSchema).default([]),
+ crdtChanges: z.array(crdtSyncPayloadSchema).default([]),
});
const syncPullQuerySchema = z.object({