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
+45 -1
View File
@@ -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;