EternalAI/scripts/migrate-existing-roles-to-s...

80 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 数据迁移脚本将现有角色reviewStatus 为空或默认 pending_review标记为 synced
// 背景:管理员审核 + Hermes 同步流程上线后,角色库过滤改为 reviewStatus='synced'。
// 现有角色是在审核流程上线前创建的,直接标记为 synced 以保持向后兼容。
//
// 用法: node scripts/migrate-existing-roles-to-synced.js
//
// 安全说明:
// - 仅迁移 status='running' 且 reviewStatus='pending_review' 的角色
// - 已有 reviewStatusapproved/synced/rejected/failed的角色不受影响
// - 执行前会打印待迁移数量,需用户确认(除非传入 --yes 跳过确认)
const prisma = require('../src/lib/prisma');
async function main() {
const skipConfirm = process.argv.includes('--yes');
// 查找待迁移角色status='running' 且 reviewStatus='pending_review'
// 这些是审核流程上线前创建的角色
const candidates = await prisma.role.findMany({
where: {
status: 'running',
reviewStatus: 'pending_review',
},
select: { id: true, displayName: true, createdAt: true },
});
console.log(`找到 ${candidates.length} 个待迁移角色status=running 且 reviewStatus=pending_review`);
if (candidates.length === 0) {
console.log('无需迁移');
await prisma.$disconnect();
return;
}
if (!skipConfirm) {
console.log('\n待迁移角色列表前 10 个):');
candidates.slice(0, 10).forEach((r, i) => {
console.log(` ${i + 1}. ${r.displayName} (id=${r.id}, createdAt=${r.createdAt.toISOString()})`);
});
if (candidates.length > 10) {
console.log(` ... 还有 ${candidates.length - 10}`);
}
console.log('\n将这些角色标记为 synced已同步此操作不可逆。');
console.log('确认请输入 yes否则取消:');
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const answer = await new Promise((resolve) => {
rl.question('> ', (a) => {
rl.close();
resolve(a.trim().toLowerCase());
});
});
if (answer !== 'yes') {
console.log('已取消');
await prisma.$disconnect();
return;
}
}
const result = await prisma.role.updateMany({
where: {
status: 'running',
reviewStatus: 'pending_review',
},
data: {
reviewStatus: 'synced',
syncedAt: new Date(),
},
});
console.log(`\n迁移完成:${result.count} 个角色已标记为 synced`);
await prisma.$disconnect();
}
main().catch((err) => {
console.error('迁移失败:', err);
process.exit(1);
});