4979091d2c
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>
17 lines
712 B
TypeScript
17 lines
712 B
TypeScript
// services/api/src/ads/ —— 广告位管理模块(ads-carousel,仅 cn 入口
|
||
// 装配:广告是 cn 权威实体,ov 侧只承接 ads_ov 投影与公开读端点)。
|
||
// UploadsModule 取 STORAGE_PORT(storage.provider.ts env 工厂;模块已 export,
|
||
// 同 EmbedModule 之后的装配口径);PrismaModule 为 @Global,CRUD(Task 7)
|
||
// 直接注入 PrismaService。
|
||
import { Module } from '@nestjs/common';
|
||
import { UploadsModule } from '../uploads/uploads.module';
|
||
import { AdsController } from './ads.controller';
|
||
import { AdsService } from './ads.service';
|
||
|
||
@Module({
|
||
imports: [UploadsModule],
|
||
controllers: [AdsController],
|
||
providers: [AdsService],
|
||
})
|
||
export class AdsModule {}
|