seed-menu.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // prisma/seed-menu.ts
  2. import { PrismaClient } from '@prisma/mysql/client';
  3. // If you are actually using @prisma/client instead, change to:
  4. // import { PrismaClient } from '@prisma/client';
  5. import { MENU_SEEDS, SeedMenu } from './menu-seeds';
  6. const prisma = new PrismaClient();
  7. async function seedMenus() {
  8. console.log('Seeding menus...');
  9. // ⚠ Optional: wipe existing menus – ONLY if you are sure there are no FK dependencies
  10. // await prisma.menu.deleteMany();
  11. const legacyIdToNewId = new Map<number, number>();
  12. const inserted = new Set<number>();
  13. // Generic multi-pass insertion:
  14. // - Insert records whose parent is either null or already inserted
  15. // - Repeat until all are inserted, or no progress (meaning bad parent links)
  16. let remaining = MENU_SEEDS.length;
  17. while (inserted.size < MENU_SEEDS.length) {
  18. let progress = false;
  19. for (const seed of MENU_SEEDS) {
  20. if (inserted.has(seed.legacyId)) {
  21. continue;
  22. }
  23. // If has a parent, but parent not inserted yet → skip this round
  24. if (
  25. seed.legacyParentId !== null &&
  26. !legacyIdToNewId.has(seed.legacyParentId)
  27. ) {
  28. continue;
  29. }
  30. const parentId =
  31. seed.legacyParentId === null
  32. ? null
  33. : legacyIdToNewId.get(seed.legacyParentId)!;
  34. const created = await prisma.menu.create({
  35. data: {
  36. parentId,
  37. title: seed.title,
  38. status: true, // from original dump (1 = true)
  39. type: seed.type,
  40. order: seed.order,
  41. frontendAuth: null, // or derive something if you decide later
  42. path: seed.path,
  43. name: seed.name,
  44. icon: seed.icon,
  45. redirect: null, // can be filled per menu if needed
  46. component_key: null, // your Prisma field is `component_key`
  47. meta: seed.meta ?? undefined,
  48. // default action flags; adjust if needed
  49. canView: 0,
  50. canCreate: 0,
  51. canUpdate: 0,
  52. canDelete: 0,
  53. // createTime / updateTime are handled by defaults / @updatedAt
  54. },
  55. });
  56. legacyIdToNewId.set(seed.legacyId, created.id);
  57. inserted.add(seed.legacyId);
  58. remaining -= 1;
  59. progress = true;
  60. console.log(
  61. `Inserted menu [legacyId=${seed.legacyId}, newId=${created.id}, name=${seed.name}]`,
  62. );
  63. }
  64. if (!progress) {
  65. // Nothing could be inserted in this pass -> some parentId is invalid or cyclic
  66. const pending = MENU_SEEDS.filter((s) => !inserted.has(s.legacyId)).map(
  67. (s) => ({
  68. legacyId: s.legacyId,
  69. legacyParentId: s.legacyParentId,
  70. }),
  71. );
  72. console.error(
  73. 'Could not resolve parents for the following menus:',
  74. pending,
  75. );
  76. throw new Error(
  77. 'Menu seeding aborted: unresolved parent relationships. Check legacyParentId values.',
  78. );
  79. }
  80. }
  81. console.log('Menu seeding completed successfully.');
  82. }
  83. async function main() {
  84. try {
  85. await seedMenus();
  86. } catch (err) {
  87. console.error('Error during menu seeding:', err);
  88. process.exitCode = 1;
  89. } finally {
  90. await prisma.$disconnect();
  91. }
  92. }
  93. void main();