@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidstarters/solid-core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.183",
|
|
4
4
|
"description": "This module is a NestJS module containing all the required core providers required by a Solid application",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"cache-manager-redis-store": "^3.0.1",
|
|
50
50
|
"class-transformer": "^0.5.1",
|
|
51
51
|
"class-validator": "^0.14.1",
|
|
52
|
+
"dayjs": "^1.11.18",
|
|
52
53
|
"exceljs": "^4.4.0",
|
|
53
54
|
"fast-csv": "^5.0.2",
|
|
54
55
|
"handlebars": "^4.7.8",
|
|
@@ -69,9 +70,9 @@
|
|
|
69
70
|
"pluralize": "^8.0.0",
|
|
70
71
|
"puppeteer": "^23.2.0",
|
|
71
72
|
"r2r-js": "^0.4.43",
|
|
72
|
-
"reflect-metadata": "^0.1.13",
|
|
73
73
|
"rxjs": "^7.8.1",
|
|
74
74
|
"swagger-ui-express": "^5.0.0",
|
|
75
|
+
"ts-morph": "^27.0.2",
|
|
75
76
|
"twilio": "^5.8.0",
|
|
76
77
|
"uuid": "^9.0.1",
|
|
77
78
|
"xlsx": "^0.18.5"
|
|
@@ -96,7 +97,8 @@
|
|
|
96
97
|
"nestjs-cls": "^5.4.3",
|
|
97
98
|
"typeorm": "^0.3.20",
|
|
98
99
|
"typeorm-naming-strategies": "^4.1.0",
|
|
99
|
-
"winston": "^3.17.0"
|
|
100
|
+
"winston": "^3.17.0",
|
|
101
|
+
"reflect-metadata": "^0.2.2"
|
|
100
102
|
},
|
|
101
103
|
"devDependencies": {
|
|
102
104
|
"@angular-devkit/schematics": "^19.2.6",
|
|
@@ -151,7 +153,8 @@
|
|
|
151
153
|
"typeorm": "^0.3.20",
|
|
152
154
|
"typeorm-naming-strategies": "^4.1.0",
|
|
153
155
|
"typescript": "^5.1.3",
|
|
154
|
-
"winston": "^3.17.0"
|
|
156
|
+
"winston": "^3.17.0",
|
|
157
|
+
"reflect-metadata": "^0.2.2"
|
|
155
158
|
},
|
|
156
159
|
"jest": {
|
|
157
160
|
"moduleFileExtensions": [
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { In } from "typeorm";
|
|
2
|
+
import { MenuItemMetadata } from "src/entities/menu-item-metadata.entity";
|
|
3
|
+
import { RoleMetadata } from "src/entities/role-metadata.entity";
|
|
4
|
+
import { ActionMetadata } from "src/entities/action-metadata.entity";
|
|
5
|
+
import { ModuleMetadata } from "src/entities/module-metadata.entity";
|
|
6
|
+
|
|
7
|
+
const JOIN_TABLE = "ss_menu_item_metadata_roles_role_metadata"; // <-- your actual join table
|
|
8
|
+
const MENU_COL = "menuItemId"; // <-- actual column name in the join table
|
|
9
|
+
const ROLE_COL = "roleId"; // <-- actual column name in the join table
|
|
10
|
+
|
|
11
|
+
await this.dataSource.transaction(async (trx) => {
|
|
12
|
+
const menuRepo = trx.getRepository(MenuItemMetadata);
|
|
13
|
+
const roleRepo = trx.getRepository(RoleMetadata);
|
|
14
|
+
const actionRepo = trx.getRepository(ActionMetadata);
|
|
15
|
+
const moduleRepo = trx.getRepository(ModuleMetadata);
|
|
16
|
+
|
|
17
|
+
// 1) Upsert menus WITHOUT roles
|
|
18
|
+
for (const m of menus) {
|
|
19
|
+
const entity = menuRepo.create({
|
|
20
|
+
name: m.name,
|
|
21
|
+
displayName: m.displayName,
|
|
22
|
+
action: m.actionUserKey
|
|
23
|
+
? await actionRepo.findOne({ where: { userKey: m.actionUserKey }, select: ["id"] })
|
|
24
|
+
: null,
|
|
25
|
+
module: m.moduleUserKey
|
|
26
|
+
? await moduleRepo.findOne({ where: { userKey: m.moduleUserKey }, select: ["id"] })
|
|
27
|
+
: null,
|
|
28
|
+
parentMenuItem: m.parentMenuItemUserKey
|
|
29
|
+
? await menuRepo.findOne({ where: { userKey: m.parentMenuItemUserKey }, select: ["id"] })
|
|
30
|
+
: null,
|
|
31
|
+
});
|
|
32
|
+
await menuRepo.upsert(entity, ["name"]); // or ["userKey"]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 2) Fetch ids for batching
|
|
36
|
+
const seeded = await menuRepo.find({
|
|
37
|
+
where: { name: In(menus.map(m => m.name)) },
|
|
38
|
+
select: ["id", "name"],
|
|
39
|
+
});
|
|
40
|
+
const idByName = new Map(seeded.map(s => [s.name, s.id]));
|
|
41
|
+
|
|
42
|
+
// 3) Build desired join rows once
|
|
43
|
+
const admin = await roleRepo.findOne({ where: { name: ADMIN_ROLE_NAME }, select: ["id","name"] });
|
|
44
|
+
const allRoleNames = new Set<string>();
|
|
45
|
+
for (const m of menus) (m.roles ?? []).forEach((r: string) => allRoleNames.add(r));
|
|
46
|
+
if (admin) allRoleNames.add(admin.name);
|
|
47
|
+
|
|
48
|
+
const roles = await roleRepo.find({
|
|
49
|
+
where: { name: In([...allRoleNames]) },
|
|
50
|
+
select: ["id","name"],
|
|
51
|
+
});
|
|
52
|
+
const roleByName = new Map(roles.map(r => [r.name, r]));
|
|
53
|
+
|
|
54
|
+
const joinRows: Array<{ menuId: number; roleId: number }> = [];
|
|
55
|
+
for (const m of menus) {
|
|
56
|
+
const menuId = idByName.get(m.name)!;
|
|
57
|
+
const roleNames = new Set<string>([...(m.roles ?? []), admin?.name].filter(Boolean) as string[]);
|
|
58
|
+
for (const rn of roleNames) {
|
|
59
|
+
const role = roleByName.get(rn);
|
|
60
|
+
if (role) joinRows.push({ menuId, roleId: role.id });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 4) Replace in bulk — QueryBuilder version
|
|
65
|
+
|
|
66
|
+
// 4a) delete existing for affected menus
|
|
67
|
+
const menuIds = [...new Set(joinRows.map(r => r.menuId))];
|
|
68
|
+
if (menuIds.length) {
|
|
69
|
+
await trx
|
|
70
|
+
.createQueryBuilder()
|
|
71
|
+
.delete()
|
|
72
|
+
.from(JOIN_TABLE) // string table name is fine
|
|
73
|
+
.where(`${MENU_COL} IN (:...ids)`, { ids: menuIds })
|
|
74
|
+
.execute();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 4b) bulk insert all pairs
|
|
78
|
+
if (joinRows.length) {
|
|
79
|
+
// Build objects with the exact column names used by the join table
|
|
80
|
+
const values = joinRows.map(r => ({
|
|
81
|
+
[MENU_COL]: r.menuId,
|
|
82
|
+
[ROLE_COL]: r.roleId,
|
|
83
|
+
}));
|
|
84
|
+
|
|
85
|
+
await trx
|
|
86
|
+
.createQueryBuilder()
|
|
87
|
+
.insert()
|
|
88
|
+
.into(JOIN_TABLE) // string table name
|
|
89
|
+
.values(values)
|
|
90
|
+
.orIgnore() // optional if you have a UNIQUE(menuItemId, roleId) and want to skip dups
|
|
91
|
+
.execute();
|
|
92
|
+
}
|
|
93
|
+
});
|
package/src/config/iam.config.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { registerAs } from '@nestjs/config';
|
|
2
|
+
import { Environment } from 'src';
|
|
2
3
|
|
|
3
4
|
export const iamConfig = registerAs('iam', () => {
|
|
4
5
|
return {
|
|
@@ -32,7 +33,7 @@ export const jwtConfig = registerAs('jwt', () => {
|
|
|
32
33
|
secret: process.env.IAM_JWT_SECRET,
|
|
33
34
|
audience: process.env.IAM_JWT_TOKEN_AUDIENCE,
|
|
34
35
|
issuer: process.env.IAM_JWT_TOKEN_ISSUER,
|
|
35
|
-
accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? '1200', 10), // 20 minutes
|
|
36
|
+
accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? (process.env.ENV as Environment) === Environment.Production ? '1200' : '86400', 10), // 20 minutes in prod, 1 day otherwise
|
|
36
37
|
refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '604800', 10), // 7 days
|
|
37
38
|
};
|
|
38
39
|
});
|
|
@@ -5,10 +5,14 @@ import { Public } from 'src/decorators/public.decorator';
|
|
|
5
5
|
import { ErrorMapperService } from 'src/helpers/error-mapper.service';
|
|
6
6
|
import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
|
|
7
7
|
import { AiInteractionService } from 'src/services/ai-interaction.service';
|
|
8
|
+
import { IngestMetadataService } from 'src/services/genai/ingest-metadata.service';
|
|
8
9
|
import { MqMessageService } from 'src/services/mq-message.service';
|
|
9
10
|
import { SolidRegistry } from '../helpers/solid-registry';
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
export interface PostProcessCodeGenConfig {
|
|
13
|
+
runModuleMetadataSeeder?: boolean; // If true, regenerate module metadata
|
|
14
|
+
runSolidIngestion?: boolean; // If true, run solid ingestion command
|
|
15
|
+
}
|
|
12
16
|
@Controller('')
|
|
13
17
|
@ApiTags("Common")
|
|
14
18
|
// @UseGuards(ThrottlerGuard)
|
|
@@ -20,7 +24,9 @@ export class ServiceController {
|
|
|
20
24
|
private readonly solidRegistry: SolidRegistry,
|
|
21
25
|
private readonly aiInteractionService: AiInteractionService,
|
|
22
26
|
private readonly mqMessageService: MqMessageService,
|
|
23
|
-
private readonly errorMapper: ErrorMapperService
|
|
27
|
+
private readonly errorMapper: ErrorMapperService,
|
|
28
|
+
private readonly ingestMetadataService: IngestMetadataService,
|
|
29
|
+
|
|
24
30
|
) { }
|
|
25
31
|
|
|
26
32
|
@Public()
|
|
@@ -103,6 +109,41 @@ export class ServiceController {
|
|
|
103
109
|
return { message: `seed data for ${seedData.seeder}` };
|
|
104
110
|
}
|
|
105
111
|
|
|
112
|
+
@ApiBearerAuth("jwt")
|
|
113
|
+
@Post('code-generation/post-process')
|
|
114
|
+
async postProcessCodeGeneration(@Body() config : PostProcessCodeGenConfig) {
|
|
115
|
+
// Set defaults if not provided
|
|
116
|
+
config.runModuleMetadataSeeder = config.runModuleMetadataSeeder ?? true;
|
|
117
|
+
config.runSolidIngestion = config.runSolidIngestion ?? true;
|
|
118
|
+
|
|
119
|
+
// Run the Module Metadata Seeder Service
|
|
120
|
+
if (config.runModuleMetadataSeeder) {
|
|
121
|
+
this.logger.debug(`Running the Module Metadata Seeder Service as part of post-process code generation`);
|
|
122
|
+
const seeder = this.solidRegistry
|
|
123
|
+
.getSeeders()
|
|
124
|
+
.filter((seeder) => seeder.name === 'ModuleMetadataSeederService')
|
|
125
|
+
.map((seeder) => seeder.instance)
|
|
126
|
+
.pop();
|
|
127
|
+
if (!seeder) {
|
|
128
|
+
this.logger.error(`Seeder service ModuleMetadataSeederService not found. Does your service have a seed() method?`);
|
|
129
|
+
} else {
|
|
130
|
+
await seeder.seed();
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
this.logger.debug(`Skipping the Module Metadata Seeder Service as part of post-process code generation`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Run the Solid ingestion command
|
|
137
|
+
if (config.runSolidIngestion) {
|
|
138
|
+
this.logger.debug(`Running the Solid ingestion command as part of post-process code generation`);
|
|
139
|
+
|
|
140
|
+
// TODO: disabled this till we figure out a way to make this stable...
|
|
141
|
+
// This keeps failing for a variety of reasons...
|
|
142
|
+
// await this.ingestMetadataService.ingest();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
|
|
106
147
|
// @Public()
|
|
107
148
|
// @Get('play')
|
|
108
149
|
// play() {
|
|
@@ -65,4 +65,8 @@ export class CreateMenuItemMetadataDto {
|
|
|
65
65
|
@ApiProperty()
|
|
66
66
|
iconName: string;
|
|
67
67
|
|
|
68
|
-
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const MENU_ROLE_JOIN_TABLE_NAME = "ss_menu_item_metadata_roles_ss_role_metadata"; // <-- your actual join table
|
|
71
|
+
export const MENU_ROLE_JOIN_TABLE_NAME_MENU_COL = "ss_menu_item_metadata_id"; // <-- actual column name in the join table
|
|
72
|
+
export const MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL = "ss_role_metadata_id"; // <-- actual column name in the join table
|
|
@@ -53,4 +53,63 @@ export class CreateRoleMetadataDto {
|
|
|
53
53
|
@IsOptional()
|
|
54
54
|
@ApiProperty()
|
|
55
55
|
menuItemsCommand: string;
|
|
56
|
-
}
|
|
56
|
+
}
|
|
57
|
+
export const ADMIN_ROLE_NAME = 'Admin';
|
|
58
|
+
export const INTERNAL_ROLE_NAME = 'Internal User';
|
|
59
|
+
export const PUBLIC_ROLE_NAME = 'Public';
|
|
60
|
+
export const INTERNAL_ROLE_PERMISSIONS = [
|
|
61
|
+
// User permissions
|
|
62
|
+
'UserController.findMany', //Why do we need this?
|
|
63
|
+
'UserController.checkIfPermissionExists',
|
|
64
|
+
'UserController.findOne',
|
|
65
|
+
// Menu permissions
|
|
66
|
+
'MenuItemMetadataController.findMany',
|
|
67
|
+
'MenuItemMetadataController.findUserMenus',
|
|
68
|
+
'MenuItemMetadataController.findOne',
|
|
69
|
+
// View metadata permissions
|
|
70
|
+
'ViewMetadataController.getLayout',
|
|
71
|
+
'ViewMetadataController.findMany',
|
|
72
|
+
'ViewMetadataController.findOne',
|
|
73
|
+
// User View metadata permissions
|
|
74
|
+
'UserViewMetadataController.upsert',
|
|
75
|
+
'UserViewMetadataController.findMany',
|
|
76
|
+
'UserViewMetadataController.findOne',
|
|
77
|
+
// IAM permissions
|
|
78
|
+
'AuthenticationController.changePassword',
|
|
79
|
+
// Field Metadata permissions
|
|
80
|
+
'FieldMetadataController.getSelectionDynamicValues',
|
|
81
|
+
'FieldMetadataController.getSelectionDynamicValue',
|
|
82
|
+
'FieldMetadataController.findFieldDefaultMetaData',
|
|
83
|
+
// Saved Filters permissions
|
|
84
|
+
'SavedFiltersController.delete',
|
|
85
|
+
'SavedFiltersController.deleteMany',
|
|
86
|
+
'SavedFiltersController.findOne',
|
|
87
|
+
'SavedFiltersController.findMany',
|
|
88
|
+
'SavedFiltersController.recover',
|
|
89
|
+
'SavedFiltersController.recoverMany',
|
|
90
|
+
'SavedFiltersController.partialUpdate',
|
|
91
|
+
'SavedFiltersController.update',
|
|
92
|
+
'SavedFiltersController.insertMany',
|
|
93
|
+
'SavedFiltersController.create',
|
|
94
|
+
// Logout permissions
|
|
95
|
+
'AuthenticationController.logout',
|
|
96
|
+
// Other permissions can be added here as required.
|
|
97
|
+
// Chatter permissions
|
|
98
|
+
'ChatterMessageController.create',
|
|
99
|
+
'ChatterMessageController.getChatterMessages',
|
|
100
|
+
// 'ChatterMessageController.postMessage', // Does not seem to be used from ui
|
|
101
|
+
// Import
|
|
102
|
+
'ImportTransactionController.getImportTemplate',
|
|
103
|
+
'ImportTransactionController.getImportInstructions',
|
|
104
|
+
'ImportTransactionController.getImportMappingInfo',
|
|
105
|
+
'ImportTransactionController.startImportSync',
|
|
106
|
+
'ImportTransactionController.startImportAsync',
|
|
107
|
+
'ImportTransactionController.exportFailedImportedImports',
|
|
108
|
+
// Export permissions
|
|
109
|
+
'ExportTemplateController.startExportSync',
|
|
110
|
+
'ExportTemplateController.startExportAsync',
|
|
111
|
+
// List of values
|
|
112
|
+
'ListOfValuesController.findMany',
|
|
113
|
+
'ListOfValuesController.findOne',
|
|
114
|
+
// Media // [Not required], since media is always populated as part of a model
|
|
115
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export function parseFlexibleDate(value: string): Date | null {
|
|
5
|
+
if (!value) return null;
|
|
6
|
+
const formats = ['DD-MM-YYYY', 'YYYY-MM-DD'];
|
|
7
|
+
const parsed = dayjs(value, formats, true); // true = strict parsing
|
|
8
|
+
if (!parsed.isValid()) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return parsed.toDate();
|
|
12
|
+
}
|
|
13
|
+
|
package/src/interfaces.ts
CHANGED
|
@@ -66,7 +66,7 @@ export interface CodeGenerationOptions {
|
|
|
66
66
|
|
|
67
67
|
export interface TriggerMcpClientOptions {
|
|
68
68
|
aiInteractionId: number;
|
|
69
|
-
moduleName:string;
|
|
69
|
+
moduleName: string;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
export interface McpResponse {
|
|
@@ -274,4 +274,31 @@ export interface IErrorCodeProvider {
|
|
|
274
274
|
* If omitted, the ErrorMapperService will rely on the rule.meta of the first matching rule.
|
|
275
275
|
*/
|
|
276
276
|
resolve?(code: ErrorCode): ErrorMeta | undefined;
|
|
277
|
-
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// MCP Tool Related
|
|
280
|
+
|
|
281
|
+
export type PlanStep = CreateNewFileStep | RegisterNestProviderStep;
|
|
282
|
+
|
|
283
|
+
export interface CreateNewFileStep {
|
|
284
|
+
type: "createNewFile";
|
|
285
|
+
path: string; // repo-relative e.g. solid-api/api/src/computed-providers/foo.provider.ts
|
|
286
|
+
content: string; // full file content
|
|
287
|
+
overwrite?: boolean; // default=false
|
|
288
|
+
rationale?: string; // optional, ignored by executor
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export interface RegisterNestProviderStep {
|
|
292
|
+
type: "registerNestProvider";
|
|
293
|
+
modulePath: string; // e.g. apps/api/src/address-master/address-master.module.ts
|
|
294
|
+
providerClassName: string; // e.g. StateTotalCitiesComputedFieldProvider
|
|
295
|
+
importFrom: string; // e.g. "@/computed-providers/state-total-cities.provider"
|
|
296
|
+
registerIn: Array<"providers" | "exports">; // which arrays to add to
|
|
297
|
+
uniqueGuard?: boolean; // default=true
|
|
298
|
+
rationale?: string; // optional, ignored by executor
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export interface McpComputedProviderResponse {
|
|
302
|
+
plan: PlanStep[];
|
|
303
|
+
// provider?: any; // (intentionally ignored per your note)
|
|
304
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Injectable, Logger } from '@nestjs/common';
|
|
2
|
-
|
|
3
2
|
import { QueueMessage } from 'src/interfaces/mq';
|
|
4
3
|
import { MqMessageService } from '../../services/mq-message.service';
|
|
5
4
|
import { MqMessageQueueService } from '../../services/mq-message-queue.service';
|
|
@@ -8,6 +7,9 @@ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.serv
|
|
|
8
7
|
import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
|
|
9
8
|
import { AiInteractionService } from 'src/services/ai-interaction.service';
|
|
10
9
|
import { PollerService } from 'src/services/poller.service';
|
|
10
|
+
import { SolidRegistry } from 'src/helpers/solid-registry';
|
|
11
|
+
import { ModuleMetadataService } from 'src/services/module-metadata.service';
|
|
12
|
+
import { ModelMetadataService } from 'src';
|
|
11
13
|
|
|
12
14
|
@Injectable()
|
|
13
15
|
export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<TriggerMcpClientOptions> {
|
|
@@ -18,6 +20,10 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
18
20
|
readonly mqMessageQueueService: MqMessageQueueService,
|
|
19
21
|
readonly poller: PollerService,
|
|
20
22
|
readonly aiInteractionService: AiInteractionService,
|
|
23
|
+
readonly moduleMetadataService: ModuleMetadataService,
|
|
24
|
+
readonly modelMetadataService: ModelMetadataService,
|
|
25
|
+
private readonly solidRegistry: SolidRegistry,
|
|
26
|
+
|
|
21
27
|
) {
|
|
22
28
|
super(mqMessageService, mqMessageQueueService, poller);
|
|
23
29
|
}
|
|
@@ -95,19 +101,81 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
95
101
|
status: 'pending' // Updated after we receive the response
|
|
96
102
|
});
|
|
97
103
|
|
|
104
|
+
const existingComputationProviders = this.solidRegistry.getComputedFieldProviders();
|
|
105
|
+
|
|
106
|
+
const { records: existingModules } = await this.moduleMetadataService.findMany({
|
|
107
|
+
filters: {
|
|
108
|
+
name: { $ne: 'solid-core' }
|
|
109
|
+
},
|
|
110
|
+
fields: ['id', 'name', 'displayName', 'description'],
|
|
111
|
+
limit: 1000
|
|
112
|
+
});
|
|
113
|
+
const { records: existingModels } = await this.modelMetadataService.findMany({
|
|
114
|
+
filters: {
|
|
115
|
+
module: {
|
|
116
|
+
name: {
|
|
117
|
+
$ne: 'solid-core',
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
limit: 1000,
|
|
122
|
+
populate: ['module']
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Build markdown sections using template interpolation
|
|
126
|
+
const modulesSection = (existingModules ?? [])
|
|
127
|
+
.map(m => [
|
|
128
|
+
`### ${m.displayName}`,
|
|
129
|
+
`- name: ${m.name}`,
|
|
130
|
+
`- description: ${m.description ?? ""}`,
|
|
131
|
+
].join('\n'))
|
|
132
|
+
.join('\n\n');
|
|
133
|
+
|
|
134
|
+
const modelsSection = (existingModels ?? [])
|
|
135
|
+
.map(m => [
|
|
136
|
+
`### ${m.displayName}`,
|
|
137
|
+
`- singularName: ${m.singularName}`,
|
|
138
|
+
`- description: ${m.description ?? ""}`,
|
|
139
|
+
`- moduleName: ${m.module.name}`,
|
|
140
|
+
].join('\n'))
|
|
141
|
+
.join('\n\n');
|
|
142
|
+
|
|
143
|
+
const computationProvidersSection = (existingComputationProviders ?? [])
|
|
144
|
+
.map(m => [
|
|
145
|
+
`### ${m.instance.name()}`,
|
|
146
|
+
`- name: ${m.instance.name()}`,
|
|
147
|
+
`- description: ${m.instance.help() ?? ""}`,
|
|
148
|
+
].join('\n'))
|
|
149
|
+
.join('\n\n');
|
|
150
|
+
|
|
98
151
|
const finalPrompt = `
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
152
|
+
# User Prompt:
|
|
153
|
+
${prompt}
|
|
154
|
+
|
|
155
|
+
# System Instructions:
|
|
156
|
+
- aiInteractionId: ${genAiInteraction.id}
|
|
157
|
+
- You will be invoking tools if needed, hence you will have to choose the applicable tools based on the tool context given to you.
|
|
158
|
+
- If a tool is invoked, you must return **exactly** the raw output from the tool, without any json envelopes, additional formatting, commentary, or text.
|
|
159
|
+
- Do not wrap the result in quotes, JSON, or markdown fences.
|
|
160
|
+
- Do not explain what the result means.
|
|
161
|
+
|
|
162
|
+
# LISTS FOR REFERENCE AND VALIDATIONS
|
|
163
|
+
|
|
164
|
+
## LIST OF EXISTING MODULES
|
|
165
|
+
Use the below list of models with module names to infer which module & models the user is referring to, you can try to pull out the singularName incase of models.
|
|
166
|
+
|
|
167
|
+
${modulesSection}
|
|
168
|
+
|
|
169
|
+
## LIST OF EXISTING MODELS
|
|
170
|
+
Use the below list of modules to infer which module the user is referring to.
|
|
171
|
+
|
|
172
|
+
${modelsSection}
|
|
173
|
+
|
|
174
|
+
## LIST OF EXISTING COMPUTED FIELD PROVIDERS
|
|
175
|
+
Use the below list of computed field providers to infer which provider the user is referring to.
|
|
176
|
+
|
|
177
|
+
${computationProvidersSection}
|
|
178
|
+
`.trim();
|
|
111
179
|
|
|
112
180
|
const aiResponse = await this.aiInteractionService.runMcpPrompt(finalPrompt);
|
|
113
181
|
this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
|
|
@@ -116,8 +184,8 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
116
184
|
if (!aiResponse.success) {
|
|
117
185
|
this.triggerMcpClientSubscriberLogger.log(`Gen ai has returned with a false status code`);
|
|
118
186
|
|
|
119
|
-
const errorsStr = aiResponse.errors
|
|
120
|
-
const errorTrace = aiResponse.error_trace
|
|
187
|
+
const errorsStr = aiResponse.errors?.join('\n ');
|
|
188
|
+
const errorTrace = aiResponse.error_trace?.join('\n');
|
|
121
189
|
|
|
122
190
|
// await this.aiInteractionService.create({
|
|
123
191
|
// userId: aiInteraction.user.id,
|
|
@@ -166,7 +234,9 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
166
234
|
// });
|
|
167
235
|
|
|
168
236
|
// TODO: Update the previously created genAiInteraction record with the respective success fields and save to DB
|
|
169
|
-
const errorsStr = nestedResponse
|
|
237
|
+
const errorsStr = nestedResponse?.status == "error" && nestedResponse?.errors.join('\n ');
|
|
238
|
+
// const errorTrace = nestedResponse?.status == "error" && nestedResponse?.error_trace?.join('\n');
|
|
239
|
+
|
|
170
240
|
|
|
171
241
|
await this.aiInteractionService.update(genAiInteraction.id, {
|
|
172
242
|
errorMessage: nestedResponse.status == "error" ? `${errorsStr}` : "",
|
|
@@ -28,4 +28,19 @@ export class ViewMetadataRepository extends Repository<ViewMetadata> {
|
|
|
28
28
|
});
|
|
29
29
|
return viewMetadata;
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
async findByTypeModelNameAndModuleName(type: string, modelUserKey: string, moduleUserKey: string): Promise<ViewMetadata | null> {
|
|
33
|
+
const viewMetadata = await this.findOne({
|
|
34
|
+
where: {
|
|
35
|
+
type: type,
|
|
36
|
+
model: {
|
|
37
|
+
singularName: modelUserKey,
|
|
38
|
+
module: {
|
|
39
|
+
name: moduleUserKey
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return viewMetadata;
|
|
45
|
+
}
|
|
31
46
|
}
|