feat(embed-slots): soft-delete slots — admin entry, ov shutdown via enabled=false snapshot

- 契约 deleteEmbedSlot(DELETE /admin/embed-slots/{id} → 204 幂等;admin 专属)
- cn schema:embed_slots.deletedAt(迁移 20260923120000,本地已应用)
- softDelete:乐观锁 claim + outbox slot.updated(payload enabled 强制 false
  ——ov 副本无墓碑,enabled=false 快照即公开端 404 下线;priority=high)+ audit
- 列表/加载/更新过滤 deletedAt → 同码 404
- Admin 列表操作「删除」(确认:已接入网站将停止展示、不可恢复)
- API 56/56、admin 87/87 + build 全绿

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-23 13:37:39 +08:00
parent aa366c4268
commit 903962a46b
12 changed files with 205 additions and 142 deletions
+10 -9
View File
@@ -342,16 +342,17 @@ model user_sync_state {
// embed_slot_members:授权成员表**建而未用**(P4b 权限简化为 admin-only——
// 需求「创建者只操作被授权展示位」的授权面登记偏差,P5 按需出 API/UI)。
model embed_slots {
id String @id @default(cuid())
publicToken String @unique @db.VarChar(32) // 嵌入代码 data-slot 引用(24 字符 [0-9a-z],同相册令牌口径)
name String @db.VarChar(64)
enabled Boolean @default(true)
albumId String? @db.VarChar(64) // 绑定相册;null=未绑定(公开端 404)
configVersion Int @default(1) // 任一管理面变更递增(嵌入端整体重置渲染依据)
id String @id @default(cuid())
publicToken String @unique @db.VarChar(32) // 嵌入代码 data-slot 引用(24 字符 [0-9a-z],同相册令牌口径)
name String @db.VarChar(64)
enabled Boolean @default(true)
albumId String? @db.VarChar(64) // 绑定相册;null=未绑定(公开端 404)
configVersion Int @default(1) // 任一管理面变更递增(嵌入端整体重置渲染依据)
settings Json // EmbedSlotSettings 归一化全集(字段恒齐全)
entityVersion Int @default(1) // slot.updated 事件版本(同 photos 模式)
createdAt DateTime @default(now()) @db.DateTime(6)
updatedAt DateTime @updatedAt @db.DateTime(6)
entityVersion Int @default(1) // slot.updated 事件版本(同 photos 模式)
deletedAt DateTime? @db.DateTime(6) // 软删除(deleteEmbedSlot):列表隐藏;ov 经 enabled=false 快照下线
createdAt DateTime @default(now()) @db.DateTime(6)
updatedAt DateTime @updatedAt @db.DateTime(6)
}
model embed_slot_members {
id String @id @default(cuid())