@solidstarters/solid-core 1.2.179 → 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.
- package/dev-grooming-docs/ozzy-prompts.txt +28 -3
- package/dist/config/iam.config.d.ts.map +1 -1
- package/dist/config/iam.config.js +2 -1
- package/dist/config/iam.config.js.map +1 -1
- package/dist/controllers/service.controller.d.ts +8 -1
- package/dist/controllers/service.controller.d.ts.map +1 -1
- package/dist/controllers/service.controller.js +38 -2
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/decorators/active-user.decorator.d.ts +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.d.ts +3 -0
- package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.js +4 -1
- package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts +4 -0
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +45 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/helpers/date.helper.d.ts +2 -0
- package/dist/helpers/date.helper.d.ts.map +1 -0
- package/dist/helpers/date.helper.js +18 -0
- package/dist/helpers/date.helper.js.map +1 -0
- package/dist/interfaces.d.ts +20 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +7 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +82 -17
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/repository/view-metadata.repository.d.ts +1 -0
- package/dist/repository/view-metadata.repository.d.ts.map +1 -1
- package/dist/repository/view-metadata.repository.js +14 -0
- package/dist/repository/view-metadata.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +52 -42
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +259 -202
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js +0 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2 -3
- package/dist/services/ai-interaction.service.d.ts +3 -3
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +16 -9
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/excel.service.js +2 -2
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +46 -35
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- 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
- package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts.map +1 -0
- package/dist/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js → genai/mcp-handlers/mcp-handler-factory.service.js} +10 -10
- package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +75 -0
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +12 -0
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +14 -0
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +1 -0
- 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} +15 -17
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +1 -0
- 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
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +1 -0
- package/dist/services/import-transaction.service.d.ts.map +1 -1
- package/dist/services/import-transaction.service.js +6 -3
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +0 -2
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +1 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +1 -7
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.d.ts +28 -0
- package/dist/services/solid-ts-morph.service.d.ts.map +1 -0
- package/dist/services/solid-ts-morph.service.js +222 -0
- package/dist/services/solid-ts-morph.service.js.map +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -18
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -4
- package/solid_seed_fixes.ts.txt +93 -0
- package/src/config/iam.config.ts +2 -1
- package/src/controllers/service.controller.ts +43 -2
- package/src/dtos/create-menu-item-metadata.dto.ts +5 -1
- package/src/dtos/create-role-metadata.dto.ts +60 -1
- package/src/helpers/date.helper.ts +13 -0
- package/src/interfaces.ts +29 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +86 -16
- package/src/repository/view-metadata.repository.ts +15 -0
- package/src/seeders/module-metadata-seeder.service.ts +355 -282
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +3 -5
- package/src/services/ai-interaction.service.ts +17 -13
- package/src/services/excel.service.ts +2 -2
- package/src/services/genai/ingest-metadata.service.ts +115 -39
- package/src/services/{mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.ts → genai/mcp-handlers/mcp-handler-factory.service.ts} +5 -5
- package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +68 -0
- package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +71 -0
- 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
- 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
- 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
- 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
- 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} +9 -10
- 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
- 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
- package/src/services/import-transaction.service.ts +12 -4
- package/src/services/menu-item-metadata.service.ts +3 -7
- package/src/services/model-metadata.service.ts +0 -3
- package/src/services/module-metadata.service.ts +2 -3
- package/src/services/role-metadata.service.ts +22 -8
- package/src/services/solid-ts-morph.service.ts +263 -0
- package/src/solid-core.module.ts +25 -19
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/mcp-tool-response-handler-factory.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts +0 -16
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts +0 -12
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts +0 -12
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts +0 -16
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-module-mcp-tool-response-handler.service.js.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +0 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +0 -1
- 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 {
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
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 {
|
|
20
|
-
import {
|
|
21
|
-
import
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(`
|
|
147
|
-
|
|
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(`
|
|
153
|
-
|
|
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(`
|
|
170
|
-
|
|
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(`
|
|
177
|
-
|
|
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(`
|
|
183
|
-
|
|
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(`
|
|
189
|
-
|
|
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(`
|
|
195
|
-
|
|
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(`
|
|
201
|
-
|
|
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(`
|
|
207
|
-
await this.
|
|
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(`
|
|
212
|
-
|
|
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(`
|
|
218
|
-
|
|
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(`
|
|
224
|
-
|
|
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.
|
|
230
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
349
|
-
await this.mediaStorageProviderMetadataService.upsert(
|
|
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
|
-
|
|
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 (
|
|
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/${
|
|
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
|
-
|
|
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 (
|
|
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/${
|
|
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
|
-
|
|
452
|
+
// Not OK
|
|
453
|
+
private async handleSeedMenus(menus: any) {
|
|
426
454
|
if (!menus) {
|
|
427
455
|
return;
|
|
428
456
|
}
|
|
429
457
|
|
|
430
|
-
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
|
|
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
|
-
//
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
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
|
-
|
|
460
|
-
}
|
|
540
|
+
});
|
|
461
541
|
}
|
|
462
542
|
|
|
463
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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.
|
|
665
|
+
this.settingService.create(createDto);
|
|
594
666
|
}
|
|
595
667
|
}
|
|
596
668
|
|
|
597
|
-
async
|
|
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
|
-
|
|
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
|
|
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
|
|
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;
|