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:
@@ -17,6 +17,9 @@
|
||||
// (契约评审修正:含照片条数与最新发布时间——新照片发布必变,避免仅比对
|
||||
// 实体版本时新照片小版本导致 304 陈旧);If-None-Match 匹配 → 304 无body
|
||||
// (判定在控制器,服务只产出 body+ETag)。空照片列:后两元取 0 与空串。
|
||||
// UI-01:响应携带 settings(ov 副本 JSON 经 normalizeStoredSettings 归一化
|
||||
// ——缺字段(UI-01 前旧投影行)按契约默认值补齐,嵌入端据此应用后台配置)。
|
||||
// 设置变更必递增 configVersion(cn 管理面约定),ETag 随之变化,无需改四元组。
|
||||
import { HttpStatus, Inject, Injectable } from '@nestjs/common';
|
||||
import type { components } from '@photo/contracts';
|
||||
import {
|
||||
@@ -30,6 +33,7 @@ import { OvPrismaService } from '../prisma-ov/ov-prisma.module';
|
||||
import { OvRedisService } from '../redis-ov/ov-redis.module';
|
||||
import { signedUrlTtlSeconds } from '../uploads/support';
|
||||
import { STORAGE_PORT_OV } from '../public-ov/storage-ov.provider';
|
||||
import { normalizeStoredSettings } from '../embed/embed.service';
|
||||
import type { StoragePort } from '@photo/storage';
|
||||
|
||||
export type PublicEmbedSlotResponse = components['schemas']['PublicEmbedSlot'];
|
||||
@@ -152,6 +156,8 @@ export class EmbedOvService {
|
||||
body: {
|
||||
slotToken,
|
||||
configVersion: slot.configVersion,
|
||||
// UI-01:后台展示设置归一化全集(旧投影行缺字段 → 契约默认值)。
|
||||
settings: normalizeStoredSettings(slot.settings),
|
||||
album: {
|
||||
publicToken: album.publicToken,
|
||||
title,
|
||||
|
||||
Reference in New Issue
Block a user