@solidstarters/solid-core 1.2.180 → 1.2.183

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dev-grooming-docs/ozzy-prompts.txt +28 -3
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +2 -1
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/controllers/service.controller.d.ts.map +1 -1
  6. package/dist/controllers/service.controller.js +0 -1
  7. package/dist/controllers/service.controller.js.map +1 -1
  8. package/dist/decorators/active-user.decorator.d.ts +1 -1
  9. package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
  10. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  11. package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
  12. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  13. package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
  14. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  15. package/dist/dtos/create-role-metadata.dto.js +45 -1
  16. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  17. package/dist/interfaces.d.ts +20 -0
  18. package/dist/interfaces.d.ts.map +1 -1
  19. package/dist/interfaces.js.map +1 -1
  20. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +7 -1
  21. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  22. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +70 -9
  23. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  24. package/dist/repository/view-metadata.repository.d.ts +1 -0
  25. package/dist/repository/view-metadata.repository.d.ts.map +1 -1
  26. package/dist/repository/view-metadata.repository.js +14 -0
  27. package/dist/repository/view-metadata.repository.js.map +1 -1
  28. package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
  29. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  30. package/dist/seeders/module-metadata-seeder.service.js +259 -202
  31. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  32. package/dist/seeders/permission-metadata-seeder.service.js +0 -1
  33. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  34. package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
  35. package/dist/services/ai-interaction.service.d.ts +3 -3
  36. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  37. package/dist/services/ai-interaction.service.js +5 -5
  38. package/dist/services/ai-interaction.service.js.map +1 -1
  39. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  40. package/dist/services/genai/ingest-metadata.service.js +46 -35
  41. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  42. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts → genai/mcp-handlers/mcp-handler-factory.service.d.ts} +3 -3
  43. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
  44. package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
  45. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
  46. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
  47. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
  48. package/dist/services/{mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js} +19 -20
  49. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
  50. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
  51. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
  52. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
  53. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
  54. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts} +9 -9
  55. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
  56. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js} +13 -13
  57. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
  58. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
  59. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
  60. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js} +8 -8
  61. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
  62. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts} +4 -4
  63. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
  64. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js} +8 -8
  65. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
  66. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
  67. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
  68. package/dist/services/{mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js} +8 -8
  69. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
  70. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
  71. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
  72. package/dist/services/{mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js} +14 -16
  73. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
  74. package/dist/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts} +4 -4
  75. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
  76. package/dist/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-create-module-mcp-handler.service.js} +13 -10
  77. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
  78. package/dist/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts → genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts} +3 -3
  79. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
  80. package/dist/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js → genai/mcp-handlers/solid-update-layout-mcp-handler.service.js} +12 -10
  81. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
  82. package/dist/services/import-transaction.service.js +2 -2
  83. package/dist/services/import-transaction.service.js.map +1 -1
  84. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  85. package/dist/services/menu-item-metadata.service.js +0 -2
  86. package/dist/services/menu-item-metadata.service.js.map +1 -1
  87. package/dist/services/model-metadata.service.d.ts.map +1 -1
  88. package/dist/services/model-metadata.service.js.map +1 -1
  89. package/dist/services/module-metadata.service.d.ts.map +1 -1
  90. package/dist/services/module-metadata.service.js +1 -1
  91. package/dist/services/module-metadata.service.js.map +1 -1
  92. package/dist/services/role-metadata.service.d.ts.map +1 -1
  93. package/dist/services/role-metadata.service.js +1 -7
  94. package/dist/services/role-metadata.service.js.map +1 -1
  95. package/dist/services/solid-ts-morph.service.d.ts +28 -0
  96. package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
  97. package/dist/services/solid-ts-morph.service.js +222 -0
  98. package/dist/services/solid-ts-morph.service.js.map +1 -0
  99. package/dist/solid-core.module.d.ts.map +1 -1
  100. package/dist/solid-core.module.js +22 -18
  101. package/dist/solid-core.module.js.map +1 -1
  102. package/dist/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +6 -4
  104. package/solid_seed_fixes.ts.txt +93 -0
  105. package/src/config/iam.config.ts +2 -1
  106. package/src/controllers/service.controller.ts +4 -1
  107. package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
  108. package/src/dtos/create-role-metadata.dto.ts +60 -1
  109. package/src/interfaces.ts +29 -2
  110. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +74 -8
  111. package/src/repository/view-metadata.repository.ts +15 -0
  112. package/src/seeders/module-metadata-seeder.service.ts +355 -282
  113. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  114. package/src/seeders/seed-data/solid-core-metadata.json +3 -5
  115. package/src/services/ai-interaction.service.ts +3 -5
  116. package/src/services/genai/ingest-metadata.service.ts +115 -39
  117. package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
  118. package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
  119. package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
  120. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.ts} +8 -8
  121. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.ts} +3 -3
  122. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.ts} +3 -3
  123. package/src/services/{mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.ts} +3 -3
  124. package/src/services/{mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.ts} +8 -10
  125. package/src/services/{mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-create-module-mcp-handler.service.ts} +8 -5
  126. package/src/services/{mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.ts → genai/mcp-handlers/solid-update-layout-mcp-handler.service.ts} +11 -5
  127. package/src/services/import-transaction.service.ts +2 -2
  128. package/src/services/menu-item-metadata.service.ts +3 -7
  129. package/src/services/model-metadata.service.ts +0 -3
  130. package/src/services/module-metadata.service.ts +2 -3
  131. package/src/services/role-metadata.service.ts +22 -8
  132. package/src/services/solid-ts-morph.service.ts +263 -0
  133. package/src/solid-core.module.ts +25 -19
  134. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
  135. package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
  136. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
  137. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
  138. package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
  139. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
  140. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
  141. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
  142. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
  143. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
  144. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
  145. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
  146. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
  147. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
  148. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
  149. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
  150. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
  151. package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
  152. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
  153. package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
  154. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
  155. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
  156. package/src/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.ts +0 -56
@@ -2,51 +2,55 @@ import { Inject, Injectable, Logger } from '@nestjs/common';
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
 
5
- import appBuilderConfig from '../config/app-builder.config';
6
5
  import { ConfigType } from '@nestjs/config';
7
- import { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';
8
- import { ModuleMetadataService } from '../services/module-metadata.service';
9
- import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
10
- import { ModelMetadataService } from '../services/model-metadata.service';
11
- import { MediaStorageProviderMetadataService } from '../services/media-storage-provider-metadata.service';
12
- import { FieldMetadataService } from '../services/field-metadata.service';
13
- import { UserService } from 'src/services/user.service';
14
- import { AuthenticationService } from 'src/services/authentication.service';
15
- import { MediaStorageProviderMetadataSeederService } from '../services/media-storage-provider-metadata-seeder.service';
6
+ import { InjectRepository } from '@nestjs/typeorm';
7
+ import commonConfig from 'src/config/common.config';
8
+ import { iamConfig } from 'src/config/iam.config';
9
+ import { CreateDashboardDto } from 'src/dtos/create-dashboard.dto';
16
10
  import { CreateEmailTemplateDto } from 'src/dtos/create-email-template.dto';
11
+ import { CreateListOfValuesDto } from 'src/dtos/create-list-of-values.dto';
12
+ import { CreateSecurityRuleDto } from 'src/dtos/create-security-rule.dto';
13
+ import { CreateSettingDto } from 'src/dtos/create-setting.dto';
14
+ import { CreateSmsTemplateDto } from 'src/dtos/create-sms-template.dto';
15
+ import { Setting } from 'src/entities/setting.entity';
16
+ import { DashboardRepository } from 'src/repository/dashboard.repository';
17
+ import { SecurityRuleRepository } from 'src/repository/security-rule.repository';
18
+ import { AuthenticationService } from 'src/services/authentication.service';
17
19
  import { EmailTemplateService } from 'src/services/email-template.service';
20
+ import { ListOfValuesService } from 'src/services/list-of-values.service';
21
+ import { SettingService } from 'src/services/setting.service';
18
22
  import { SmsTemplateService } from 'src/services/sms-template.service';
19
- import { CreateSmsTemplateDto } from 'src/dtos/create-sms-template.dto';
20
- import { ViewMetadataService } from '../services/view-metadata.service';
21
- import { ActionMetadataService } from '../services/action-metadata.service';
22
- import { MenuItemMetadataService } from '../services/menu-item-metadata.service';
23
- import { InjectRepository } from '@nestjs/typeorm';
23
+ import { UserService } from 'src/services/user.service';
24
+ import { DataSource, In, Repository } from 'typeorm';
25
+ import appBuilderConfig from '../config/app-builder.config';
26
+ import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
27
+ import { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';
24
28
  import { PermissionMetadata } from '../entities/permission-metadata.entity';
25
- import { Repository } from 'typeorm';
29
+ import { getDynamicModuleNames } from '../helpers/module.helper';
26
30
  import { SolidRegistry } from '../helpers/solid-registry';
31
+ import { ActionMetadataService } from '../services/action-metadata.service';
32
+ import { FieldMetadataService } from '../services/field-metadata.service';
33
+ import { MediaStorageProviderMetadataSeederService } from '../services/media-storage-provider-metadata-seeder.service';
34
+ import { MediaStorageProviderMetadataService } from '../services/media-storage-provider-metadata.service';
35
+ import { MenuItemMetadataService } from '../services/menu-item-metadata.service';
36
+ import { ModelMetadataService } from '../services/model-metadata.service';
37
+ import { ModuleMetadataService } from '../services/module-metadata.service';
27
38
  import { RoleMetadataService } from '../services/role-metadata.service';
28
- import { getCoreModuleNames, getDynamicModuleNames } from '../helpers/module.helper';
39
+ import { ViewMetadataService } from '../services/view-metadata.service';
29
40
  import solidCoreMetadata from './seed-data/solid-core-metadata.json';
30
- import { iamConfig } from 'src/config/iam.config';
31
- import commonConfig from 'src/config/common.config';
32
- import { CreateSettingDto } from 'src/dtos/create-setting.dto';
33
- import { SettingService } from 'src/services/setting.service';
34
- import { Setting } from 'src/entities/setting.entity';
35
- import { CreateSecurityRuleDto } from 'src/dtos/create-security-rule.dto';
36
- import { SecurityRuleRepository } from 'src/repository/security-rule.repository';
37
- import { ListOfValuesService } from 'src/services/list-of-values.service';
38
- import { CreateListOfValuesDto } from 'src/dtos/create-list-of-values.dto';
39
41
  import { SystemFieldsSeederService } from './system-fields-seeder.service';
40
- import { CreateDashboardDto } from 'src/dtos/create-dashboard.dto';
41
- import { DashboardRepository } from 'src/repository/dashboard.repository';
42
42
  // import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';
43
- import { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';
43
+ import { ADMIN_ROLE_NAME, INTERNAL_ROLE_NAME, INTERNAL_ROLE_PERMISSIONS, PUBLIC_ROLE_NAME } from 'src/dtos/create-role-metadata.dto';
44
44
  import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';
45
+ import { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';
46
+ import { ActionMetadata, MENU_ROLE_JOIN_TABLE_NAME, MENU_ROLE_JOIN_TABLE_NAME_MENU_COL, MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL, MenuItemMetadata, ModuleMetadata, RoleMetadata } from 'src';
47
+
45
48
 
46
49
  @Injectable()
47
50
  export class ModuleMetadataSeederService {
48
51
  private readonly logger = new Logger(ModuleMetadataSeederService.name);
49
52
 
53
+
50
54
  constructor(
51
55
  private readonly moduleMetadataService: ModuleMetadataService,
52
56
  private readonly modelMetadataService: ModelMetadataService,
@@ -70,238 +74,246 @@ export class ModuleMetadataSeederService {
70
74
  @Inject(iamConfig.KEY) private readonly iamConfiguration: ConfigType<typeof iamConfig>,
71
75
  @Inject(commonConfig.KEY)
72
76
  private readonly commonConfiguration: ConfigType<typeof commonConfig>,
73
- private readonly seetingService: SettingService,
77
+ private readonly settingService: SettingService,
74
78
  @InjectRepository(Setting, 'default')
75
79
  readonly settingsRepo: Repository<Setting>,
76
80
  readonly securityRuleRepo: SecurityRuleRepository,
77
81
  readonly systemFieldsSeederService: SystemFieldsSeederService,
78
82
  readonly dashboardRepo: DashboardRepository,
79
83
  readonly scheduledJobRepository: ScheduledJobRepository,
84
+ readonly dataSource: DataSource,
80
85
  ) { }
81
86
 
82
87
  async seed() {
88
+ // Global seeding steps i.e across all modules
89
+ await this.seedGlobalMetadata();
83
90
 
84
- const typedSolidCoreMetadata: any = structuredClone(solidCoreMetadata);
85
-
86
- // Run the permissions seeder.
87
- // await this.permissionsSeederService.seed();
88
- this.logger.log(`Seeding permissions`);
89
- await this.seedPermissions();
90
-
91
- // TODO: move this also the main loop processing. Generate the media storage providers required by default
92
- this.logger.log(`Seeding media storage providers`);
93
- await this.mediaStorageProviderSeederService.seed();
94
-
95
- // Seed any missing system fields metadata for all models.
96
- this.logger.log(`Seeding system fields metadata`);
97
- await this.systemFieldsSeederService.seed();
98
-
99
- // Read the module metadata from a file specified in the .env
100
- // Add the core json file as the first entry in the above array.
101
- // Please note the sequence of core files is important below...
102
- const coreModules = getCoreModuleNames();
103
- const seedDataFiles = [
104
- // 'src/common/seeders/seed-data/common-metadata.json',
105
- // 'src/iam/seeders/seed-data/iam-metadata.json',
106
- // 'src/app-builder/seeders/seed-data/app-builder-metadata.json',
107
- // 'src/queues/seeders/seed-data/queues-metadata.json',
108
- // ...coreModules.map(module => `src/${module}/seeders/seed-data/${module}-metadata.json`),
109
- typedSolidCoreMetadata
110
- ];
111
- this.logger.debug(`getting dynamics modules`);
112
- const enabledModules = getDynamicModuleNames();
113
- this.logger.log(`Seeding metadata`);
114
-
115
- for (let i = 0; i < enabledModules.length; i++) {
116
- const enabledModule = enabledModules[i];
117
- const enabledModuleSeedFile = `module-metadata/${enabledModule}/${enabledModule}-metadata.json`
118
- const fullPath = path.join(process.cwd(), enabledModuleSeedFile);
119
- if (fs.existsSync(fullPath)) {
120
- const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());
121
-
122
- seedDataFiles.push(overallMetadata)
123
- }
124
- }
125
-
91
+ // Module specific seeding steps.
92
+ // Get all the module metadata files which needs to be seeded.
93
+ const seedDataFiles = this.seedDataFiles;
126
94
  this.logger.debug(`Seed data files are: ${seedDataFiles}`);
127
- let usersDetail;
95
+ // let usersDetail;
96
+ // For each module metadata file, we will process the seeding steps one by one.
128
97
  for (let i = 0; i < seedDataFiles.length; i++) {
129
-
130
- // Module, model & field handling.
131
98
  const overallMetadata = seedDataFiles[i];
132
- // const fullPath = path.join(process.cwd(), seedDataFile);
133
-
134
- // For each module metadata seed file provided, read contents, parse & convert to a variable.
135
- // this.logger.log(`[Start] module seed data: ${fullPath}`);
136
-
137
- // const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());
99
+ const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;
100
+ this.logger.log(`Seeding Metadata for Module: ${moduleMetadata.name}`);
138
101
 
139
102
  // Process module metadata first.
140
- const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;
141
- this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`)
103
+ this.logger.log(`Seeding Module / Model / Fields`);
142
104
  await this.seedModuleModelFields(moduleMetadata);
143
- this.logger.log(`[End] Processing module metadata for ${moduleMetadata.name}`)
144
105
 
145
106
  // Media Storage provider templates
146
- this.logger.log(`[Start] Processing Media Storage Provider for ${moduleMetadata.name}`);
147
- const mediaStorageProviders = overallMetadata.mediaStorageProviders;
148
- await this.seedMediaStorageProviders(mediaStorageProviders);
149
- this.logger.log(`[End] Processing Media Storage Provider for ${moduleMetadata.name}`);
107
+ this.logger.log(`Seeding Media Storage Providers`);
108
+ await this.seedMediaStorageProviders(overallMetadata.mediaStorageProviders);
150
109
 
151
110
  // Custom role handling
152
- this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)
153
- const roles = overallMetadata.roles;
154
-
155
- // Every role configuration in the seeder json can optionally have a permissions attribute.
156
- // While creating roles we are only passing the role name to be used.
157
- await this.roleService.createRolesIfNotExists(roles.map(role => { return { name: role.name } }));
158
-
159
- // After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.
160
- for (let roleI = 0; roleI < roles.length; roleI++) {
161
- const role = roles[roleI];
162
- if (role.permissions) {
163
- await this.roleService.addPermissionsToRole(role.name, role.permissions)
164
- }
165
- }
166
- this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)
111
+ this.logger.log(`Seeding Roles`);
112
+ await this.seedRoles(overallMetadata);
167
113
 
168
114
  // Custom user handling
169
- this.logger.log(`[Start] Processing users for ${moduleMetadata.name}`);
170
- const users = overallMetadata.users;
171
- usersDetail = users;
172
- await this.seedUsers(users);
173
- this.logger.log(`[End] Processing users for ${moduleMetadata.name}`)
115
+ this.logger.log(`Seeding Users`);
116
+ await this.seedUsers(overallMetadata);
174
117
 
175
118
  // Application Module View handling
176
- this.logger.log(`[Start] Processing views for ${moduleMetadata.name}`);
177
- const views = overallMetadata.views;
178
- await this.seedViews(views);
179
- this.logger.log(`[End] Processing views for ${moduleMetadata.name}`)
119
+ this.logger.log(`Seeding Views`);
120
+ await this.seedViews(overallMetadata);
180
121
 
181
122
  // Application Module Action handling
182
- this.logger.log(`[Start] Processing actions for ${moduleMetadata.name}`);
183
- const actions = overallMetadata.actions;
184
- await this.seedActions(actions);
185
- this.logger.log(`[End] Processing actions for ${moduleMetadata.name}`)
123
+ this.logger.log(`Seeding Actions`);
124
+ await this.seedActions(overallMetadata);
186
125
 
187
126
  // Application Module Menu handling
188
- this.logger.log(`[Start] Processing menus for ${moduleMetadata.name}`);
189
- const menus = overallMetadata.menus;
190
- await this.seedMenus(menus);
191
- this.logger.log(`[End] Processing menus for ${moduleMetadata.name}`)
127
+ this.logger.log(`Seeding Menus`);
128
+ await this.seedMenus(overallMetadata);
192
129
 
193
130
  // Email templates
194
- this.logger.log(`[Start] Processing email templates for ${moduleMetadata.name}`);
195
- const emailTemplates: CreateEmailTemplateDto[] = overallMetadata.emailTemplates;
196
- await this.seedEmailTemplates(emailTemplates, moduleMetadata);
197
- this.logger.log(`[End] Processing email templates for ${moduleMetadata.name}`);
131
+ this.logger.log(`Seeding Email Templates`);
132
+ await this.seedEmailTemplates(overallMetadata, moduleMetadata.name);
198
133
 
199
134
  // Sms templates
200
- this.logger.log(`[Start] Processing sms templates for ${moduleMetadata.name}`);
201
- const smsTemplates: CreateSmsTemplateDto[] = overallMetadata.smsTemplates;
202
- await this.seedSmsTemplates(smsTemplates, moduleMetadata);
203
- this.logger.log(`[End] Processing sms templates for ${moduleMetadata.name}`);
135
+ this.logger.log(`Seeding Sms Templates`);
136
+ await this.seedSmsTemplates(overallMetadata, moduleMetadata.name);
204
137
 
205
138
  // Settings
206
- this.logger.log(`[Start] Processing settings for ${moduleMetadata.name}`);
207
- await this.seetingService.seedDefaultSettings();
208
- this.logger.log(`[End] Processing settings for ${moduleMetadata.name}`);
139
+ this.logger.log(`Seeding Default Settings`);
140
+ await this.seedDefaultSettings();
209
141
 
210
142
  // Security rules
211
- this.logger.log(`[Start] Processing security rules for ${moduleMetadata.name}`);
212
- const securityRules: CreateSecurityRuleDto[] = overallMetadata.securityRules;
213
- await this.seedSecurityRules(securityRules);
214
- this.logger.log(`[End] Processing security rules for ${moduleMetadata.name}`);
143
+ this.logger.log(`Seeding Security Rules`);
144
+ await this.seedSecurityRules(overallMetadata);
215
145
 
216
146
  // List Of Values
217
- this.logger.log(`[Start] Processing List Of Values for ${moduleMetadata.name}`);
218
- const listOfValues: CreateListOfValuesDto[] = overallMetadata.listOfValues;
219
- await this.seedListOfValues(listOfValues);
220
- this.logger.log(`[End] Processing List Of Values for ${moduleMetadata.name}`);
147
+ this.logger.log(`Seeding List Of Values`);
148
+ await this.seedListOfValues(moduleMetadata, overallMetadata);
221
149
 
222
150
  // Dashboards
223
- this.logger.log(`[Start] Processing dashboards for ${moduleMetadata.name}`);
224
- const dashboards: CreateDashboardDto[] = overallMetadata.dashboards;
225
- await this.seedDashboards(dashboards);
226
- this.logger.log(`[End] Processing dashboards for ${moduleMetadata.name}`);
151
+ this.logger.log(`Seeding Dashboards`);
152
+ await this.seedDashboards(moduleMetadata, overallMetadata);
227
153
 
228
154
  // Scheduled Jobs
229
- this.logger.debug(`[Start] Processing scheduled jobs for ${moduleMetadata.name}`);
230
- const scheduledJobs: CreateScheduledJobDto[] = overallMetadata.scheduledJobs;
231
- if (scheduledJobs?.length > 0) {
232
- await this.seedScheduledJobs(scheduledJobs);
233
- }
234
- this.logger.debug(`[End] Processing scheduled jobs for ${moduleMetadata.name}`);
155
+ this.logger.log(`Seeding Scheduled Jobs`);
156
+ await this.seedScheduledJobs(moduleMetadata, overallMetadata);
235
157
 
236
158
  this.logger.debug(`[End] module seed data: ${overallMetadata}`);
237
159
  }
238
160
 
239
- // Post seed data file processing.
161
+ // Setup default roles with permissions.
162
+ await this.setupDefaultRolesWithPermissions();
240
163
 
241
- // 1. Give all permissions to the Admin role.
242
- this.logger.log(`About to add all permissions to the Admin role`);
243
- await this.roleService.addAllPermissionsToRole("Admin");
244
- // 2. Give permissions to the Internal / Public role.
245
- const internalRolePermission = [
246
- // User permissions
247
- 'UserController.findMany', //Why do we need this?
248
- 'UserController.checkIfPermissionExists',
249
- 'UserController.findOne',
250
- // Menu permissions
251
- 'MenuItemMetadataController.findMany',
252
- 'MenuItemMetadataController.findUserMenus',
253
- 'MenuItemMetadataController.findOne',
254
- // View metadata permissions
255
- 'ViewMetadataController.getLayout',
256
- 'ViewMetadataController.findMany',
257
- 'ViewMetadataController.findOne',
258
- // IAM permissions
259
- 'AuthenticationController.changePassword',
260
- // Field Metadata permissions
261
- 'FieldMetadataController.getSelectionDynamicValues',
262
- 'FieldMetadataController.getSelectionDynamicValue',
263
- 'FieldMetadataController.findFieldDefaultMetaData',
264
- // Saved Filters permissions
265
- 'SavedFiltersController.delete',
266
- 'SavedFiltersController.deleteMany',
267
- 'SavedFiltersController.findOne',
268
- 'SavedFiltersController.findMany',
269
- 'SavedFiltersController.recover',
270
- 'SavedFiltersController.recoverMany',
271
- 'SavedFiltersController.partialUpdate',
272
- 'SavedFiltersController.update',
273
- 'SavedFiltersController.insertMany',
274
- 'SavedFiltersController.create',
275
- // Logout permissions
276
- 'AuthenticationController.logout',
277
- // Other permissions can be added here as required.
278
- // Chatter permissions
279
- 'ChatterMessageController.create',
280
- 'ChatterMessageController.getChatterMessages',
281
- // 'ChatterMessageController.postMessage', // Does not seem to be used from ui
282
- // Import
283
- 'ImportTransactionController.getImportTemplate',
284
- 'ImportTransactionController.getImportInstructions',
285
- 'ImportTransactionController.getImportMappingInfo',
286
- 'ImportTransactionController.startImportSync',
287
- 'ImportTransactionController.startImportAsync',
288
- 'ImportTransactionController.exportFailedImportedImports',
289
- // Export permissions
290
- 'ExportTemplateController.startExportSync',
291
- 'ExportTemplateController.startExportAsync',
292
- // List of values
293
- 'ListOfValuesController.findMany',
294
- 'ListOfValuesController.findOne',
295
- // Media // [Not required], since media is always populated as part of a model
296
- ]
297
- await this.roleService.addPermissionToRole('Internal User', internalRolePermission);
298
- await this.roleService.addPermissionToRole('Public', ['SettingController.wrapSettings', 'AuthenticationController.logout']);
299
164
  this.logger.log(`All Seeders finished`);
300
- this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
165
+
166
+ //FIXME: Handle displaying the created users credentials in a better way.
167
+ // this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
168
+ }
169
+
170
+ private async seedScheduledJobs(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any) {
171
+ this.logger.debug(`[Start] Processing scheduled jobs for ${moduleMetadata.name}`);
172
+ const scheduledJobs: CreateScheduledJobDto[] = overallMetadata.scheduledJobs;
173
+ if (scheduledJobs?.length > 0) {
174
+ await this.handleSeedScheduledJobs(scheduledJobs);
175
+ }
176
+ this.logger.debug(`[End] Processing scheduled jobs for ${moduleMetadata.name}`);
177
+ }
178
+
179
+ private async seedDashboards(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any) {
180
+ this.logger.debug(`[Start] Processing dashboards for ${moduleMetadata.name}`);
181
+ const dashboards: CreateDashboardDto[] = overallMetadata.dashboards;
182
+ await this.handleSeedDashboards(dashboards);
183
+ this.logger.debug(`[End] Processing dashboards for ${moduleMetadata.name}`);
184
+ }
185
+
186
+ private async seedListOfValues(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any) {
187
+ this.logger.debug(`[Start] Processing List Of Values for ${moduleMetadata.name}`);
188
+ const listOfValues: CreateListOfValuesDto[] = overallMetadata.listOfValues;
189
+ await this.handleSeedListOfValues(listOfValues);
190
+ this.logger.debug(`[End] Processing List Of Values for ${moduleMetadata.name}`);
191
+ }
192
+
193
+ private async setupDefaultRolesWithPermissions() {
194
+ this.logger.debug(`About to add all permissions to the Admin role`);
195
+ await this.roleService.addAllPermissionsToRole(ADMIN_ROLE_NAME);
196
+ // 2. Give permissions to the Internal / Public role.
197
+ this.logger.debug(`About to add all permissions to the Internal role`);
198
+ await this.roleService.addPermissionToRole(INTERNAL_ROLE_NAME, INTERNAL_ROLE_PERMISSIONS);
199
+ this.logger.debug(`About to add all permissions to the Public role`);
200
+ await this.roleService.addPermissionToRole(PUBLIC_ROLE_NAME, ['SettingController.wrapSettings', 'AuthenticationController.logout']);
201
+ }
202
+
203
+ private async seedSecurityRules(overallMetadata: any) {
204
+ this.logger.debug(`[Start] Processing security rules`);
205
+ const securityRules: CreateSecurityRuleDto[] = overallMetadata.securityRules;
206
+ await this.handleSeedSecurityRules(securityRules);
207
+ this.logger.debug(`[End] Processing security rules`);
208
+ }
209
+
210
+ // Ok
211
+ private async seedDefaultSettings() {
212
+ this.logger.debug(`[Start] Processing settings`);
213
+ await this.settingService.seedDefaultSettings();
214
+ this.logger.debug(`[End] Processing settings`);
215
+ }
216
+
217
+ private async seedSmsTemplates(overallMetadata: any, moduleName: string) {
218
+ this.logger.debug(`[Start] Processing sms templates`);
219
+ const smsTemplates: CreateSmsTemplateDto[] = overallMetadata.smsTemplates;
220
+ await this.handleSeedSmsTemplates(smsTemplates, moduleName);
221
+ this.logger.debug(`[End] Processing sms templates`);
222
+ }
223
+
224
+ // OK
225
+ private async seedEmailTemplates(overallMetadata: any, moduleName: string) {
226
+ this.logger.debug(`[Start] Processing email templates`);
227
+ const emailTemplates: CreateEmailTemplateDto[] = overallMetadata.emailTemplates;
228
+ await this.handleSeedEmailTemplates(emailTemplates, moduleName);
229
+ this.logger.debug(`[End] Processing email templates`);
230
+ }
231
+
232
+ // Ok
233
+ private async seedMenus(overallMetadata: any) {
234
+ this.logger.debug(`[Start] Processing menus`);
235
+ const menus = overallMetadata.menus;
236
+ await this.handleSeedMenus(menus);
237
+ this.logger.debug(`[End] Processing menus`);
238
+ }
239
+
240
+ // Ok
241
+ private async seedActions(overallMetadata: any) {
242
+ this.logger.debug(`[Start] Processing actions`);
243
+ const actions = overallMetadata.actions;
244
+ await this.handleSeedActions(actions);
245
+ this.logger.debug(`[End] Processing actions`);
246
+ }
247
+
248
+ // Ok
249
+ private async seedViews(overallMetadata: any) {
250
+ this.logger.debug(`[Start] Processing views`);
251
+ const views = overallMetadata.views;
252
+ await this.handleSeedViews(views);
253
+ this.logger.debug(`[End] Processing views`);
254
+ }
255
+
256
+ // Ok
257
+ private async seedUsers(overallMetadata: any) {
258
+ this.logger.debug(`[Start] Processing users`);
259
+ const users = overallMetadata.users;
260
+ // usersDetail = users;
261
+ await this.handleSeedUsers(users);
262
+ this.logger.debug(`[End] Processing users`);
263
+ }
264
+
265
+ // OK
266
+ private async seedRoles(overallMetadata: any) {
267
+ this.logger.debug(`[Start] Processing roles`);
268
+ // While creating roles we are only passing the role name to be used.
269
+ await this.roleService.createRolesIfNotExists(overallMetadata.roles.map(role => { return { name: role.name }; }));
270
+ // After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.
271
+ // Every role configuration in the seeder json can optionally have a permissions attribute.
272
+ for (const role of overallMetadata.roles) {
273
+ if (role.permissions) {
274
+ await this.roleService.addPermissionsToRole(role.name, role.permissions);
275
+ }
276
+ }
277
+ this.logger.debug(`[End] Processing roles`);
278
+ }
279
+
280
+ // OK
281
+ private get seedDataFiles(): any[] {
282
+ const typedSolidCoreMetadata = structuredClone(solidCoreMetadata);
283
+ const seedDataFiles = [typedSolidCoreMetadata];
284
+ const enabledModules = getDynamicModuleNames();
285
+ for (const enabledModule of enabledModules) {
286
+ const enabledModuleSeedFile = `module-metadata/${enabledModule}/${enabledModule}-metadata.json`;
287
+ const fullPath = path.join(process.cwd(), enabledModuleSeedFile);
288
+
289
+ if (fs.existsSync(fullPath)) {
290
+ const overallMetadata = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
291
+ seedDataFiles.push(overallMetadata);
292
+ }
293
+ }
294
+
295
+ return seedDataFiles;
296
+ }
297
+
298
+ // OK
299
+ private async seedGlobalMetadata() {
300
+ this.logger.log(`Seeding Permissions`);
301
+ await this.seedPermissions();
302
+
303
+ this.logger.log(`Seeding Default Media Storage Providers`);
304
+ await this.seedDefaultMediaStorageProviders();
305
+
306
+ this.logger.log(`Seeding System Fields Metadata`);
307
+ await this.seedDefaultSystemFields();
308
+ }
309
+
310
+ private async seedDefaultSystemFields() {
311
+ await this.systemFieldsSeederService.seed();
301
312
  }
302
313
 
303
314
 
304
- async seedPermissions() {
315
+ // OK
316
+ private async seedPermissions() {
305
317
 
306
318
  const controllers = this.solidRegistry.getControllers();
307
319
 
@@ -309,7 +321,7 @@ export class ModuleMetadataSeederService {
309
321
  for (let id = 0; id < controllers.length; id++) {
310
322
  try {
311
323
  const controller = controllers[id];
312
- this.logger.log(`Resolving controller: ${controller.name}`);
324
+ // this.logger.log(`Resolving controller: ${controller.name}`);
313
325
 
314
326
  const methods = controller.methods;
315
327
  for (let mId = 0; mId < methods.length; mId++) {
@@ -323,10 +335,13 @@ export class ModuleMetadataSeederService {
323
335
  }
324
336
  });
325
337
 
326
- if (existingPermission) {
327
- this.logger.log(`Permission ${permissionName} already exists.`);
328
- }
329
- else {
338
+ // if (existingPermission) {
339
+ // this.logger.log(`Permission ${permissionName} already exists.`);
340
+ // }
341
+ // else { }
342
+
343
+ if (!existingPermission) {
344
+
330
345
  this.logger.log(`Permission ${permissionName} does not exist, creating new.`);
331
346
 
332
347
  const newPermission = this.permissionRepo.create({
@@ -334,6 +349,7 @@ export class ModuleMetadataSeederService {
334
349
  });
335
350
  await this.permissionRepo.save(newPermission);
336
351
 
352
+
337
353
  }
338
354
  }
339
355
 
@@ -343,37 +359,47 @@ export class ModuleMetadataSeederService {
343
359
  }
344
360
  }
345
361
 
346
- async seedMediaStorageProviders(mediaStorageProviders: any) {
362
+ // OK
363
+ private async seedDefaultMediaStorageProviders() {
364
+ await this.mediaStorageProviderSeederService.seed();
365
+ }
366
+
367
+ // OK
368
+ private async seedMediaStorageProviders(mediaStorageProviders: any[]) {
369
+ this.logger.debug(`[Start] Processing Media Storage Provider`);
370
+
347
371
  for (let i = 0; i < mediaStorageProviders.length; i++) {
348
- const mediaStorageProivder = mediaStorageProviders[i];
349
- await this.mediaStorageProviderMetadataService.upsert(mediaStorageProivder);
372
+ const mediaStorageProvider = mediaStorageProviders[i];
373
+ await this.mediaStorageProviderMetadataService.upsert(mediaStorageProvider);
350
374
  }
375
+ this.logger.debug(`[End] Processing Media Storage Provider`);
351
376
  }
352
377
 
353
- async seedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleMetadata: CreateModuleMetadataDto) {
378
+ // OK
379
+ private async handleSeedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleName: string) {
354
380
  if (!emailTemplates) {
355
381
  return;
356
382
  }
357
383
 
358
384
  for (let i = 0; i < emailTemplates.length; i++) {
359
385
  const emailTemplate = emailTemplates[i];
360
- this.logger.log(`Found ${emailTemplate.name} email template`);
386
+ // this.logger.log(`Found ${emailTemplate.name} email template`);
361
387
 
362
388
  // We need to load the actual template contents.
363
- if (moduleMetadata.name === 'solid-core') {
389
+ if (moduleName === 'solid-core') {
364
390
  const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));
365
391
  const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/email-templates');
366
392
  const filePath = path.join(seedDataPath, emailTemplate.body);
367
- this.logger.log(`Seeding email template from solid-core at path: ${filePath}`);
393
+ // this.logger.log(`Seeding email template from solid-core at path: ${filePath}`);
368
394
  if (fs.existsSync(filePath)) {
369
395
  emailTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();
370
396
  }
371
397
  }
372
398
  else {
373
399
  // Check if file exists
374
- const emailTemplateHandlebar = `module-metadata/${moduleMetadata.name}/email-templates/${emailTemplate.body}`
400
+ const emailTemplateHandlebar = `module-metadata/${moduleName}/email-templates/${emailTemplate.body}`
375
401
  const fullPath = path.join(process.cwd(), emailTemplateHandlebar);
376
- this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);
402
+ // this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);
377
403
  if (fs.existsSync(fullPath)) {
378
404
  emailTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();
379
405
  }
@@ -386,30 +412,31 @@ export class ModuleMetadataSeederService {
386
412
 
387
413
  }
388
414
 
389
- async seedSmsTemplates(smsTemplates: CreateSmsTemplateDto[], moduleMetadata: CreateModuleMetadataDto) {
415
+ // Ok
416
+ private async handleSeedSmsTemplates(smsTemplates: CreateSmsTemplateDto[], moduleName: string) {
390
417
  if (!smsTemplates) {
391
418
  return;
392
419
  }
393
420
 
394
421
  for (let i = 0; i < smsTemplates.length; i++) {
395
422
  const smsTemplate = smsTemplates[i];
396
- this.logger.log(`Found ${smsTemplate.name} sms template`);
423
+ // this.logger.log(`Found ${smsTemplate.name} sms template`);
397
424
 
398
425
  // We need to load the actual template contents.
399
- if (moduleMetadata.name === 'solid-core') {
426
+ if (moduleName === 'solid-core') {
400
427
  const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));
401
428
  const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/sms-templates');
402
429
  const filePath = path.join(seedDataPath, smsTemplate.body);
403
- this.logger.log(`Seeding sms template from solid-core at path: ${filePath}`);
430
+ // this.logger.log(`Seeding sms template from solid-core at path: ${filePath}`);
404
431
  if (fs.existsSync(filePath)) {
405
432
  smsTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();
406
433
  }
407
434
  }
408
435
  else {
409
436
  // Check if file exists
410
- const emailTemplateHandlebar = `module-metadata/${moduleMetadata.name}/sms-templates/${smsTemplate.body}`
437
+ const emailTemplateHandlebar = `module-metadata/${moduleName}/sms-templates/${smsTemplate.body}`
411
438
  const fullPath = path.join(process.cwd(), emailTemplateHandlebar);
412
- this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);
439
+ // this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);
413
440
  if (fs.existsSync(fullPath)) {
414
441
  smsTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();
415
442
  }
@@ -422,45 +449,99 @@ export class ModuleMetadataSeederService {
422
449
  }
423
450
  }
424
451
 
425
- async seedMenus(menus: any) {
452
+ // Not OK
453
+ private async handleSeedMenus(menus: any) {
426
454
  if (!menus) {
427
455
  return;
428
456
  }
429
457
 
430
- for (let j = 0; j < menus.length; j++) {
431
- const menuData = menus[j];
432
-
433
- const adminRole = await this.roleService.findRoleByName('Admin');
434
-
435
- const specifiedRoles = menuData['roles'];
458
+ await this.dataSource.transaction(async (trx) => {
459
+ const menuRepo = trx.getRepository(MenuItemMetadata);
460
+ const roleRepo = trx.getRepository(RoleMetadata);
461
+ const actionRepo = trx.getRepository(ActionMetadata);
462
+ const moduleRepo = trx.getRepository(ModuleMetadata);
463
+
464
+ // 1) Upsert menus WITHOUT roles
465
+ for (const m of menus) {
466
+ const entity = menuRepo.create({
467
+ name: m.name,
468
+ displayName: m.displayName,
469
+ action: m.actionUserKey
470
+ ? await actionRepo.findOne({ where: { name: m.actionUserKey }, select: ["id"] })
471
+ : null,
472
+ module: m.moduleUserKey
473
+ ? await moduleRepo.findOne({ where: { name: m.moduleUserKey }, select: ["id"] })
474
+ : null,
475
+ parentMenuItem: m.parentMenuItemUserKey
476
+ ? await menuRepo.findOne({ where: { name: m.parentMenuItemUserKey }, select: ["id"] })
477
+ : null,
478
+ });
479
+ await menuRepo.upsert(entity, ["name"]); // or ["userKey"]
480
+ }
436
481
 
437
- // If the developer has specified roles, then resolve them, making sure that admin role is also given.
438
- const specifiedRoleObjects = [adminRole];
439
- if (specifiedRoles) {
440
- for (let i = 0; i < specifiedRoles.length; i++) {
441
- const specifiedRole = specifiedRoles[i];
442
- const specifiedRoleObject = await this.roleService.findRoleByName(specifiedRole);
443
- if (!specifiedRoleObject) {
444
- throw new Error(`Invalid role: (${specifiedRole}) specified against menu with display name ${menuData.displayName}.`);
445
- }
446
- specifiedRoleObjects.push(specifiedRoleObject);
482
+ // 2) Fetch ids for batching
483
+ const seeded = await menuRepo.find({
484
+ where: { name: In(menus.map((m: any) => m.name)) },
485
+ select: ["id", "name"],
486
+ });
487
+ const idByName = new Map(seeded.map(s => [s.name, s.id]));
488
+
489
+ // 3) Build desired join rows once
490
+ const admin = await roleRepo.findOne({ where: { name: ADMIN_ROLE_NAME }, select: ["id", "name"] });
491
+ const allRoleNames = new Set<string>();
492
+ for (const m of menus) (m.roles ?? []).forEach((r: string) => allRoleNames.add(r));
493
+ if (admin) allRoleNames.add(admin.name);
494
+
495
+ const roles = await roleRepo.find({
496
+ where: { name: In([...allRoleNames]) },
497
+ select: ["id", "name"],
498
+ });
499
+ const roleByName = new Map(roles.map(r => [r.name, r]));
500
+
501
+ const joinRows: Array<{ menuId: number; roleId: number }> = [];
502
+ for (const m of menus) {
503
+ const menuId = idByName.get(m.name)!;
504
+ const roleNames = new Set<string>([...(m.roles ?? []), admin?.name].filter(Boolean) as string[]);
505
+ for (const rn of roleNames) {
506
+ const role = roleByName.get(rn);
507
+ if (role) joinRows.push({ menuId, roleId: role.id });
447
508
  }
448
509
  }
449
510
 
450
- menuData['roles'] = specifiedRoleObjects;
451
- menuData['action'] = await this.solidActionService.findOneByUserKey(menuData.actionUserKey);
452
- menuData['module'] = await this.moduleMetadataService.findOneByUserKey(menuData.moduleUserKey);
511
+ // 4) Replace in bulk — QueryBuilder version
512
+
513
+ // 4a) delete existing for affected menus
514
+ const menuIds = [...new Set(joinRows.map(r => r.menuId))];
515
+ if (menuIds.length) {
516
+ await trx
517
+ .createQueryBuilder()
518
+ .delete()
519
+ .from(MENU_ROLE_JOIN_TABLE_NAME) // string table name is fine
520
+ .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids: menuIds })
521
+ .execute();
522
+ }
453
523
 
454
- if (menuData.parentMenuItemUserKey) {
455
- menuData['parentMenuItem'] = await this.solidMenuItemService.findOneByUserKey(menuData.parentMenuItemUserKey);
456
- } else {
457
- menuData['parentMenuItem'] = null
524
+ // 4b) bulk insert all pairs
525
+ if (joinRows.length) {
526
+ // Build objects with the exact column names used by the join table
527
+ const values = joinRows.map(r => ({
528
+ [MENU_ROLE_JOIN_TABLE_NAME_MENU_COL]: r.menuId,
529
+ [MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL]: r.roleId,
530
+ }));
531
+
532
+ await trx
533
+ .createQueryBuilder()
534
+ .insert()
535
+ .into(MENU_ROLE_JOIN_TABLE_NAME) // string table name
536
+ .values(values)
537
+ .orIgnore() // optional if you have a UNIQUE(menuItemId, roleId) and want to skip dups
538
+ .execute();
458
539
  }
459
- await this.solidMenuItemService.upsert(menuData);
460
- }
540
+ });
461
541
  }
462
542
 
463
- async seedActions(actions: any) {
543
+ // Ok
544
+ private async handleSeedActions(actions: any) {
464
545
  if (!actions) {
465
546
  return;
466
547
  }
@@ -481,7 +562,8 @@ export class ModuleMetadataSeederService {
481
562
  }
482
563
  }
483
564
 
484
- async seedViews(views: any) {
565
+ // Ok
566
+ private async handleSeedViews(views: any) {
485
567
  if (!views) {
486
568
  return;
487
569
  }
@@ -491,20 +573,17 @@ export class ModuleMetadataSeederService {
491
573
 
492
574
  // preety format the layout & context.
493
575
  viewData['layout'] = JSON.stringify(viewData['layout'], null, 2);
494
- // viewData['context'] = JSON.stringify(viewData['context'], null, 2);
495
576
 
496
577
  viewData['module'] = await this.moduleMetadataService.findOneByUserKey(viewData.moduleUserKey);
497
578
  viewData['model'] = await this.modelMetadataService.findOneByUserKey(viewData.modelUserKey);
498
- // await this.solidViewService.upsert(viewData);
499
- // First check if module already exists using name
500
579
 
501
580
  // Changed the below to upsert as now we are saving modifications to the view json to file system also.
502
- // await this.solidViewService.createIfNotPresent(viewData);
503
581
  await this.solidViewService.upsert(viewData);
504
582
  }
505
583
  }
506
584
 
507
- async seedUsers(users) {
585
+ // OK
586
+ private async handleSeedUsers(users) {
508
587
  if (!users) {
509
588
  return;
510
589
  }
@@ -517,6 +596,7 @@ export class ModuleMetadataSeederService {
517
596
 
518
597
  this.logger.log(`Newly created user is ${user}`);
519
598
  }
599
+ //FIXME: Create the user roles assignment logic here.
520
600
  // now add Roles to user.
521
601
  // for (let m = 0; m < roles.length; m++) {
522
602
  // const role = roles[m];
@@ -525,11 +605,11 @@ export class ModuleMetadataSeederService {
525
605
  }
526
606
  }
527
607
 
528
- async seedModuleModelFields(moduleMetadata: CreateModuleMetadataDto) {
608
+ // OK
609
+ private async seedModuleModelFields(moduleMetadata: CreateModuleMetadataDto) {
610
+ this.logger.debug(`[Start] Processing module metadata`);
529
611
 
530
612
  // First we create the module.
531
- // await this.moduleMetadataService.removeByName(moduleMetadata.name);
532
- // const module = await this.moduleMetadataService.create(moduleMetadata);
533
613
  const module = await this.moduleMetadataService.upsert(moduleMetadata);
534
614
 
535
615
  // Next create all the models.
@@ -538,16 +618,7 @@ export class ModuleMetadataSeederService {
538
618
  const modelMetadata = modelsMetadata[j];
539
619
 
540
620
  // Before creating the model, we need to make sure we are linking it to the newly created module.
541
- // modelMetdata['moduleId'] = module.id;
542
621
  modelMetadata['module'] = module;
543
-
544
- // Please note that all the fields will also get created as we have setup the relation in model.entity.ts as cascade=true
545
- // await this.modelMetadataService.removeBySingularName(modelMetdata.singularName);
546
- // await this.modelMetadataService.modelSeeder(modelMetdata);
547
-
548
- // upsert the model information.
549
- // const fieldsMetadata = modelMetdata.fields;
550
- // delete modelMetdata['fields'];
551
622
  const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = modelMetadata;
552
623
 
553
624
  // Load and set the parent model if it exists.
@@ -565,7 +636,7 @@ export class ModuleMetadataSeederService {
565
636
  for (let k = 0; k < fieldsMetadata.length; k++) {
566
637
  const fieldMetadata = fieldsMetadata[k];
567
638
 
568
- // TODO: resolve model & mediaStorageProvider.
639
+ // Link model & mediaStorageProvider.
569
640
  fieldMetadata['model'] = model;
570
641
  if (fieldMetadata.mediaStorageProviderUserKey) {
571
642
  fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOneByUserKey(fieldMetadata.mediaStorageProviderUserKey);
@@ -585,16 +656,17 @@ export class ModuleMetadataSeederService {
585
656
  await this.modelMetadataService.upsert(modelMetaDataWithoutFields);
586
657
  }
587
658
  }
659
+ this.logger.debug(`[End] Processing module metadata`);
588
660
  }
589
661
 
590
- async seedSettings(createDto: CreateSettingDto) {
662
+ private async seedSettings(createDto: CreateSettingDto) {
591
663
  const settingsArray: any[] = await this.settingsRepo.find();
592
664
  if (!settingsArray || settingsArray.length === 0) {
593
- this.seetingService.create(createDto);
665
+ this.settingService.create(createDto);
594
666
  }
595
667
  }
596
668
 
597
- async seedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {
669
+ private async handleSeedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {
598
670
  if (!rulesDto || rulesDto.length === 0) {
599
671
  this.logger.debug(`No security rules found to seed`);
600
672
  return;
@@ -604,7 +676,8 @@ export class ModuleMetadataSeederService {
604
676
  }
605
677
  }
606
678
 
607
- async seedListOfValues(listOfValuesDto: CreateListOfValuesDto[]) {
679
+ // Not Ok
680
+ private async handleSeedListOfValues(listOfValuesDto: CreateListOfValuesDto[]) {
608
681
  if (!listOfValuesDto || listOfValuesDto.length === 0) {
609
682
  this.logger.debug(`No List Of Values found to seed`);
610
683
  return;
@@ -616,7 +689,7 @@ export class ModuleMetadataSeederService {
616
689
  }
617
690
  }
618
691
 
619
- async seedDashboards(dashboardDtos: CreateDashboardDto[]) {
692
+ private async handleSeedDashboards(dashboardDtos: CreateDashboardDto[]) {
620
693
  if (!dashboardDtos || dashboardDtos.length === 0) {
621
694
  this.logger.debug(`No dashboards found to seed`);
622
695
  return;
@@ -626,7 +699,7 @@ export class ModuleMetadataSeederService {
626
699
  }
627
700
  }
628
701
 
629
- async seedScheduledJobs(createScheduledJobDto: CreateScheduledJobDto[]) {
702
+ private async handleSeedScheduledJobs(createScheduledJobDto: CreateScheduledJobDto[]) {
630
703
  if (!createScheduledJobDto || createScheduledJobDto.length === 0) {
631
704
  this.logger.debug(`No scheduled jobs found to seed`);
632
705
  return;