/** * 清除 _User 表的权限字段 (role/store/district) + 清空 ResponsibilityAssignment 表 * 用于重置权限数据,方便重新测试 * 注意:总监 (role='director') 不会被清除,因为是管理员 * * 用法: cd backend && npx tsx scripts/cleanup-permission-data.ts */ import 'dotenv/config'; import Parse from '../src/db/parse-client.js'; async function main(): Promise { console.log('=== 清理权限数据 ==='); console.log(`Server: ${Parse.serverURL}`); console.log(`App ID: ${Parse.applicationId}\n`); // 验证连接 try { const n = await new Parse.Query('_User').count({ useMasterKey: true }); console.log(`✅ Parse 连接正常 (_User: ${n} 条)\n`); } catch (err: any) { console.error(`❌ Parse 连接失败: ${err.message}`); process.exit(1); } // ======== 1. 清除 _User 权限字段(跳过总监) ======== console.log('--- 1. 清除 _User 权限字段 (role, store, district) ---'); const userQ = new Parse.Query('_User'); userQ.limit(500); const users = await userQ.find({ useMasterKey: true }) as any[]; let userCleared = 0; let directorSkipped = 0; for (const user of users) { const role = user.get('role'); const store = user.get('store'); const district = user.get('district'); // 跳过总监(管理员),不清除其权限 if (role === 'director') { directorSkipped++; continue; } if (!role && !store && !district) continue; user.unset('role'); user.unset('store'); user.unset('district'); await user.save(null, { useMasterKey: true }); userCleared++; } console.log(` 已清除 ${userCleared} 个用户的权限字段`); if (directorSkipped > 0) console.log(` 跳过 ${directorSkipped} 个总监(管理员)`); // ======== 2. 清空 ResponsibilityAssignment ======== console.log('\n--- 2. 清空 ResponsibilityAssignment 表 ---'); const raQ = new Parse.Query('ResponsibilityAssignment'); raQ.limit(1000); const assignments = await raQ.find({ useMasterKey: true }) as any[]; if (assignments.length > 0) { await Parse.Object.destroyAll(assignments, { useMasterKey: true }); console.log(` 已删除 ${assignments.length} 条记录`); } else { console.log(' 表中无数据'); } console.log('\n=== 清理完成 ==='); } main().catch((err) => { console.error('失败:', err.message); process.exit(1); });