Files
photo-live/services/api/src/emergency/dto.ts
T
浅念 eac8da6d6c feat(ov): emergency disable channel independent of sync
P2 Task 5(海外紧急停用入口):
- ov 新增 POST /v1/internal/emergency/disable|enable(InternalSyncGuard
  HMAC,albumToken/albumId 恰好其一、都缺省 400;副本不存在 404
  ALBUM_NOT_FOUND):直写 albums_ov.emergencyDisabled(唯一 ov 本地可写
  位),独立于同步版本链——更高版本 album.updated 重放不解除(e2e 断言
  entityVersion 推进而标志保持),恢复仅经显式 enable;幂等语义
  (alreadyDisabled/wasDisabled 入审计行)
- cn 侧不感知:无对应 cn 状态位、无反向同步(契约描述文档化)
- 审计:pino child(audit=emergency 字段常驻每行)结构化日志——偏差
  登记:计划原文「写 ov 侧日志文件」落地为字段标记而非独立文件通道
  (免新增文件 transport 依赖,P5 运维按字段路由聚合);注入令牌
  EMERGENCY_AUDIT_LOGGER,测试覆写为内存目的地断言字段
- isAlbumVisibleOv 共享判定(status=active && publicEnabled &&
  !emergencyDisabled——镜像 cn 公开语义叠加本地停用位):Task 6 公开
  API / Task 7 WS subscribe 的 404 ALBUM_NOT_PUBLIC 语义单一实现,
  判定矩阵单测锁定
- 契约 [internal] 增 emergency disable/enable 操作与 schema(gen 已跑、
  redocly 通过);e2e:token/id 定位、幂等、enable 恢复、未签名 401、
  均缺省 400、未知相册 404、同步事件不解除

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 16:19:02 +08:00

33 lines
874 B
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// services/api/src/emergency/dto.ts —— 紧急停用通道请求 DTO(P2 Task 5)。
// 契约权威:openapi.yaml [internal] emergencyDisable/emergencyEnable
// (EmergencyDisableRequest/EmergencyEnableRequest)。「albumToken 与 albumId
// 恰好其一」的跨字段约束在服务端校验(EmergencyService.findAlbum)。
import {
IsOptional,
IsString,
MaxLength,
MinLength,
} from 'class-validator';
/** 相册定位字段(两 DTO 共用;与契约 schema 同步)。 */
abstract class EmergencyTargetDto {
@IsOptional()
@IsString()
@MaxLength(32)
albumToken?: string;
@IsOptional()
@IsString()
@MaxLength(64)
albumId?: string;
}
export class EmergencyDisableDto extends EmergencyTargetDto {
@IsString()
@MinLength(1)
@MaxLength(500)
reason!: string;
}
export class EmergencyEnableDto extends EmergencyTargetDto {}