2026-09-17 19:14:41 +08:00
|
|
|
|
// services/api/test/reset.ts
|
|
|
|
|
|
// e2e 共用隔离工具:每个 e2e spec 的 beforeAll 调用 resetDb(),防止 spec 间
|
|
|
|
|
|
// 唯一约束冲突与脏数据。
|
2026-09-17 19:51:56 +08:00
|
|
|
|
// 实现:SET FOREIGN_KEY_CHECKS=0 包裹逐表 TRUNCATE(users 被 sessions/audit_logs
|
|
|
|
|
|
// 引用,即便子表已清空,存在 FK 约束本身即令 TRUNCATE 失败,必须关检查);
|
|
|
|
|
|
// 表序仍按 FK 安全顺序排列(子表在前),关检查失败时也不至于中途卡死。
|
|
|
|
|
|
// 顺序 await 在 Prisma 连接池上复用同一空闲连接,会话级 FOREIGN_KEY_CHECKS
|
|
|
|
|
|
// 对后续 TRUNCATE 生效;finally 恢复检查并断开,失败也不泄漏连接。
|
2026-09-17 19:14:41 +08:00
|
|
|
|
// TODO(Task 11): 增加 MinIO `photo-live/dev` 前缀对象清理(同一函数内追加)。
|
2026-09-17 19:51:56 +08:00
|
|
|
|
import { PrismaClient } from '@photo/db-cn';
|
|
|
|
|
|
|
|
|
|
|
|
export const RESET_TABLES: readonly string[] = [
|
2026-09-17 20:11:26 +08:00
|
|
|
|
// 照片与上传域 + outbox(Task 10):均为扁平字符串外键(无 FK 约束),
|
|
|
|
|
|
// 顺序按逻辑依赖排列(事件/作业/变体/会话先于 photos)。
|
|
|
|
|
|
'outbox_events',
|
|
|
|
|
|
'photo_jobs',
|
|
|
|
|
|
'photo_variants',
|
|
|
|
|
|
'upload_sessions',
|
|
|
|
|
|
'photos',
|
2026-09-17 20:05:09 +08:00
|
|
|
|
// 相册域(Task 9):子表(翻译/资产/成员)在前,albums 在后;相册域为扁平
|
|
|
|
|
|
// 字符串外键(无 FK 约束),此处顺序仅为逻辑可读,不依赖 FK 检查开关。
|
|
|
|
|
|
'category_translations',
|
|
|
|
|
|
'categories',
|
|
|
|
|
|
'album_assets',
|
|
|
|
|
|
'album_translations',
|
|
|
|
|
|
'album_members',
|
|
|
|
|
|
'albums',
|
|
|
|
|
|
// 身份域(Task 8)。
|
2026-09-17 19:51:56 +08:00
|
|
|
|
'audit_logs',
|
|
|
|
|
|
'sessions',
|
|
|
|
|
|
'users',
|
|
|
|
|
|
];
|
2026-09-17 19:14:41 +08:00
|
|
|
|
|
|
|
|
|
|
export async function resetDb(): Promise<void> {
|
2026-09-17 19:51:56 +08:00
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
|
|
try {
|
|
|
|
|
|
await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 0');
|
|
|
|
|
|
for (const table of RESET_TABLES) {
|
|
|
|
|
|
await prisma.$executeRawUnsafe(`TRUNCATE TABLE ${table}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1');
|
|
|
|
|
|
await prisma.$disconnect();
|
2026-09-17 19:14:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|