@solidstarters/solid-core 1.2.140 → 1.2.142
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/dtos/create-ai-interaction.dto.d.ts +1 -0
- package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -1
- package/dist/dtos/create-ai-interaction.dto.js +10 -1
- package/dist/dtos/create-ai-interaction.dto.js.map +1 -1
- package/dist/dtos/update-ai-interaction.dto.d.ts +1 -0
- package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -1
- package/dist/dtos/update-ai-interaction.dto.js +7 -1
- package/dist/dtos/update-ai-interaction.dto.js.map +1 -1
- package/dist/entities/ai-interaction.entity.d.ts +1 -0
- package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
- package/dist/entities/ai-interaction.entity.js +9 -1
- package/dist/entities/ai-interaction.entity.js.map +1 -1
- package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts +1 -0
- package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts.map +1 -1
- package/dist/entities/dashboard-question-sql-dataset-config.entity.js +6 -1
- package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
- package/dist/entities/dashboard-question.entity.d.ts +1 -0
- package/dist/entities/dashboard-question.entity.d.ts.map +1 -1
- package/dist/entities/dashboard-question.entity.js +6 -1
- package/dist/entities/dashboard-question.entity.js.map +1 -1
- package/dist/interfaces.d.ts +2 -2
- 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.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +4 -2
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/mappers/dashboard-mapper.d.ts.map +1 -1
- package/dist/mappers/dashboard-mapper.js +2 -0
- package/dist/mappers/dashboard-mapper.js.map +1 -1
- package/dist/repository/view-metadata.repository.d.ts +9 -0
- package/dist/repository/view-metadata.repository.d.ts.map +1 -0
- package/dist/repository/view-metadata.repository.js +42 -0
- package/dist/repository/view-metadata.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +22 -8
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +61 -0
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +1 -0
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts +19 -0
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -0
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +69 -0
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -0
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +2 -2
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +3 -3
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
- package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts +10 -0
- package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts.map +1 -0
- package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js +18 -0
- package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js.map +1 -0
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts +14 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +1 -1
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js +81 -5
- package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +1 -1
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts +12 -0
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +1 -0
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js +36 -0
- package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +1 -0
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +14 -2
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/user.service.d.ts +2 -0
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +15 -0
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +3 -2
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +2 -3
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +8 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.d.ts +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js +5 -3
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/dtos/create-ai-interaction.dto.ts +51 -55
- package/src/dtos/update-ai-interaction.dto.ts +51 -56
- package/src/entities/ai-interaction.entity.ts +29 -34
- package/src/entities/dashboard-question-sql-dataset-config.entity.ts +3 -0
- package/src/entities/dashboard-question.entity.ts +3 -0
- package/src/interfaces.ts +2 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +4 -2
- package/src/mappers/dashboard-mapper.ts +2 -1
- package/src/repository/view-metadata.repository.ts +31 -0
- package/src/seeders/module-metadata-seeder.service.ts +23 -17
- package/src/seeders/seed-data/solid-core-metadata.json +61 -0
- package/src/services/ai-interaction.service.ts +3 -0
- package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +68 -0
- package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +4 -5
- package/src/services/computed-fields/entity/noops-entity-computed-field-provider.service.ts +22 -0
- package/src/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts +83 -9
- package/src/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.ts +34 -0
- package/src/services/setting.service.ts +14 -2
- package/src/services/user.service.ts +22 -0
- package/src/services/view-metadata.service.ts +3 -2
- package/src/solid-core.module.ts +8 -0
- package/src/subscribers/computed-entity-field.subscriber.ts +6 -4
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ComputedFieldMetadata } from "src/helpers/solid-registry";
|
|
2
|
+
import { IEntityPostComputeFieldProvider, IEntityPreComputeFieldProvider } from "src/interfaces";
|
|
3
|
+
|
|
4
|
+
export class NoopsEntityComputedFieldProviderService implements IEntityPreComputeFieldProvider<any, any>, IEntityPostComputeFieldProvider<any, any> {
|
|
5
|
+
constructor() { }
|
|
6
|
+
|
|
7
|
+
name(): string {
|
|
8
|
+
return "NoopsEntityComputedFieldProviderService";
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
help(): string {
|
|
12
|
+
return "This is a no-op computed field provider that does nothing.";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async preComputeValue(entity: any, computedFieldMetadata: ComputedFieldMetadata<any>): Promise<void> {
|
|
16
|
+
// No operation performed
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async postComputeAndSaveValue(entity: any, computedFieldMetadata: ComputedFieldMetadata<any>): Promise<void> {
|
|
20
|
+
// No operation performed
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import { Injectable } from "@nestjs/common";
|
|
2
2
|
import { plainToInstance } from "class-transformer";
|
|
3
3
|
import { CreateDashboardDto } from "src/dtos/create-dashboard.dto";
|
|
4
|
+
import { UpdateMenuItemMetadataDto } from "src/dtos/update-menu-item-metadata.dto";
|
|
4
5
|
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
6
|
+
import { Dashboard } from "src/entities/dashboard.entity";
|
|
5
7
|
import { IMcpToolResponseHandler } from "../../interfaces";
|
|
8
|
+
import { ActionMetadataService } from "../action-metadata.service";
|
|
6
9
|
import { DashboardService } from "../dashboard.service";
|
|
10
|
+
import { MenuItemMetadataService } from "../menu-item-metadata.service";
|
|
11
|
+
import { ModelMetadataService } from "../model-metadata.service";
|
|
12
|
+
import { ModuleMetadataService } from "../module-metadata.service";
|
|
13
|
+
import { RoleMetadataService } from "../role-metadata.service";
|
|
7
14
|
|
|
8
15
|
@Injectable()
|
|
9
16
|
export class SolidCreateDashboardMcpToolResponseHandler implements IMcpToolResponseHandler {
|
|
10
17
|
|
|
11
18
|
constructor(
|
|
12
19
|
private readonly dashboardService: DashboardService,
|
|
20
|
+
private readonly actionMetadataService: ActionMetadataService,
|
|
21
|
+
private readonly menuItemMetadataService: MenuItemMetadataService,
|
|
22
|
+
private readonly moduleMetadataService: ModuleMetadataService,
|
|
23
|
+
private readonly modelMetadataService: ModelMetadataService,
|
|
24
|
+
private readonly roleService: RoleMetadataService, // Assuming roleService is a Mongoose model, adjust as necessary
|
|
13
25
|
) {
|
|
14
26
|
}
|
|
15
27
|
|
|
@@ -17,17 +29,11 @@ export class SolidCreateDashboardMcpToolResponseHandler implements IMcpToolRespo
|
|
|
17
29
|
const escapedMessage = aiInteraction.message.replace(/\\'/g, "'");
|
|
18
30
|
const aiResponseMessage = JSON.parse(escapedMessage);
|
|
19
31
|
|
|
20
|
-
|
|
32
|
+
const { dashboardDto, dashboard } = await this.createDashboard(aiResponseMessage);
|
|
21
33
|
|
|
22
|
-
|
|
23
|
-
// This is a workaround for now, until we find a better solution.
|
|
24
|
-
// const aiResponseMessageReplaced = aiResponse['message'].replace(/\\'/g, "'");
|
|
25
|
-
|
|
26
|
-
const dashboardDto = plainToInstance(CreateDashboardDto, aiResponseMessage);
|
|
27
|
-
dashboardDto['layoutJson'] = JSON.stringify(dashboardDto['layoutJson']);
|
|
34
|
+
const { moduleUserKey, actionMetadataEntity } = await this.createActionMetadataEntry(dashboardDto, dashboard);
|
|
28
35
|
|
|
29
|
-
|
|
30
|
-
const dashboard = await this.dashboardService.create(dashboardDto, []);
|
|
36
|
+
await this.createMenuItemEntry(dashboard, moduleUserKey, actionMetadataEntity);
|
|
31
37
|
|
|
32
38
|
// TODO: decide on some shape to return hre...
|
|
33
39
|
return {
|
|
@@ -36,4 +42,72 @@ export class SolidCreateDashboardMcpToolResponseHandler implements IMcpToolRespo
|
|
|
36
42
|
}
|
|
37
43
|
}
|
|
38
44
|
|
|
45
|
+
|
|
46
|
+
private async createMenuItemEntry(dashboard: Dashboard, moduleUserKey: string, actionMetadataEntity: any) {
|
|
47
|
+
const menuData = {
|
|
48
|
+
displayName: dashboard.displayName || dashboard.name,
|
|
49
|
+
name: `${moduleUserKey}-${dashboard.name}-dashboard-menu-item`,
|
|
50
|
+
sequenceNumber: 1,
|
|
51
|
+
actionUserKey: actionMetadataEntity.name,
|
|
52
|
+
moduleUserKey: moduleUserKey,
|
|
53
|
+
parentMenuItemUserKey: '',
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const adminRole = await this.roleService.findRoleByName('Admin');
|
|
57
|
+
const specifiedRoles = menuData['roles'];
|
|
58
|
+
|
|
59
|
+
// If the developer has specified roles, then resolve them, making sure that admin role is also given.
|
|
60
|
+
const specifiedRoleObjects = [adminRole];
|
|
61
|
+
if (specifiedRoles) {
|
|
62
|
+
for (let i = 0; i < specifiedRoles.length; i++) {
|
|
63
|
+
const specifiedRole = specifiedRoles[i];
|
|
64
|
+
const specifiedRoleObject = await this.roleService.findRoleByName(specifiedRole);
|
|
65
|
+
if (!specifiedRoleObject) {
|
|
66
|
+
throw new Error(`Invalid role: (${specifiedRole}) specified against menu with display name ${menuData.displayName}.`);
|
|
67
|
+
}
|
|
68
|
+
specifiedRoleObjects.push(specifiedRoleObject);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
menuData['roles'] = specifiedRoleObjects;
|
|
73
|
+
menuData['action'] = await this.actionMetadataService.findOneByUserKey(menuData.actionUserKey);
|
|
74
|
+
menuData['module'] = await this.moduleMetadataService.findOneByUserKey(menuData.moduleUserKey);
|
|
75
|
+
|
|
76
|
+
if (menuData.parentMenuItemUserKey) {
|
|
77
|
+
menuData['parentMenuItem'] = await this.menuItemMetadataService.findOneByUserKey(menuData.parentMenuItemUserKey);
|
|
78
|
+
} else {
|
|
79
|
+
menuData['parentMenuItem'] = null;
|
|
80
|
+
}
|
|
81
|
+
await this.menuItemMetadataService.upsert(menuData as unknown as UpdateMenuItemMetadataDto);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private async createActionMetadataEntry(dashboardDto: CreateDashboardDto, dashboard: Dashboard) {
|
|
85
|
+
const moduleUserKey = dashboardDto.moduleUserKey;
|
|
86
|
+
const actionMetadata = {
|
|
87
|
+
name: `${dashboard.name}-view`,
|
|
88
|
+
displayName: dashboard.displayName || dashboard.name,
|
|
89
|
+
type: 'custom',
|
|
90
|
+
domain: "{}",
|
|
91
|
+
context: "{}",
|
|
92
|
+
customComponent: `/admin/core/${moduleUserKey}/dashboards?dashboardName=${dashboard.name}`,
|
|
93
|
+
customIsModal: true,
|
|
94
|
+
serverEndpoint: '',
|
|
95
|
+
moduleUserKey: moduleUserKey,
|
|
96
|
+
modelUserKey: '',
|
|
97
|
+
viewUserKey: `${dashboard.name}-view`,
|
|
98
|
+
};
|
|
99
|
+
actionMetadata['module'] = await this.moduleMetadataService.findOneByUserKey(actionMetadata.moduleUserKey);
|
|
100
|
+
if (actionMetadata.modelUserKey) {
|
|
101
|
+
actionMetadata['model'] = await this.modelMetadataService.findOneByUserKey(actionMetadata.modelUserKey);
|
|
102
|
+
}
|
|
103
|
+
const actionMetadataEntity = await this.actionMetadataService.upsert(actionMetadata);
|
|
104
|
+
return { moduleUserKey, actionMetadataEntity };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private async createDashboard(aiResponseMessage: any) {
|
|
108
|
+
const dashboardDto = plainToInstance(CreateDashboardDto, aiResponseMessage);
|
|
109
|
+
dashboardDto['layoutJson'] = JSON.stringify(dashboardDto['layoutJson']);
|
|
110
|
+
const dashboard = await this.dashboardService.create(dashboardDto, []);
|
|
111
|
+
return { dashboardDto, dashboard };
|
|
112
|
+
}
|
|
39
113
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Injectable } from "@nestjs/common";
|
|
2
|
+
import { AiInteraction } from "src/entities/ai-interaction.entity";
|
|
3
|
+
import { ViewMetadataRepository } from "src/repository/view-metadata.repository";
|
|
4
|
+
import { IMcpToolResponseHandler } from "../../interfaces";
|
|
5
|
+
|
|
6
|
+
@Injectable()
|
|
7
|
+
export class SolidCreateModelLayoutMcpToolResponseHandler implements IMcpToolResponseHandler {
|
|
8
|
+
|
|
9
|
+
constructor(
|
|
10
|
+
private readonly viewMetadataRepository: ViewMetadataRepository,
|
|
11
|
+
) {
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async apply(aiInteraction: AiInteraction) {
|
|
15
|
+
const aiResponse = JSON.parse(aiInteraction.message);
|
|
16
|
+
|
|
17
|
+
// Get the data for resolving the view metadata
|
|
18
|
+
const {name, modelUserKey, moduleUserKey, layout} = aiResponse;
|
|
19
|
+
|
|
20
|
+
// Fetch the view metadata for the given model and module and the view name
|
|
21
|
+
const viewMetadata = await this.viewMetadataRepository.findByNameAndModelNameAndModuleName(name, modelUserKey, moduleUserKey);
|
|
22
|
+
|
|
23
|
+
viewMetadata.layout = JSON.stringify(layout);
|
|
24
|
+
// Save the updated view metadata
|
|
25
|
+
await this.viewMetadataRepository.save(viewMetadata);
|
|
26
|
+
|
|
27
|
+
// TODO: decide on some shape to return hre...
|
|
28
|
+
return {
|
|
29
|
+
seedingRequired: false,
|
|
30
|
+
serverRebooting: false,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
}
|
|
@@ -66,7 +66,13 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
66
66
|
enableDarkMode: true,
|
|
67
67
|
copyright: null,
|
|
68
68
|
enableUsername: true,
|
|
69
|
-
enabledNotification: true
|
|
69
|
+
enabledNotification: true,
|
|
70
|
+
contactSupportEmail : null,
|
|
71
|
+
contactSupportDisplayName: null,
|
|
72
|
+
contactSupportIcon: null,
|
|
73
|
+
authScreenRightBackgroundImage: null,
|
|
74
|
+
authScreenLeftBackgroundImage: null,
|
|
75
|
+
authScreenCenterBackgroundImage: null,
|
|
70
76
|
};
|
|
71
77
|
|
|
72
78
|
const existingSettings = await this.repo.find();
|
|
@@ -153,7 +159,13 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
153
159
|
copyright: null,
|
|
154
160
|
forceChangePasswordOnFirstLogin: true,
|
|
155
161
|
enableUsername: true,
|
|
156
|
-
enabledNotification: true
|
|
162
|
+
enabledNotification: true,
|
|
163
|
+
contactSupportEmail : null,
|
|
164
|
+
contactSupportDisplayName: null,
|
|
165
|
+
contactSupportIcon: null,
|
|
166
|
+
authScreenRightBackgroundImage: null,
|
|
167
|
+
authScreenLeftBackgroundImage: null,
|
|
168
|
+
authScreenCenterBackgroundImage: null,
|
|
157
169
|
};
|
|
158
170
|
}
|
|
159
171
|
|
|
@@ -39,6 +39,28 @@ export class UserService extends CRUDService<User> {
|
|
|
39
39
|
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'user', 'solid-core', moduleRef);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
override async delete(id: number, solidRequestContext: any = {}) {
|
|
43
|
+
// Prevent user from deleting themselves
|
|
44
|
+
if (solidRequestContext?.activeUser?.sub === id) {
|
|
45
|
+
throw new BadRequestException('Deleting logged-in user is not allowed');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ✅ Proceed with the default deletion logic
|
|
49
|
+
return super.delete(id, solidRequestContext);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
override async deleteMany(ids: number[], solidRequestContext: any = {}): Promise<any> {
|
|
53
|
+
if (!ids || ids.length === 0) {
|
|
54
|
+
throw new Error('At least one ID is required for deletion');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ❌ If the active user is trying to delete themselves
|
|
58
|
+
if (solidRequestContext?.activeUser?.sub && ids.includes(solidRequestContext.activeUser.id)) {
|
|
59
|
+
throw new BadRequestException('Deleting logged-in user is not allowed');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return super.deleteMany(ids, solidRequestContext);
|
|
63
|
+
}
|
|
42
64
|
|
|
43
65
|
async findOneByEmail(email: string): Promise<User> {
|
|
44
66
|
return await this.repo.findOne({
|
|
@@ -20,6 +20,7 @@ import { ViewMetadata } from '../entities/view-metadata.entity';
|
|
|
20
20
|
import { ActionMetadataService } from './action-metadata.service';
|
|
21
21
|
import { SolidIntrospectService } from './solid-introspect.service';
|
|
22
22
|
import { UserViewMetadataService } from './user-view-metadata.service';
|
|
23
|
+
import { ViewMetadataRepository } from 'src/repository/view-metadata.repository';
|
|
23
24
|
|
|
24
25
|
@Injectable()
|
|
25
26
|
export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
@@ -35,8 +36,8 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
35
36
|
readonly userViewMetadataService: UserViewMetadataService,
|
|
36
37
|
@InjectEntityManager()
|
|
37
38
|
readonly entityManager: EntityManager,
|
|
38
|
-
@InjectRepository(ViewMetadata, 'default')
|
|
39
|
-
readonly repo:
|
|
39
|
+
// @InjectRepository(ViewMetadata, 'default')
|
|
40
|
+
readonly repo: ViewMetadataRepository,
|
|
40
41
|
@InjectRepository(FieldMetadata)
|
|
41
42
|
private readonly fieldMetadataRepo: Repository<FieldMetadata>,
|
|
42
43
|
@InjectRepository(ModelMetadata)
|
package/src/solid-core.module.ts
CHANGED
|
@@ -255,6 +255,10 @@ import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
|
|
|
255
255
|
import { SolidCreateDashboardWidgetMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-dashboard-widget-mcp-tool-response-handler.service';
|
|
256
256
|
import { SolidCreateModelWithFieldsMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-create-model-with-fields-mcp-tool-response-handler.service';
|
|
257
257
|
import { SolidAddFieldMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-add-field-mcp-tool-response-handler.service';
|
|
258
|
+
import { ViewMetadataRepository } from './repository/view-metadata.repository';
|
|
259
|
+
import { SolidCreateModelLayoutMcpToolResponseHandler } from './services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service';
|
|
260
|
+
import { NoopsEntityComputedFieldProviderService } from './services/computed-fields/entity/noops-entity-computed-field-provider.service';
|
|
261
|
+
import { AlphaNumExternalIdComputationProvider } from './services/computed-fields/entity/alpha-num-external-id-computed-field-provider';
|
|
258
262
|
|
|
259
263
|
|
|
260
264
|
@Global()
|
|
@@ -534,12 +538,16 @@ import { SolidAddFieldMcpToolResponseHandler } from './services/mcp-tool-respons
|
|
|
534
538
|
DashboardVariableSubscriber,
|
|
535
539
|
DashboardQuestionSubscriber,
|
|
536
540
|
DashboardQuestionSqlDatasetConfigSubscriber,
|
|
541
|
+
NoopsEntityComputedFieldProviderService,
|
|
537
542
|
SolidCreateDashboardMcpToolResponseHandler,
|
|
538
543
|
SolidCreateDashboardQuestionMcpToolResponseHandler,
|
|
539
544
|
SolidCreateDashboardQuestionSqlDatasetConfigMcpToolResponseHandler,
|
|
540
545
|
SolidCreateDashboardWidgetMcpToolResponseHandler,
|
|
541
546
|
SolidCreateModelWithFieldsMcpToolResponseHandler,
|
|
542
547
|
SolidAddFieldMcpToolResponseHandler,
|
|
548
|
+
ViewMetadataRepository,
|
|
549
|
+
SolidCreateModelLayoutMcpToolResponseHandler,
|
|
550
|
+
AlphaNumExternalIdComputationProvider,
|
|
543
551
|
],
|
|
544
552
|
exports: [
|
|
545
553
|
ModuleMetadataService,
|
|
@@ -89,17 +89,19 @@ export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
private async evaluateComputedField(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {
|
|
92
|
-
const computedValue = await this.
|
|
93
|
-
|
|
92
|
+
const computedValue = await this.preComputeValue(computedFieldMetadata, entity);
|
|
93
|
+
if (computedValue) {
|
|
94
|
+
entity[computedFieldMetadata.fieldName] = computedValue; //TODO: This line here is just for backward compatibility, once the pre compute interface is change to return void, we will get rid of it.
|
|
95
|
+
}
|
|
94
96
|
}
|
|
95
97
|
|
|
96
|
-
private async
|
|
98
|
+
private async preComputeValue(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {
|
|
97
99
|
try {
|
|
98
100
|
const provider = this.solidRegistry.getComputedFieldProvider(computedFieldMetadata.computedFieldValueProviderName);
|
|
99
101
|
// Get the instance of the provider and assert it is of type IEntityComputedFieldProvider
|
|
100
102
|
const providerInstance = provider.instance as IEntityPreComputeFieldProvider<any, any, any>; // IEntityComputedFieldProvider
|
|
101
103
|
const computedValue = await providerInstance.preComputeValue(entity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue
|
|
102
|
-
return computedValue;
|
|
104
|
+
return computedValue; //TODO: This line here is just for backward compatibility, once the pre compute interface is change to return void, we will get rid of it.
|
|
103
105
|
} catch (error) {
|
|
104
106
|
throw new InternalServerErrorException(`Error evaluating computed field ${computedFieldMetadata.fieldName} for model ${computedFieldMetadata.modelName} for triggered entity ${entity.constructor.name}: ${error.message}`);
|
|
105
107
|
}
|