浅念
|
bfba76b5e6
|
fix(ads): 终审修复——staging 前缀+运行时上限核验/失效绑定编辑/白名单去 heic/杂项
- verifyStaging 硬化(services/api/src/ads/ads.service.ts):新增键前缀核验
(仅 OBJECT_KEY_ROOT/ads/staging/ 布局,防照片域任意键被提升为公开广告)
与运行时 2MB 上限(head.bytes > AD_UPLOAD_MAX_BYTES → 400 报文含限额值
——init 申明管不住实际 PUT 体,create/update 是唯一核验点);e2e ⑰ 以
测试 storage 直接 presignPut 真实对象覆盖两分支
- 失效绑定编辑 400(admin AdsFormDialog):PATCH 仅在 albumIds 实际变化时
携带(albumIdsChanged 序敏感深比较,纯函数落 adsLogic + vitest 用例);
preloadOptions 解析失败的绑定 ID 加「已失效,可移除」后缀(zh/en 新增
adsManage.form.staleAlbum)——软删绑定不再挡住其它字段保存
- 白名单去 heic(原图直出无变体兜底,Chromium/Firefox 不渲染=破图):
contracts 三处 enum 收窄 [image/jpeg, image/png] 并重生成类型;dto 定义
广告域独立 AD_IMAGE_CONTENT_TYPES(与照片域 UPLOAD_CONTENT_TYPES 分离),
AD_IMAGE_EXTENSIONS 由其派生;init 对 .heic 文件名以广告域集合二次核验
拒绝(共享 extOfFilename 仍认 heic,杜绝 init 放行→create 中段断裂);
e2e heic 矩阵 400;admin accept/文案/类型同步收窄
- searchAlbums 补 catch(http 层已弹 toast,本地静默保持旧选项)
- ActivityPage 关闭记忆测试补位(activity.spec):dismissed 不拉取不渲染、
close 写 sessionStorage 并清空轮播两用例(getPublicAds 入替身防真实 fetch)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-29 02:20:21 +08:00 |
|
浅念
|
60b675a908
|
feat(sync): 对账清单 ad 实体当前态清扫
Task 8(ads-carousel):cn reconcile 增 entityType='ad' 分支——纯 SELECT
当前态映射(sortOrder/createdAt 确定性排序,albumId 恒空串信封约定),
载荷复用 ads/ad-payload.ts 单一出处(与业务事务内即时事件逐字节同形,
纯函数模块无依赖环);DTO SYNC_ENTITY_TYPES 追加 'ad'(对齐契约 enum)。
随附质量审查两项:
- ads.service list() 行→AdminAdItem 映射复用 toItem(删 ~14 行内联重复,
⑮ 补 admin list 200 形状断言覆盖重构路径);
- 新增 test/ads-extensions.spec.ts 守护 AD_IMAGE_EXTENSIONS ===
UPLOAD_CONTENT_TYPES 派生归一扩展名集合(jpeg→jpg),防三处白名单漂移。
测试基建:reset.ts RESET_TABLES 补 'ads'(Task 6 建表遗漏,固定 id 直种
依赖跨 spec 清场);reconcile.e2e-spec 追加 ⑤(红→绿,5/5)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-29 00:22:13 +08:00 |
|
浅念
|
4979091d2c
|
feat(api): 广告位 CRUD——outbox ad.* 事件/audit/停用高优先级/版本化换图
Task 7(ads-carousel):/v1/admin/ads list/create/patch/delete 四端点。
- 事务三写:ads 行 + outbox(ad.updated 全量快照/ad.deleted 墓碑)+ audit
(ad.create/update/delete);ad.* 信封 albumId 恒空串;停用迁移 true→false
与删除均 priority='high';
- 创建/换图:staging head 三核(存在/bytes/contentType,assets complete 同
口径)→ 事务内 copyIfAbsent 先于行写入(失败=孤儿终键对象,OSS 生命周期
兜底)→ 版本化终键 adObjectKey(adId, v, ext);
- 更新:embed 乐观重试模式(条件 updateMany WHERE entityVersion),保证换图
终键版本段与行版本严格对齐;换图三字段同时性校验(缺一 400);albumIds
去重+相册存在性 count 校验([]/null 归一全局 null);
- 删除:条件 deleteMany 重跑保墓碑 entityVersion=末+1;重复删除 404;
- 载荷构建器独立 ad-payload.ts(Task 8 对账共用,逐字节同形约定);
- dto:AdCreateRequestDto.albumIds 收窄为 string[] | null(JSON null 在
@IsOptional 下可达,embed settings 先例);
- e2e:describe 更名 ads domain (e2e),追加 ⑨-⑯ 八用例(真图直传/定向/
非法 linkUrl/字段级 PATCH/换图/DELETE/权限/同步贯通),16/16 通过。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-28 23:57:43 +08:00 |
|
浅念
|
121afadf1e
|
feat(api): /admin/ads/uploads 广告图 staging 预签名(2MB/白名单/admin-only)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-28 23:34:11 +08:00 |
|
浅念
|
4db90b0e9e
|
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>
|
2026-09-28 23:18:37 +08:00 |
|