feat(sync): ov inbox ad 分支与 sender adId 推导(disabled/墓碑=删投影行)
- dto.ts SYNC_ENTITY_TYPES 追加 'ad'(对齐契约 SyncEntityType)。 - decideAndApply ③依赖检查豁免 ad:albumId 恒空串,不豁免则事件被永久 暂存且无解锁路径(slot-state 同款空 albumId 危害)。 - project() 新增 ad 分支:全量快照直投 ads_ov;墓碑或 enabled=false 均 deleteMany(disabled=公开不可见=无投影);albumIds 整体替换;createdAt 取 cn 原值、updatedAt 为 ov 应用时刻(载荷无该字段)。 - sender.toWireEvent 新增 ad 分支:entityId 取载荷 adId(outbox 表无列), 泛化 categoryId/assetId 兜底之前,缺料 fail-fast。 - e2e ads.e2e-spec:手工构造 outbox 行(绕过 CRUD,Task 7 才有)走真实 sender→HTTP→inbox 链路,5 用例覆盖快照落位/disable 删行/复活 upsert/ 迟到旧版本不回滚/墓碑删行;reset-ov 增清 ads_ov。 - db-ov schema 附带注释修:ads_ov updatedAt 语义纠正(迁移头过度声明, 迁移文件不动防 checksum 漂移)+ sync_inbox.entityType 枚举补 ad。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -188,9 +188,10 @@ export class OutboxSender {
|
||||
|
||||
/**
|
||||
* outbox 行 → SyncEvent 线格式。entityId 按实体类型取自不同位置:
|
||||
* album → albumId 列;photo → photoId 列;category/asset/slot-state → 载荷内
|
||||
* 的 categoryId/assetId/slotId(outbox 表无此三列)。映射缺料抛错(fail-fast:
|
||||
* 本轮不推、不标记,错误日志暴露;cn 侧发射器按构造保证不缺料)。
|
||||
* album → albumId 列;photo → photoId 列;category/asset/slot-state/ad →
|
||||
* 载荷内的 categoryId/assetId/slotId/adId(outbox 表无此四列)。映射缺料
|
||||
* 抛错(fail-fast:本轮不推、不标记,错误日志暴露;cn 侧发射器按构造保证
|
||||
* 不缺料)。
|
||||
*/
|
||||
private toWireEvent(row: OutboxRow): SyncEventWire {
|
||||
const type = row.type as OutboxEvent['type'];
|
||||
@@ -209,6 +210,11 @@ export class OutboxSender {
|
||||
throw new Error(`outbox 事件 ${row.id}(${type})载荷缺 slotId,无法推导 entityId`);
|
||||
}
|
||||
entityId = payload.slotId;
|
||||
} else if (entityType === 'ad') {
|
||||
if (typeof payload.adId !== 'string') {
|
||||
throw new Error(`outbox 事件 ${row.id}(${type})载荷缺 adId,无法推导 entityId`);
|
||||
}
|
||||
entityId = payload.adId;
|
||||
} else if (typeof payload.categoryId === 'string') {
|
||||
entityId = payload.categoryId;
|
||||
} else if (typeof payload.assetId === 'string') {
|
||||
|
||||
Reference in New Issue
Block a user