From 9632d70ea0d326ac0df4e9bffb7fb669013f0755 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 7 Dec 2025 19:20:04 +0900 Subject: feat(server): add GET /api/sync/pull endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement sync pull endpoint to fetch entities updated since a given syncVersion. Returns decks, cards, and review logs with their current sync versions for incremental client synchronization. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/server/routes/sync.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/server/routes/sync.ts') diff --git a/src/server/routes/sync.ts b/src/server/routes/sync.ts index 01f9bd0..d61e8d3 100644 --- a/src/server/routes/sync.ts +++ b/src/server/routes/sync.ts @@ -3,6 +3,7 @@ import { Hono } from "hono"; import { z } from "zod"; import { authMiddleware, getAuthUser } from "../middleware/index.js"; import { + type SyncPullQuery, type SyncPushData, type SyncRepository, syncRepository, @@ -58,6 +59,10 @@ const syncPushSchema = z.object({ reviewLogs: z.array(syncReviewLogSchema).default([]), }); +const syncPullQuerySchema = z.object({ + lastSyncVersion: z.coerce.number().int().min(0).default(0), +}); + export function createSyncRouter(deps: SyncDependencies) { const { syncRepo } = deps; @@ -69,6 +74,14 @@ export function createSyncRouter(deps: SyncDependencies) { const result = await syncRepo.pushChanges(user.id, data); + return c.json(result, 200); + }) + .get("/pull", zValidator("query", syncPullQuerySchema), async (c) => { + const user = getAuthUser(c); + const query = c.req.valid("query") as SyncPullQuery; + + const result = await syncRepo.pullChanges(user.id, query); + return c.json(result, 200); }); } -- cgit v1.2.3-70-g09d2