feat(review): 重构项目级单方案验收协作
This commit is contained in:
@@ -5,7 +5,7 @@ import { newDb } from 'pg-mem';
|
||||
|
||||
const tables = [
|
||||
'operation_groups', 'users', 'projects', 'collections', 'notes', 'images', 'annotations',
|
||||
'work_comments', 'work_versions', 'review_rounds', 'review_events', 'sessions', 'customer_sessions',
|
||||
'work_comments', 'feedback_replies', 'work_versions', 'review_rounds', 'review_events', 'sessions', 'customer_sessions',
|
||||
'audit_logs', 'api_keys', 'storage_configs',
|
||||
] as const;
|
||||
const booleanColumns: Record<string, Set<string>> = {
|
||||
@@ -19,11 +19,16 @@ const sqlite = new Database(path.resolve('data/app.db'), { readonly: true });
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
const schema = fs.readFileSync(path.resolve('db/postgres/schema.sql'), 'utf8')
|
||||
const schemaSource = fs.readFileSync(path.resolve('db/postgres/schema.sql'), 'utf8');
|
||||
if (!/-- SINGLE_SCHEME_REPAIR_START[\s\S]+?-- SINGLE_SCHEME_REPAIR_END/.test(schemaSource)) throw new Error('PostgreSQL schema 缺少旧多方案数据修复脚本');
|
||||
const schema = schemaSource
|
||||
.replace(/^BEGIN;|COMMIT;$/gm, '')
|
||||
.replace(/CREATE UNIQUE INDEX IF NOT EXISTS one_active_storage_config[^;]+;/, '')
|
||||
.replace(/-- COLLECTION_STATUS_REPAIR_START[\s\S]+?-- COLLECTION_STATUS_REPAIR_END/, '')
|
||||
.replace(/-- REVIEW_ROUND_REPAIR_START[\s\S]+?-- REVIEW_ROUND_REPAIR_END/, '');
|
||||
.replace(/-- REVIEW_ROUND_REPAIR_START[\s\S]+?-- REVIEW_ROUND_REPAIR_END/, '')
|
||||
.replace(/-- PROJECT_REVIEW_STATUS_REPAIR_START[\s\S]+?-- PROJECT_REVIEW_STATUS_REPAIR_END/, '')
|
||||
.replace(/-- TEXT_ANNOTATION_TARGET_REPAIR_START[\s\S]+?-- TEXT_ANNOTATION_TARGET_REPAIR_END/, '')
|
||||
.replace(/-- SINGLE_SCHEME_REPAIR_START[\s\S]+?-- SINGLE_SCHEME_REPAIR_END/, '');
|
||||
await client.query(schema);
|
||||
for (const table of tables) {
|
||||
const exists = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(table);
|
||||
@@ -41,7 +46,8 @@ try {
|
||||
if (!current || Number(current.version_number) < 1) throw new Error('作品版本关系未正确迁移');
|
||||
const invalidRoundLinks = Number((await client.query('SELECT COUNT(*)::int AS count FROM work_versions v LEFT JOIN review_rounds r ON r.id=v.review_round_id WHERE r.id IS NULL')).rows[0].count);
|
||||
const invalidActiveRounds = Number((await client.query('SELECT COUNT(*)::int AS count FROM notes n LEFT JOIN review_rounds r ON r.id=n.active_round_id WHERE r.id IS NULL OR r.note_id!=n.id')).rows[0].count);
|
||||
if (invalidRoundLinks || invalidActiveRounds) throw new Error(`验收轮次迁移关联无效:versions=${invalidRoundLinks}, notes=${invalidActiveRounds}`);
|
||||
const invalidProjects = Number((await client.query('SELECT COUNT(*)::int AS count FROM notes n LEFT JOIN projects p ON p.id=n.project_id WHERE p.id IS NULL')).rows[0].count);
|
||||
if (invalidRoundLinks || invalidActiveRounds || invalidProjects) throw new Error(`迁移关联无效:rounds=${invalidRoundLinks}, notes=${invalidActiveRounds}, projects=${invalidProjects}`);
|
||||
const activeStorage = Number((await client.query("SELECT COUNT(*)::int AS count FROM storage_configs WHERE status='active'")).rows[0].count);
|
||||
if (activeStorage > 1) throw new Error('活动对象存储配置超过一个');
|
||||
process.stdout.write(`PostgreSQL schema 与迁移映射验证通过:${tables.length} 张表,当前作品 V${current.version_number},存储=${current.storage_provider}\n`);
|
||||
|
||||
Reference in New Issue
Block a user