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:
@@ -1816,6 +1816,33 @@ paths:
|
||||
/admin/embed-slots/{id}:
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/EmbedSlotId'
|
||||
delete:
|
||||
operationId: deleteEmbedSlot
|
||||
tags: [embed-slots]
|
||||
summary: 软删除展示位
|
||||
description: >-
|
||||
标记 deletedAt(软删除):管理列表隐藏、公开拉取经 enabled=false 快照
|
||||
同步 ov 后 404(已接入网站停止展示)。数据保留,无恢复端点。
|
||||
admin 专属;幂等(重复删除 204)。
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
'204':
|
||||
description: 已删除(幂等)。
|
||||
'401':
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
'403':
|
||||
description: 非管理员(AUTH_FORBIDDEN)。
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
'404':
|
||||
description: 展示位不存在(EMBED_SLOT_NOT_FOUND,含已删除)。
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
patch:
|
||||
operationId: updateEmbedSlot
|
||||
tags: [embed-slots]
|
||||
|
||||
+45
-1
@@ -813,7 +813,11 @@ export interface paths {
|
||||
get?: never;
|
||||
put?: never;
|
||||
post?: never;
|
||||
delete?: never;
|
||||
/**
|
||||
* 软删除展示位
|
||||
* @description 标记 deletedAt(软删除):管理列表隐藏、公开拉取经 enabled=false 快照 同步 ov 后 404(已接入网站停止展示)。数据保留,无恢复端点。 admin 专属;幂等(重复删除 204)。
|
||||
*/
|
||||
delete: operations["deleteEmbedSlot"];
|
||||
options?: never;
|
||||
head?: never;
|
||||
/**
|
||||
@@ -4659,6 +4663,46 @@ export interface operations {
|
||||
500: components["responses"]["InternalError"];
|
||||
};
|
||||
};
|
||||
deleteEmbedSlot: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path: {
|
||||
/** @description 展示位 ID。 */
|
||||
id: components["parameters"]["EmbedSlotId"];
|
||||
};
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody?: never;
|
||||
responses: {
|
||||
/** @description 已删除(幂等)。 */
|
||||
204: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content?: never;
|
||||
};
|
||||
401: components["responses"]["Unauthorized"];
|
||||
/** @description 非管理员(AUTH_FORBIDDEN)。 */
|
||||
403: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["Error"];
|
||||
};
|
||||
};
|
||||
/** @description 展示位不存在(EMBED_SLOT_NOT_FOUND,含已删除)。 */
|
||||
404: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["Error"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
updateEmbedSlot: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
-- 展示位软删除(deleteEmbedSlot):列表隐藏;ov 经 enabled=false 快照下线。
|
||||
ALTER TABLE `embed_slots` ADD COLUMN `deletedAt` DATETIME(6) NULL;
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user