feat(contracts): p2 realtime, likes, visits and internal sync contracts

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-18 13:34:35 +08:00
parent 06111e1466
commit 24327c5147
9 changed files with 1472 additions and 4 deletions
@@ -22,12 +22,12 @@
**Files:** Modify `packages/contracts/openapi.yaml`(+gen)、`src/constants.ts`、`.env.example`
- [ ] 契约新增:
- [x] 契约新增:
- **公开互动端点(ov 域,路径前缀不变,部署域名区分)**:`POST /public/albums/{token}/photos/{photoId}/likes`(匿名+限速;body {sessionId, batchId, delta 1..20} → 200 {total, countVersion, batchAccepted};重复 batchId → 幂等返回已确认结果);`POST /public/albums/{token}/visits`(body {visitorId, requestId} → 200 {viewCount, counted});likes 上限/限速语义写入 description
- **WS 事件契约**(components 不适用——单独 `packages/contracts/src/realtime.ts`):server→client 消息 `photo.published` / `photo.hidden` / `photo.deleted` / `likes.burst`{photoId, albumId, delta, total, countVersion, burstId, originBatchIds[]} / `stats.updated`{albumId, viewCount};client→server `subscribe{albumToken, sinceVersion?}` / `unsubscribe`;心跳 ping/pong 20s
- **内部同步接口**(tag internal,security: internalSyncKey 描述):`POST /internal/sync/content-batches`(数组:{eventId, schemaVersion, entityType: album|category|photo|asset|slot-state(预留), entityId, albumId, entityVersion, tombstone?, priority, payload});`POST /internal/sync/stat-snapshots`(cn←ov 方向:数组 {photoId?, albumId, kind: likes|views, total, statVersion, source, confirmedAt});对账 `POST /internal/sync/reconcile`{entityType, sinceVersion, limit} → 缺失清单;全量快照 `POST /internal/sync/bootstrap`{albumId?}→{snapshotEventIds[]}(经对账通道分批拉取)
- [ ] constants:SYNC 批量/间隔、VISIT_WINDOW_MINUTES、REALTIME 心跳等 env 键名与默认值入 `.env.example`
- [ ] gen + lint + 全回归绿;Commit `feat(contracts): p2 realtime, likes, visits and internal sync contracts`
- [x] constants:SYNC 批量/间隔、VISIT_WINDOW_MINUTES、REALTIME 心跳等 env 键名与默认值入 `.env.example`
- [x] gen + lint + 全回归绿;Commit `feat(contracts): p2 realtime, likes, visits and internal sync contracts`
## Task 2: ov 数据层