@solidxai/core 0.1.10-beta.24 → 0.1.10-beta.26
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/dist/controllers/action-metadata.controller.d.ts +1 -20
- package/dist/controllers/action-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/agent-event.controller.d.ts +1 -20
- package/dist/controllers/agent-event.controller.d.ts.map +1 -1
- package/dist/controllers/agent-session.controller.d.ts +1 -20
- package/dist/controllers/agent-session.controller.d.ts.map +1 -1
- package/dist/controllers/ai-interaction.controller.d.ts +1 -20
- package/dist/controllers/ai-interaction.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message-details.controller.d.ts +1 -20
- package/dist/controllers/chatter-message-details.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +1 -20
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -20
- package/dist/controllers/dashboard-user-layout.controller.d.ts.map +1 -1
- package/dist/controllers/email-template.controller.d.ts +1 -20
- package/dist/controllers/email-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-template.controller.d.ts +1 -20
- package/dist/controllers/export-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-transaction.controller.d.ts +1 -20
- package/dist/controllers/export-transaction.controller.d.ts.map +1 -1
- package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -20
- package/dist/controllers/import-transaction-error-log.controller.d.ts.map +1 -1
- package/dist/controllers/import-transaction.controller.d.ts +1 -20
- package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
- package/dist/controllers/list-of-values.controller.d.ts +1 -20
- package/dist/controllers/list-of-values.controller.d.ts.map +1 -1
- package/dist/controllers/locale.controller.d.ts +1 -20
- package/dist/controllers/locale.controller.d.ts.map +1 -1
- package/dist/controllers/mcp-audit-log.controller.d.ts +1 -20
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.d.ts +1 -20
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/menu-item-metadata.controller.d.ts +1 -20
- package/dist/controllers/menu-item-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +10 -30
- package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-sequence.controller.d.ts +1 -20
- package/dist/controllers/model-sequence.controller.d.ts.map +1 -1
- package/dist/controllers/module-metadata-explorer.controller.d.ts +171 -0
- package/dist/controllers/module-metadata-explorer.controller.d.ts.map +1 -0
- package/dist/controllers/module-metadata-explorer.controller.js +143 -0
- package/dist/controllers/module-metadata-explorer.controller.js.map +1 -0
- package/dist/controllers/module-metadata.controller.d.ts +5 -0
- package/dist/controllers/module-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/module-metadata.controller.js +12 -0
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/module-package.controller.d.ts +622 -0
- package/dist/controllers/module-package.controller.d.ts.map +1 -0
- package/dist/controllers/module-package.controller.js +150 -0
- package/dist/controllers/module-package.controller.js.map +1 -0
- package/dist/controllers/mq-message-queue.controller.d.ts +1 -20
- package/dist/controllers/mq-message-queue.controller.d.ts.map +1 -1
- package/dist/controllers/mq-message.controller.d.ts +1 -20
- package/dist/controllers/mq-message.controller.d.ts.map +1 -1
- package/dist/controllers/permission-metadata.controller.d.ts +1 -20
- package/dist/controllers/permission-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/role-metadata.controller.d.ts +1 -20
- package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/saved-filters.controller.d.ts +1 -20
- package/dist/controllers/saved-filters.controller.d.ts.map +1 -1
- package/dist/controllers/scheduled-job.controller.d.ts +1 -20
- package/dist/controllers/scheduled-job.controller.d.ts.map +1 -1
- package/dist/controllers/security-rule.controller.d.ts +1 -20
- package/dist/controllers/security-rule.controller.d.ts.map +1 -1
- package/dist/controllers/sms-template.controller.d.ts +1 -20
- package/dist/controllers/sms-template.controller.d.ts.map +1 -1
- package/dist/controllers/user-activity-history.controller.d.ts +1 -20
- package/dist/controllers/user-activity-history.controller.d.ts.map +1 -1
- package/dist/controllers/user-view-metadata.controller.d.ts +1 -20
- package/dist/controllers/user-view-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/user.controller.d.ts +1 -20
- package/dist/controllers/user.controller.d.ts.map +1 -1
- package/dist/controllers/view-metadata.controller.d.ts +1 -20
- package/dist/controllers/view-metadata.controller.d.ts.map +1 -1
- package/dist/dtos/confirm-module-package-import.dto.d.ts +4 -0
- package/dist/dtos/confirm-module-package-import.dto.d.ts.map +1 -0
- package/dist/dtos/confirm-module-package-import.dto.js +34 -0
- package/dist/dtos/confirm-module-package-import.dto.js.map +1 -0
- package/dist/dtos/metadata-explorer-references-query.dto.d.ts +10 -0
- package/dist/dtos/metadata-explorer-references-query.dto.d.ts.map +1 -0
- package/dist/dtos/metadata-explorer-references-query.dto.js +69 -0
- package/dist/dtos/metadata-explorer-references-query.dto.js.map +1 -0
- package/dist/dtos/metadata-explorer-search-query.dto.d.ts +8 -0
- package/dist/dtos/metadata-explorer-search-query.dto.d.ts.map +1 -0
- package/dist/dtos/metadata-explorer-search-query.dto.js +55 -0
- package/dist/dtos/metadata-explorer-search-query.dto.js.map +1 -0
- package/dist/dtos/metadata-explorer-write.dto.d.ts +4 -0
- package/dist/dtos/metadata-explorer-write.dto.d.ts.map +1 -0
- package/dist/dtos/metadata-explorer-write.dto.js +30 -0
- package/dist/dtos/metadata-explorer-write.dto.js.map +1 -0
- package/dist/dtos/run-module-package-build.dto.d.ts +5 -0
- package/dist/dtos/run-module-package-build.dto.d.ts.map +1 -0
- package/dist/dtos/run-module-package-build.dto.js +38 -0
- package/dist/dtos/run-module-package-build.dto.js.map +1 -0
- package/dist/dtos/run-module-package-seed.dto.d.ts +4 -0
- package/dist/dtos/run-module-package-seed.dto.d.ts.map +1 -0
- package/dist/dtos/run-module-package-seed.dto.js +34 -0
- package/dist/dtos/run-module-package-seed.dto.js.map +1 -0
- package/dist/helpers/command.service.js +1 -1
- package/dist/helpers/command.service.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.d.ts +2 -0
- package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js +14 -12
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/helpers/module.helper.d.ts.map +1 -1
- package/dist/helpers/module.helper.js +11 -6
- package/dist/helpers/module.helper.js.map +1 -1
- package/dist/helpers/typeorm-migration-helpers.d.ts +12 -0
- package/dist/helpers/typeorm-migration-helpers.d.ts.map +1 -0
- package/dist/helpers/typeorm-migration-helpers.js +119 -0
- package/dist/helpers/typeorm-migration-helpers.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +57 -38
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.js +1 -1
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2364 -1106
- package/dist/services/crud-helper.service.d.ts +18 -0
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +67 -1
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +1 -21
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +23 -87
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +2 -2
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- package/dist/services/media.service.d.ts +1 -20
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +31 -2
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +5 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +15 -30
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +249 -29
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata-explorer.service.d.ts +161 -0
- package/dist/services/module-metadata-explorer.service.d.ts.map +1 -0
- package/dist/services/module-metadata-explorer.service.js +485 -0
- package/dist/services/module-metadata-explorer.service.js.map +1 -0
- package/dist/services/module-metadata.service.d.ts +7 -0
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +121 -2
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/module-package.service.d.ts +266 -0
- package/dist/services/module-package.service.d.ts.map +1 -0
- package/dist/services/module-package.service.js +980 -0
- package/dist/services/module-package.service.js.map +1 -0
- package/dist/services/settings/default-settings-provider.service.d.ts +18 -0
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +10 -0
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +10 -2
- package/dist/solid-core.module.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +438 -0
- package/docs/dashboards/dashboard-curl-smoke-tests.txt +146 -0
- package/docs/dashboards/delete-legacy-dashboard-metadata.sql +172 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/module-package-import-handoff.md +691 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/package.json +2 -1
- package/src/controllers/module-metadata-explorer.controller.ts +83 -0
- package/src/controllers/module-metadata.controller.ts +6 -0
- package/src/controllers/module-package.controller.ts +102 -0
- package/src/dtos/confirm-module-package-import.dto.ts +12 -0
- package/src/dtos/metadata-explorer-references-query.dto.ts +39 -0
- package/src/dtos/metadata-explorer-search-query.dto.ts +28 -0
- package/src/dtos/metadata-explorer-write.dto.ts +11 -0
- package/src/dtos/run-module-package-build.dto.ts +14 -0
- package/src/dtos/run-module-package-seed.dto.ts +12 -0
- package/src/helpers/command.service.ts +1 -1
- package/src/helpers/module-metadata-helper.service.ts +19 -21
- package/src/helpers/module.helper.ts +12 -9
- package/src/helpers/typeorm-migration-helpers.ts +163 -0
- package/src/index.ts +8 -0
- package/src/seeders/module-metadata-seeder.service.ts +63 -38
- package/src/seeders/module-test-data.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +2365 -1107
- package/src/services/crud-helper.service.ts +79 -1
- package/src/services/crud.service.ts +26 -119
- package/src/services/dashboard-providers/README.md +1 -1
- package/src/services/genai/ingest-metadata.service.ts +3 -3
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +37 -2
- package/src/services/mediaStorageProviders/file-storage-provider.ts +5 -1
- package/src/services/model-metadata.service.ts +302 -98
- package/src/services/module-metadata-explorer.service.ts +670 -0
- package/src/services/module-metadata.service.ts +136 -10
- package/src/services/module-package.service.ts +1171 -0
- package/src/services/settings/default-settings-provider.service.ts +10 -0
- package/src/solid-core.module.ts +10 -2
- package/.claude/settings.local.json +0 -15
- package/CLAUDE.md +0 -26
- package/dist/services/database/database-bootstrap.service.d.ts +0 -12
- package/dist/services/database/database-bootstrap.service.d.ts.map +0 -1
- package/dist/services/database/database-bootstrap.service.js +0 -115
- package/dist/services/database/database-bootstrap.service.js.map +0 -1
- package/sql/default/mariadb/proc_CleanupModelMetadata.sql +0 -153
- package/sql/default/mariadb/proc_CleanupModuleMetadata.sql +0 -56
- package/sql/default/mssql/proc_CleanupModuleMetadata.sql +0 -78
- package/sql/default/mysql/proc_CleanupModelMetadata.sql +0 -153
- package/sql/default/mysql/proc_CleanupModuleMetadata.sql +0 -56
- package/sql/default/postgres/proc_CleanupModelMetadata.sql +0 -148
- package/sql/default/postgres/proc_CleanupModuleMetadata.sql +0 -50
- package/sql/default/postgres/scratchpad.sql.txt +0 -12
- package/src/services/1.js +0 -6
- package/src/services/database/database-bootstrap.service.ts +0 -91
|
@@ -37,21 +37,30 @@ export class ModuleMetadataHelperService {
|
|
|
37
37
|
return path.resolve(process.cwd(), 'src', moduleName);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
async
|
|
40
|
+
async getSolidUiModulePath(moduleName: string): Promise<string> {
|
|
41
41
|
if (!moduleName) {
|
|
42
42
|
return '';
|
|
43
43
|
}
|
|
44
|
+
|
|
45
|
+
const dashModuleName = kebabCase(moduleName);
|
|
46
|
+
return path.resolve(process.cwd(), '..', 'solid-ui', 'src', dashModuleName);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private resolveModuleMetadataFolderPath(moduleName: string): string {
|
|
44
50
|
const dashModuleName = kebabCase(moduleName);
|
|
45
|
-
|
|
46
|
-
|
|
51
|
+
return path.resolve(process.cwd(), 'src', dashModuleName, 'metadata');
|
|
52
|
+
}
|
|
47
53
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return filePath;
|
|
54
|
+
async getModuleMetadataFilePath(moduleName: string): Promise<string> {
|
|
55
|
+
if (!moduleName) {
|
|
56
|
+
return '';
|
|
52
57
|
}
|
|
58
|
+
const dashModuleName = kebabCase(moduleName);
|
|
59
|
+
const filePath = path.join(
|
|
60
|
+
this.resolveModuleMetadataFolderPath(dashModuleName),
|
|
61
|
+
`${dashModuleName}-metadata.json`,
|
|
62
|
+
);
|
|
53
63
|
|
|
54
|
-
// If the module is solid-core, try the fallback path, in case the current root directory is the solid core project
|
|
55
64
|
if (dashModuleName === SOLID_CORE_MODULE_NAME) {
|
|
56
65
|
const fallbackPath = path.resolve(process.cwd(), 'src', 'seeders', 'seed-data', `${dashModuleName}-metadata.json`);
|
|
57
66
|
const fallbackExists = await this.fileService.exists(fallbackPath);
|
|
@@ -68,25 +77,14 @@ export class ModuleMetadataHelperService {
|
|
|
68
77
|
}
|
|
69
78
|
}
|
|
70
79
|
|
|
71
|
-
|
|
72
|
-
return '';
|
|
80
|
+
return filePath;
|
|
73
81
|
}
|
|
74
82
|
|
|
75
83
|
async getModuleMetadataFolderPath(moduleName: string): Promise<string> {
|
|
76
84
|
if (!moduleName) {
|
|
77
85
|
return '';
|
|
78
86
|
}
|
|
79
|
-
|
|
80
|
-
const dashModuleName = kebabCase(moduleName);
|
|
81
|
-
|
|
82
|
-
const folderPath = path.resolve(
|
|
83
|
-
process.cwd(),
|
|
84
|
-
'module-metadata',
|
|
85
|
-
dashModuleName,
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
const exists = await this.fileService.exists(folderPath);
|
|
89
|
-
return exists ? folderPath : '';
|
|
87
|
+
return this.resolveModuleMetadataFolderPath(moduleName);
|
|
90
88
|
}
|
|
91
89
|
|
|
92
90
|
}
|
|
@@ -38,26 +38,29 @@ export const getDynamicModuleNames = (): string[] => {
|
|
|
38
38
|
export const getDynamicModuleNamesBasedOnMetadata = (): string[] => {
|
|
39
39
|
const dynamicModulesToExclude = process.env.SOLID_DYNAMIC_MODULES_TO_EXCLUDE?.split(',') || [];
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
// const srcPath = path.join(process.cwd(), 'src');
|
|
43
|
-
const moduleMetadataPath = path.join(process.cwd(), 'module-metadata');
|
|
41
|
+
const srcPath = path.join(process.cwd(), 'src');
|
|
44
42
|
const coreModuleNames = getCoreModuleNames();
|
|
45
43
|
const allExcludedModules = [...new Set([...coreModuleNames, ...dynamicModulesToExclude])];
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
logger.warn(`Module metadata path does not exist: ${moduleMetadataPath}`);
|
|
45
|
+
if (!fs.existsSync(srcPath)) {
|
|
46
|
+
logger.warn(`Source path does not exist: ${srcPath}`);
|
|
50
47
|
return [];
|
|
51
48
|
}
|
|
52
49
|
|
|
53
|
-
const
|
|
54
|
-
const enabledModules =
|
|
50
|
+
const moduleDirectories = fs.readdirSync(srcPath, { withFileTypes: true });
|
|
51
|
+
const enabledModules = moduleDirectories
|
|
55
52
|
.filter(dirent => {
|
|
56
53
|
const isValidDirectory = dirent.isDirectory() && !allExcludedModules.includes(dirent.name);
|
|
57
54
|
|
|
58
55
|
if (!isValidDirectory) return false;
|
|
59
56
|
|
|
60
|
-
const
|
|
57
|
+
const moduleManifestPath = path.join(srcPath, dirent.name, `${dirent.name}.module.ts`);
|
|
58
|
+
const moduleManifestStats = fs.statSync(moduleManifestPath, { throwIfNoEntry: false });
|
|
59
|
+
if (!moduleManifestStats || !moduleManifestStats.isFile()) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const fullPath = path.join(srcPath, dirent.name, 'metadata', `${dirent.name}-metadata.json`);
|
|
61
64
|
|
|
62
65
|
const stats = fs.statSync(fullPath, { throwIfNoEntry: false });
|
|
63
66
|
return !!stats && stats.isFile();
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export async function addColumnIfNotExists(
|
|
4
|
+
queryRunner: QueryRunner,
|
|
5
|
+
table: string,
|
|
6
|
+
column: string,
|
|
7
|
+
ddl: string,
|
|
8
|
+
): Promise<void> {
|
|
9
|
+
await queryRunner.query(`
|
|
10
|
+
IF COL_LENGTH('${table}', '${column}') IS NULL
|
|
11
|
+
BEGIN
|
|
12
|
+
${ddl}
|
|
13
|
+
END
|
|
14
|
+
`);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function createUniqueIndexIfNotExists(
|
|
18
|
+
queryRunner: QueryRunner,
|
|
19
|
+
table: string,
|
|
20
|
+
indexName: string,
|
|
21
|
+
ddl: string,
|
|
22
|
+
): Promise<void> {
|
|
23
|
+
await queryRunner.query(`
|
|
24
|
+
IF NOT EXISTS (
|
|
25
|
+
SELECT 1
|
|
26
|
+
FROM sys.indexes
|
|
27
|
+
WHERE name = '${indexName}'
|
|
28
|
+
AND object_id = OBJECT_ID('${table}')
|
|
29
|
+
)
|
|
30
|
+
BEGIN
|
|
31
|
+
${ddl}
|
|
32
|
+
END
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function addConstraintIfNotExists(
|
|
37
|
+
queryRunner: QueryRunner,
|
|
38
|
+
constraintName: string,
|
|
39
|
+
ddl: string,
|
|
40
|
+
): Promise<void> {
|
|
41
|
+
await queryRunner.query(`
|
|
42
|
+
IF NOT EXISTS (
|
|
43
|
+
SELECT 1 FROM sys.objects
|
|
44
|
+
WHERE name = '${constraintName}'
|
|
45
|
+
)
|
|
46
|
+
BEGIN
|
|
47
|
+
${ddl}
|
|
48
|
+
END
|
|
49
|
+
`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function dropColumnIfExists(
|
|
53
|
+
queryRunner: QueryRunner,
|
|
54
|
+
table: string,
|
|
55
|
+
column: string,
|
|
56
|
+
ddl: string,
|
|
57
|
+
): Promise<void> {
|
|
58
|
+
await queryRunner.query(`
|
|
59
|
+
IF COL_LENGTH('${table}', '${column}') IS NOT NULL
|
|
60
|
+
BEGIN
|
|
61
|
+
${ddl}
|
|
62
|
+
END
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function dropUniqueIndexIfExists(
|
|
67
|
+
queryRunner: QueryRunner,
|
|
68
|
+
table: string,
|
|
69
|
+
indexName: string,
|
|
70
|
+
ddl: string,
|
|
71
|
+
): Promise<void> {
|
|
72
|
+
await queryRunner.query(`
|
|
73
|
+
IF EXISTS (
|
|
74
|
+
SELECT 1
|
|
75
|
+
FROM sys.indexes
|
|
76
|
+
WHERE name = '${indexName}'
|
|
77
|
+
AND object_id = OBJECT_ID('${table}')
|
|
78
|
+
)
|
|
79
|
+
BEGIN
|
|
80
|
+
${ddl}
|
|
81
|
+
END
|
|
82
|
+
`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function dropConstraintIfExists(
|
|
86
|
+
queryRunner: QueryRunner,
|
|
87
|
+
constraintName: string,
|
|
88
|
+
ddl: string,
|
|
89
|
+
): Promise<void> {
|
|
90
|
+
await queryRunner.query(`
|
|
91
|
+
IF EXISTS (
|
|
92
|
+
SELECT 1 FROM sys.objects
|
|
93
|
+
WHERE name = '${constraintName}'
|
|
94
|
+
)
|
|
95
|
+
BEGIN
|
|
96
|
+
${ddl}
|
|
97
|
+
END
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export async function createTableIfNotExists(
|
|
102
|
+
queryRunner: QueryRunner,
|
|
103
|
+
table: string,
|
|
104
|
+
ddl: string,
|
|
105
|
+
): Promise<void> {
|
|
106
|
+
await queryRunner.query(`
|
|
107
|
+
IF OBJECT_ID('${table}', 'U') IS NULL
|
|
108
|
+
BEGIN
|
|
109
|
+
${ddl}
|
|
110
|
+
END
|
|
111
|
+
`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export async function dropTableIfExists(
|
|
115
|
+
queryRunner: QueryRunner,
|
|
116
|
+
table: string,
|
|
117
|
+
ddl: string,
|
|
118
|
+
): Promise<void> {
|
|
119
|
+
await queryRunner.query(`
|
|
120
|
+
IF OBJECT_ID('${table}', 'U') IS NOT NULL
|
|
121
|
+
BEGIN
|
|
122
|
+
${ddl}
|
|
123
|
+
END
|
|
124
|
+
`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export async function createIndexIfNotExists(
|
|
128
|
+
queryRunner: QueryRunner,
|
|
129
|
+
table: string,
|
|
130
|
+
indexName: string,
|
|
131
|
+
ddl: string,
|
|
132
|
+
): Promise<void> {
|
|
133
|
+
await queryRunner.query(`
|
|
134
|
+
IF NOT EXISTS (
|
|
135
|
+
SELECT 1
|
|
136
|
+
FROM sys.indexes
|
|
137
|
+
WHERE name = '${indexName}'
|
|
138
|
+
AND object_id = OBJECT_ID('${table}')
|
|
139
|
+
)
|
|
140
|
+
BEGIN
|
|
141
|
+
${ddl}
|
|
142
|
+
END
|
|
143
|
+
`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export async function dropIndexIfExists(
|
|
147
|
+
queryRunner: QueryRunner,
|
|
148
|
+
table: string,
|
|
149
|
+
indexName: string,
|
|
150
|
+
ddl: string,
|
|
151
|
+
): Promise<void> {
|
|
152
|
+
await queryRunner.query(`
|
|
153
|
+
IF EXISTS (
|
|
154
|
+
SELECT 1
|
|
155
|
+
FROM sys.indexes
|
|
156
|
+
WHERE name = '${indexName}'
|
|
157
|
+
AND object_id = OBJECT_ID('${table}')
|
|
158
|
+
)
|
|
159
|
+
BEGIN
|
|
160
|
+
${ddl}
|
|
161
|
+
END
|
|
162
|
+
`);
|
|
163
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -110,6 +110,9 @@ export * from './dtos/create-user-activity-history.dto'
|
|
|
110
110
|
export * from './dtos/update-user-activity-history.dto'
|
|
111
111
|
export * from './dtos/dashboard-variable-options-query.dto'
|
|
112
112
|
export * from './dtos/dashboard-widget-data-request.dto'
|
|
113
|
+
export * from './dtos/metadata-explorer-references-query.dto'
|
|
114
|
+
export * from './dtos/metadata-explorer-search-query.dto'
|
|
115
|
+
export * from './dtos/metadata-explorer-write.dto'
|
|
113
116
|
export * from './dtos/create-dashboard-user-layout.dto'
|
|
114
117
|
export * from './dtos/update-dashboard-user-layout.dto'
|
|
115
118
|
|
|
@@ -200,6 +203,7 @@ export * from './helpers/model-metadata-helper.service'
|
|
|
200
203
|
export * from './helpers/image-encoding.helper'
|
|
201
204
|
export * from './helpers/solid-microservice-adapter.service'
|
|
202
205
|
export * from './helpers/typeorm-db-helper';
|
|
206
|
+
export * from './helpers/typeorm-migration-helpers';
|
|
203
207
|
|
|
204
208
|
export * from './services/crud.service'
|
|
205
209
|
export * from './interceptors/logging.interceptor'
|
|
@@ -298,7 +302,9 @@ export * from './services/mediaStorageProviders/file-storage-provider'
|
|
|
298
302
|
export * from './services/mediaStorageProviders/index'
|
|
299
303
|
export * from './services/menu-item-metadata.service'
|
|
300
304
|
export * from './services/model-metadata.service'
|
|
305
|
+
export * from './services/module-metadata-explorer.service'
|
|
301
306
|
export * from './services/module-metadata.service'
|
|
307
|
+
export * from './services/module-package.service'
|
|
302
308
|
export * from './services/mq-message-queue.service'
|
|
303
309
|
export * from './services/mq-message.service'
|
|
304
310
|
export * from './services/agent-session.service'
|
|
@@ -332,6 +338,8 @@ export * from './services/setting.service'
|
|
|
332
338
|
export * from './services/encryption.service'
|
|
333
339
|
export * from './services/info.service'
|
|
334
340
|
export * from './controllers/info.controller'
|
|
341
|
+
export * from './controllers/module-metadata-explorer.controller'
|
|
342
|
+
export * from './controllers/module-package.controller'
|
|
335
343
|
export * from './services/settings/default-settings-provider.service'
|
|
336
344
|
export * from './services/security-rule.service'
|
|
337
345
|
export * from './services/request-context.service'
|
|
@@ -95,14 +95,19 @@ export class ModuleMetadataSeederService {
|
|
|
95
95
|
let currentModule = 'global';
|
|
96
96
|
let currentStep = 'bootstrap';
|
|
97
97
|
let modulesToSeed: string[] | null = null;
|
|
98
|
+
const shouldSeedGlobalMetadata = conf?.seedGlobalMetadata !== false;
|
|
98
99
|
|
|
99
100
|
try {
|
|
100
101
|
this.enablePruning = Boolean(conf?.pruneMetadata);
|
|
101
102
|
console.log(this.enablePruning ? '▶ Pruning enabled: metadata not present in JSON will be removed.' : '▶ Pruning disabled: existing metadata will be kept.');
|
|
102
103
|
|
|
103
104
|
// Global seeding steps i.e across all modules
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
if (shouldSeedGlobalMetadata) {
|
|
106
|
+
currentStep = 'seedGlobalMetadata';
|
|
107
|
+
await this.seedGlobalMetadata();
|
|
108
|
+
} else {
|
|
109
|
+
this.logger.log(`Skipping global metadata seeding.`);
|
|
110
|
+
}
|
|
106
111
|
|
|
107
112
|
// Module specific seeding steps.
|
|
108
113
|
// Get all the module metadata files which needs to be seeded.
|
|
@@ -139,6 +144,11 @@ export class ModuleMetadataSeederService {
|
|
|
139
144
|
const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;
|
|
140
145
|
currentModule = moduleMetadata?.name ?? 'unknown';
|
|
141
146
|
|
|
147
|
+
if (!moduleMetadata?.name) {
|
|
148
|
+
this.logger.warn(`Skipping seed metadata file because moduleMetadata.name is missing.`);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
142
152
|
console.log(`▶ Seeding Metadata for Module: ${moduleMetadata.name}`);
|
|
143
153
|
this.logger.log(`Seeding Metadata for Module: ${moduleMetadata.name}`);
|
|
144
154
|
|
|
@@ -242,33 +252,33 @@ export class ModuleMetadataSeederService {
|
|
|
242
252
|
|
|
243
253
|
private async seedScheduledJobs(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
244
254
|
this.logger.debug(`[Start] Processing scheduled jobs for ${moduleMetadata.name}`);
|
|
245
|
-
const scheduledJobs
|
|
255
|
+
const scheduledJobs = this.getSeedArray<CreateScheduledJobDto>(overallMetadata?.scheduledJobs);
|
|
246
256
|
const pruned = this.enablePruning ? await this.pruneScheduledJobs(scheduledJobs, moduleMetadata.name) : 0;
|
|
247
|
-
if (scheduledJobs
|
|
257
|
+
if (scheduledJobs.length > 0) {
|
|
248
258
|
await this.handleSeedScheduledJobs(scheduledJobs);
|
|
249
259
|
}
|
|
250
260
|
this.logger.debug(`[End] Processing scheduled jobs for ${moduleMetadata.name}`);
|
|
251
|
-
return { pruned, upserted: scheduledJobs
|
|
261
|
+
return { pruned, upserted: scheduledJobs.length };
|
|
252
262
|
}
|
|
253
263
|
|
|
254
264
|
private async seedSavedFilters(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
255
265
|
this.logger.debug(`[Start] Processing saved filters for ${moduleMetadata.name}`);
|
|
256
|
-
const savedFilters
|
|
266
|
+
const savedFilters = this.getSeedArray<CreateSavedFiltersDto>(overallMetadata?.savedFilters);
|
|
257
267
|
const pruned = this.enablePruning ? await this.pruneSavedFilters(savedFilters, moduleMetadata.name) : 0;
|
|
258
|
-
if (savedFilters
|
|
268
|
+
if (savedFilters.length > 0) {
|
|
259
269
|
await this.handleSeedSavedFilters(savedFilters);
|
|
260
270
|
}
|
|
261
271
|
this.logger.debug(`[End] Processing saved filters for ${moduleMetadata.name}`);
|
|
262
|
-
return { pruned, upserted: savedFilters
|
|
272
|
+
return { pruned, upserted: savedFilters.length };
|
|
263
273
|
}
|
|
264
274
|
|
|
265
275
|
private async seedListOfValues(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
266
276
|
this.logger.debug(`[Start] Processing List Of Values for ${moduleMetadata.name}`);
|
|
267
|
-
const listOfValues
|
|
277
|
+
const listOfValues = this.getSeedArray<CreateListOfValuesDto>(overallMetadata?.listOfValues);
|
|
268
278
|
const pruned = this.enablePruning ? await this.pruneListOfValues(listOfValues, moduleMetadata.name) : 0;
|
|
269
279
|
await this.handleSeedListOfValues(listOfValues);
|
|
270
280
|
this.logger.debug(`[End] Processing List Of Values for ${moduleMetadata.name}`);
|
|
271
|
-
return { pruned, upserted: listOfValues
|
|
281
|
+
return { pruned, upserted: listOfValues.length };
|
|
272
282
|
}
|
|
273
283
|
|
|
274
284
|
private async setupDefaultRolesWithPermissions() {
|
|
@@ -286,11 +296,11 @@ export class ModuleMetadataSeederService {
|
|
|
286
296
|
|
|
287
297
|
private async seedSecurityRules(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
288
298
|
this.logger.debug(`[Start] Processing security rules`);
|
|
289
|
-
const securityRules
|
|
299
|
+
const securityRules = this.getSeedArray<CreateSecurityRuleDto>(overallMetadata?.securityRules);
|
|
290
300
|
const pruned = this.enablePruning ? await this.pruneSecurityRules(securityRules, overallMetadata?.moduleMetadata?.name) : 0;
|
|
291
301
|
await this.handleSeedSecurityRules(securityRules);
|
|
292
302
|
this.logger.debug(`[End] Processing security rules`);
|
|
293
|
-
return { pruned, upserted: securityRules
|
|
303
|
+
return { pruned, upserted: securityRules.length };
|
|
294
304
|
}
|
|
295
305
|
|
|
296
306
|
// Ok
|
|
@@ -302,75 +312,85 @@ export class ModuleMetadataSeederService {
|
|
|
302
312
|
|
|
303
313
|
private async seedSmsTemplates(overallMetadata: any, moduleName: string): Promise<{ pruned: number; upserted: number }> {
|
|
304
314
|
this.logger.debug(`[Start] Processing sms templates`);
|
|
305
|
-
const smsTemplates
|
|
315
|
+
const smsTemplates = this.getSeedArray<CreateSmsTemplateDto>(overallMetadata?.smsTemplates);
|
|
306
316
|
await this.handleSeedSmsTemplates(smsTemplates, moduleName);
|
|
307
317
|
this.logger.debug(`[End] Processing sms templates`);
|
|
308
|
-
return { pruned: 0, upserted: smsTemplates
|
|
318
|
+
return { pruned: 0, upserted: smsTemplates.length };
|
|
309
319
|
}
|
|
310
320
|
|
|
311
321
|
// OK
|
|
312
322
|
private async seedEmailTemplates(overallMetadata: any, moduleName: string): Promise<{ pruned: number; upserted: number }> {
|
|
313
323
|
this.logger.debug(`[Start] Processing email templates`);
|
|
314
|
-
const emailTemplates
|
|
324
|
+
const emailTemplates = this.getSeedArray<CreateEmailTemplateDto>(overallMetadata?.emailTemplates);
|
|
315
325
|
await this.handleSeedEmailTemplates(emailTemplates, moduleName);
|
|
316
326
|
this.logger.debug(`[End] Processing email templates`);
|
|
317
|
-
return { pruned: 0, upserted: emailTemplates
|
|
327
|
+
return { pruned: 0, upserted: emailTemplates.length };
|
|
318
328
|
}
|
|
319
329
|
|
|
320
330
|
// Ok
|
|
321
331
|
private async seedMenus(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
322
332
|
this.logger.debug(`[Start] Processing menus`);
|
|
323
|
-
const menus = overallMetadata
|
|
333
|
+
const menus = this.getSeedArray<any>(overallMetadata?.menus);
|
|
324
334
|
const pruned = this.enablePruning ? await this.pruneMenus(menus, overallMetadata?.moduleMetadata?.name) : 0;
|
|
325
335
|
await this.handleSeedMenus(menus);
|
|
326
336
|
this.logger.debug(`[End] Processing menus`);
|
|
327
|
-
return { pruned, upserted: menus
|
|
337
|
+
return { pruned, upserted: menus.length };
|
|
328
338
|
}
|
|
329
339
|
|
|
330
340
|
// Ok
|
|
331
341
|
private async seedActions(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
332
342
|
this.logger.debug(`[Start] Processing actions`);
|
|
333
|
-
const actions = overallMetadata
|
|
343
|
+
const actions = this.getSeedArray<any>(overallMetadata?.actions);
|
|
334
344
|
const pruned = this.enablePruning ? await this.pruneActions(actions, overallMetadata?.moduleMetadata?.name) : 0;
|
|
335
345
|
await this.handleSeedActions(actions);
|
|
336
346
|
this.logger.debug(`[End] Processing actions`);
|
|
337
|
-
return { pruned, upserted: actions
|
|
347
|
+
return { pruned, upserted: actions.length };
|
|
338
348
|
}
|
|
339
349
|
|
|
340
350
|
// Ok
|
|
341
351
|
private async seedViews(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
342
352
|
this.logger.debug(`[Start] Processing views`);
|
|
343
|
-
const views = overallMetadata
|
|
353
|
+
const views = this.getSeedArray<any>(overallMetadata?.views);
|
|
344
354
|
const pruned = this.enablePruning ? await this.pruneViews(views, overallMetadata?.moduleMetadata?.name) : 0;
|
|
345
355
|
await this.handleSeedViews(views);
|
|
346
356
|
this.logger.debug(`[End] Processing views`);
|
|
347
|
-
return { pruned, upserted: views
|
|
357
|
+
return { pruned, upserted: views.length };
|
|
348
358
|
}
|
|
349
359
|
|
|
350
360
|
// Ok
|
|
351
361
|
private async seedUsers(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
352
362
|
this.logger.debug(`[Start] Processing users`);
|
|
353
|
-
const users = overallMetadata
|
|
363
|
+
const users = this.getSeedArray<SignUpDto>(overallMetadata?.users);
|
|
354
364
|
// usersDetail = users;
|
|
355
365
|
await this.handleSeedUsers(users);
|
|
356
366
|
this.logger.debug(`[End] Processing users`);
|
|
357
|
-
return { pruned: 0, upserted: users
|
|
367
|
+
return { pruned: 0, upserted: users.length };
|
|
358
368
|
}
|
|
359
369
|
|
|
360
370
|
// OK
|
|
361
371
|
private async seedRoles(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
362
372
|
this.logger.debug(`[Start] Processing roles`);
|
|
373
|
+
const roles = this.getSeedArray<CreateRoleMetadataDto>(overallMetadata?.roles);
|
|
363
374
|
// While creating roles we are only passing the role name to be used.
|
|
364
|
-
await this.roleService.createRolesIfNotExists(
|
|
375
|
+
await this.roleService.createRolesIfNotExists(
|
|
376
|
+
roles
|
|
377
|
+
.filter((role) => role?.name)
|
|
378
|
+
.map((role) => ({ name: role.name } as any)),
|
|
379
|
+
);
|
|
365
380
|
// After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.
|
|
366
381
|
// Every role configuration in the seeder json can optionally have a permissions attribute.
|
|
367
|
-
for (const role of
|
|
382
|
+
for (const role of roles) {
|
|
368
383
|
if (role.permissions) {
|
|
369
|
-
await this.roleService.addPermissionsToRole(
|
|
384
|
+
await this.roleService.addPermissionsToRole(
|
|
385
|
+
role.name,
|
|
386
|
+
role.permissions
|
|
387
|
+
.map((permission: any) => typeof permission === 'string' ? permission : permission?.name)
|
|
388
|
+
.filter(Boolean),
|
|
389
|
+
);
|
|
370
390
|
}
|
|
371
391
|
}
|
|
372
392
|
this.logger.debug(`[End] Processing roles`);
|
|
373
|
-
return { pruned: 0, upserted:
|
|
393
|
+
return { pruned: 0, upserted: roles.length };
|
|
374
394
|
}
|
|
375
395
|
|
|
376
396
|
private async seedPermissions(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
@@ -388,7 +408,7 @@ export class ModuleMetadataSeederService {
|
|
|
388
408
|
// const enabledModules = getDynamicModuleNames();
|
|
389
409
|
const enabledModules = getDynamicModuleNamesBasedOnMetadata();
|
|
390
410
|
for (const enabledModule of enabledModules) {
|
|
391
|
-
const enabledModuleSeedFile = `
|
|
411
|
+
const enabledModuleSeedFile = `src/${enabledModule}/metadata/${enabledModule}-metadata.json`;
|
|
392
412
|
const fullPath = path.join(process.cwd(), enabledModuleSeedFile);
|
|
393
413
|
|
|
394
414
|
if (fs.existsSync(fullPath)) {
|
|
@@ -489,22 +509,23 @@ export class ModuleMetadataSeederService {
|
|
|
489
509
|
// OK
|
|
490
510
|
private async seedMediaStorageProviders(mediaStorageProviders: any[]): Promise<{ pruned: number; upserted: number }> {
|
|
491
511
|
this.logger.debug(`[Start] Processing Media Storage Provider`);
|
|
512
|
+
const providers = this.getSeedArray<any>(mediaStorageProviders);
|
|
492
513
|
|
|
493
|
-
for (let i = 0; i <
|
|
494
|
-
const mediaStorageProvider =
|
|
514
|
+
for (let i = 0; i < providers.length; i++) {
|
|
515
|
+
const mediaStorageProvider = providers[i];
|
|
495
516
|
await this.mediaStorageProviderMetadataService.upsert(mediaStorageProvider);
|
|
496
517
|
}
|
|
497
518
|
this.logger.debug(`[End] Processing Media Storage Provider`);
|
|
498
|
-
return { pruned: 0, upserted:
|
|
519
|
+
return { pruned: 0, upserted: providers.length };
|
|
499
520
|
}
|
|
500
521
|
|
|
501
522
|
private async seedModelSequences(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
|
|
502
523
|
this.logger.debug(`[Start] Processing model sequences`);
|
|
503
|
-
const modelSequences
|
|
524
|
+
const modelSequences = this.getSeedArray<CreateModelSequenceDto>(overallMetadata?.modelSequences);
|
|
504
525
|
const pruned = this.enablePruning ? await this.pruneModelSequences(modelSequences, overallMetadata?.moduleMetadata?.name) : 0;
|
|
505
526
|
await this.handleSeedModelSequences(modelSequences);
|
|
506
527
|
this.logger.debug(`[End] Processing model sequences`);
|
|
507
|
-
return { pruned, upserted: modelSequences
|
|
528
|
+
return { pruned, upserted: modelSequences.length };
|
|
508
529
|
}
|
|
509
530
|
|
|
510
531
|
// OK
|
|
@@ -558,7 +579,7 @@ export class ModuleMetadataSeederService {
|
|
|
558
579
|
}
|
|
559
580
|
else {
|
|
560
581
|
// Check if file exists
|
|
561
|
-
const emailTemplateHandlebar = `
|
|
582
|
+
const emailTemplateHandlebar = `src/${moduleName}/metadata/email-templates/${emailTemplate.body}`
|
|
562
583
|
const fullPath = path.join(process.cwd(), emailTemplateHandlebar);
|
|
563
584
|
// this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);
|
|
564
585
|
if (fs.existsSync(fullPath)) {
|
|
@@ -624,7 +645,7 @@ export class ModuleMetadataSeederService {
|
|
|
624
645
|
}
|
|
625
646
|
else {
|
|
626
647
|
// Check if file exists
|
|
627
|
-
const emailTemplateHandlebar = `
|
|
648
|
+
const emailTemplateHandlebar = `src/${moduleName}/metadata/sms-templates/${smsTemplate.body}`
|
|
628
649
|
const fullPath = path.join(process.cwd(), emailTemplateHandlebar);
|
|
629
650
|
// this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);
|
|
630
651
|
if (fs.existsSync(fullPath)) {
|
|
@@ -827,8 +848,8 @@ export class ModuleMetadataSeederService {
|
|
|
827
848
|
let upserted = 1;
|
|
828
849
|
|
|
829
850
|
// Next create all the models.
|
|
830
|
-
const modelsMetadata
|
|
831
|
-
upserted += modelsMetadata
|
|
851
|
+
const modelsMetadata = this.getSeedArray<CreateModelMetadataDto>(moduleMetadata?.models);
|
|
852
|
+
upserted += modelsMetadata.length;
|
|
832
853
|
for (let j = 0; j < modelsMetadata.length; j++) {
|
|
833
854
|
const modelMetadata = modelsMetadata[j];
|
|
834
855
|
|
|
@@ -882,6 +903,10 @@ export class ModuleMetadataSeederService {
|
|
|
882
903
|
return { pruned, upserted };
|
|
883
904
|
}
|
|
884
905
|
|
|
906
|
+
private getSeedArray<T>(value: T[] | null | undefined): T[] {
|
|
907
|
+
return Array.isArray(value) ? value : [];
|
|
908
|
+
}
|
|
909
|
+
|
|
885
910
|
private async handleSeedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {
|
|
886
911
|
if (!rulesDto || rulesDto.length === 0) {
|
|
887
912
|
this.logger.debug(`No security rules found to seed`);
|
|
@@ -196,7 +196,7 @@ export class ModuleTestDataService {
|
|
|
196
196
|
const testDataFiles = [typedSolidCoreMetadata];
|
|
197
197
|
const enabledModules = getDynamicModuleNamesBasedOnMetadata();
|
|
198
198
|
for (const enabledModule of enabledModules) {
|
|
199
|
-
const enabledModuleSeedFile = `
|
|
199
|
+
const enabledModuleSeedFile = `src/${enabledModule}/metadata/${enabledModule}-metadata.json`;
|
|
200
200
|
const fullPath = path.join(process.cwd(), enabledModuleSeedFile);
|
|
201
201
|
|
|
202
202
|
if (fs.existsSync(fullPath)) {
|