feat(contracts,api): UI-01 cover, preview, scope=own and embed config extensions
契约扩展(全部可选/可空,旧客户端零感知)+ cn/ov 实现 + e2e 权限矩阵:
- AlbumSummary += cover(kind=cover state=effective 最新行的短期签名 URL,
列表/详情按页批量组装非 N+1;未配置为 null)
- AdminPhoto += preview{thumb,browse}(变体齐备且未删除才签发;隐藏仅
admin/owner;协作者仅自己上传,scope=own 服务端过滤 uploaderId,
成员资格逐请求裁决)
- listAlbumPhotos += scope=all|own(缺省 all 行为不变:仅 owner/admin,
协作者 403;own 任何有效成员)
- EmbedSlotSettings += imageFit/offsetX/offsetBottom/zIndex(cn PATCH 校验
→ slot-state 投影 → ov 公开回读;settings 为 Json 列免迁移,读侧
normalizeStoredSettings 兜旧形状默认值)
- Flutter 模型同步(SignedUrl/PhotoPreview/AlbumPhotoScope,可空容错)
e2e:ui01-contracts 9 例(封面选取/字节取回/N+1 计数断言、preview 权限
矩阵、scope 过滤与 403/404/400)+ embed ⑨ 配置链路;全量 e2e 257 通过。
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -141,13 +141,22 @@ export interface SlotStateUpdatedPayload {
|
||||
entityVersion: number;
|
||||
}
|
||||
|
||||
/** 展示位设置载荷(契约 EmbedSlotSettings 的载荷形状;字段恒齐全)。 */
|
||||
/**
|
||||
* 展示位设置载荷(契约 EmbedSlotSettings 的载荷形状;字段恒齐全)。
|
||||
* UI-01 新增字段为可选:cn 写入侧恒发归一化全集,但部署切替期间 outbox/
|
||||
* sync_inbox 中在途事件仍是旧形状——消费侧(ov 投影/公开读)须对缺字段按
|
||||
* 契约默认值归一化,不得假设恒在。
|
||||
*/
|
||||
export interface SlotSettingsPayload {
|
||||
position: string; // left|right
|
||||
size: string; // sm|md
|
||||
intervalMs: number;
|
||||
lang: string; // auto|zh-CN|en
|
||||
collapsedDefault: boolean;
|
||||
imageFit?: string; // contain|cover(默认 contain)
|
||||
offsetX?: number; // 0..120(默认 16)
|
||||
offsetBottom?: number; // 0..240(默认 24)
|
||||
zIndex?: number; // 1..2147483000(默认 1000)
|
||||
}
|
||||
|
||||
// 运行时校验用:全部合法事件类型字符串。satisfies 保证 数组 ⊆ 接口 union;
|
||||
|
||||
Reference in New Issue
Block a user