cleanup-permission-data.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * 清除 _User 表的权限字段 (role/store/district) + 清空 ResponsibilityAssignment 表
  3. * 用于重置权限数据,方便重新测试
  4. * 注意:总监 (role='director') 不会被清除,因为是管理员
  5. *
  6. * 用法: cd backend && npx tsx scripts/cleanup-permission-data.ts
  7. */
  8. import 'dotenv/config';
  9. import Parse from '../src/db/parse-client.js';
  10. async function main(): Promise<void> {
  11. console.log('=== 清理权限数据 ===');
  12. console.log(`Server: ${Parse.serverURL}`);
  13. console.log(`App ID: ${Parse.applicationId}\n`);
  14. // 验证连接
  15. try {
  16. const n = await new Parse.Query('_User').count({ useMasterKey: true });
  17. console.log(`✅ Parse 连接正常 (_User: ${n} 条)\n`);
  18. } catch (err: any) {
  19. console.error(`❌ Parse 连接失败: ${err.message}`);
  20. process.exit(1);
  21. }
  22. // ======== 1. 清除 _User 权限字段(跳过总监) ========
  23. console.log('--- 1. 清除 _User 权限字段 (role, store, district) ---');
  24. const userQ = new Parse.Query('_User');
  25. userQ.limit(500);
  26. const users = await userQ.find({ useMasterKey: true }) as any[];
  27. let userCleared = 0;
  28. let directorSkipped = 0;
  29. for (const user of users) {
  30. const role = user.get('role');
  31. const store = user.get('store');
  32. const district = user.get('district');
  33. // 跳过总监(管理员),不清除其权限
  34. if (role === 'director') {
  35. directorSkipped++;
  36. continue;
  37. }
  38. if (!role && !store && !district) continue;
  39. user.unset('role');
  40. user.unset('store');
  41. user.unset('district');
  42. await user.save(null, { useMasterKey: true });
  43. userCleared++;
  44. }
  45. console.log(` 已清除 ${userCleared} 个用户的权限字段`);
  46. if (directorSkipped > 0) console.log(` 跳过 ${directorSkipped} 个总监(管理员)`);
  47. // ======== 2. 清空 ResponsibilityAssignment ========
  48. console.log('\n--- 2. 清空 ResponsibilityAssignment 表 ---');
  49. const raQ = new Parse.Query('ResponsibilityAssignment');
  50. raQ.limit(1000);
  51. const assignments = await raQ.find({ useMasterKey: true }) as any[];
  52. if (assignments.length > 0) {
  53. await Parse.Object.destroyAll(assignments, { useMasterKey: true });
  54. console.log(` 已删除 ${assignments.length} 条记录`);
  55. } else {
  56. console.log(' 表中无数据');
  57. }
  58. console.log('\n=== 清理完成 ===');
  59. }
  60. main().catch((err) => {
  61. console.error('失败:', err.message);
  62. process.exit(1);
  63. });