@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.
Files changed (103) hide show
  1. package/dist/dtos/create-ai-interaction.dto.d.ts +1 -0
  2. package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -1
  3. package/dist/dtos/create-ai-interaction.dto.js +10 -1
  4. package/dist/dtos/create-ai-interaction.dto.js.map +1 -1
  5. package/dist/dtos/update-ai-interaction.dto.d.ts +1 -0
  6. package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -1
  7. package/dist/dtos/update-ai-interaction.dto.js +7 -1
  8. package/dist/dtos/update-ai-interaction.dto.js.map +1 -1
  9. package/dist/entities/ai-interaction.entity.d.ts +1 -0
  10. package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
  11. package/dist/entities/ai-interaction.entity.js +9 -1
  12. package/dist/entities/ai-interaction.entity.js.map +1 -1
  13. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts +1 -0
  14. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts.map +1 -1
  15. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +6 -1
  16. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
  17. package/dist/entities/dashboard-question.entity.d.ts +1 -0
  18. package/dist/entities/dashboard-question.entity.d.ts.map +1 -1
  19. package/dist/entities/dashboard-question.entity.js +6 -1
  20. package/dist/entities/dashboard-question.entity.js.map +1 -1
  21. package/dist/interfaces.d.ts +2 -2
  22. package/dist/interfaces.d.ts.map +1 -1
  23. package/dist/interfaces.js.map +1 -1
  24. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  25. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +4 -2
  26. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  27. package/dist/mappers/dashboard-mapper.d.ts.map +1 -1
  28. package/dist/mappers/dashboard-mapper.js +2 -0
  29. package/dist/mappers/dashboard-mapper.js.map +1 -1
  30. package/dist/repository/view-metadata.repository.d.ts +9 -0
  31. package/dist/repository/view-metadata.repository.d.ts.map +1 -0
  32. package/dist/repository/view-metadata.repository.js +42 -0
  33. package/dist/repository/view-metadata.repository.js.map +1 -0
  34. package/dist/seeders/module-metadata-seeder.service.d.ts +1 -1
  35. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  36. package/dist/seeders/module-metadata-seeder.service.js +22 -8
  37. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  38. package/dist/seeders/seed-data/solid-core-metadata.json +61 -0
  39. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  40. package/dist/services/ai-interaction.service.js +1 -0
  41. package/dist/services/ai-interaction.service.js.map +1 -1
  42. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts +19 -0
  43. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -0
  44. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +69 -0
  45. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -0
  46. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +2 -2
  47. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
  48. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +3 -3
  49. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
  50. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts +10 -0
  51. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts.map +1 -0
  52. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js +18 -0
  53. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js.map +1 -0
  54. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts +14 -1
  55. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +1 -1
  56. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js +81 -5
  57. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +1 -1
  58. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts +12 -0
  59. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +1 -0
  60. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js +36 -0
  61. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +1 -0
  62. package/dist/services/setting.service.d.ts.map +1 -1
  63. package/dist/services/setting.service.js +14 -2
  64. package/dist/services/setting.service.js.map +1 -1
  65. package/dist/services/user.service.d.ts +2 -0
  66. package/dist/services/user.service.d.ts.map +1 -1
  67. package/dist/services/user.service.js +15 -0
  68. package/dist/services/user.service.js.map +1 -1
  69. package/dist/services/view-metadata.service.d.ts +3 -2
  70. package/dist/services/view-metadata.service.d.ts.map +1 -1
  71. package/dist/services/view-metadata.service.js +2 -3
  72. package/dist/services/view-metadata.service.js.map +1 -1
  73. package/dist/solid-core.module.d.ts.map +1 -1
  74. package/dist/solid-core.module.js +8 -0
  75. package/dist/solid-core.module.js.map +1 -1
  76. package/dist/subscribers/computed-entity-field.subscriber.d.ts +1 -1
  77. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  78. package/dist/subscribers/computed-entity-field.subscriber.js +5 -3
  79. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  80. package/dist/tsconfig.tsbuildinfo +1 -1
  81. package/package.json +1 -1
  82. package/src/dtos/create-ai-interaction.dto.ts +51 -55
  83. package/src/dtos/update-ai-interaction.dto.ts +51 -56
  84. package/src/entities/ai-interaction.entity.ts +29 -34
  85. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +3 -0
  86. package/src/entities/dashboard-question.entity.ts +3 -0
  87. package/src/interfaces.ts +2 -2
  88. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +4 -2
  89. package/src/mappers/dashboard-mapper.ts +2 -1
  90. package/src/repository/view-metadata.repository.ts +31 -0
  91. package/src/seeders/module-metadata-seeder.service.ts +23 -17
  92. package/src/seeders/seed-data/solid-core-metadata.json +61 -0
  93. package/src/services/ai-interaction.service.ts +3 -0
  94. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +68 -0
  95. package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +4 -5
  96. package/src/services/computed-fields/entity/noops-entity-computed-field-provider.service.ts +22 -0
  97. package/src/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts +83 -9
  98. package/src/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.ts +34 -0
  99. package/src/services/setting.service.ts +14 -2
  100. package/src/services/user.service.ts +22 -0
  101. package/src/services/view-metadata.service.ts +3 -2
  102. package/src/solid-core.module.ts +8 -0
  103. 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
- // const aiResponse = JSON.parse(aiInteraction.message);
32
+ const { dashboardDto, dashboard } = await this.createDashboard(aiResponseMessage);
21
33
 
22
- //FIXME: Replace \' with ' in the response, since the AI response seems to contain \' which is invalid JSON.
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: Repository<ViewMetadata>,
39
+ // @InjectRepository(ViewMetadata, 'default')
40
+ readonly repo: ViewMetadataRepository,
40
41
  @InjectRepository(FieldMetadata)
41
42
  private readonly fieldMetadataRepo: Repository<FieldMetadata>,
42
43
  @InjectRepository(ModelMetadata)
@@ -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.getComputedValue(computedFieldMetadata, entity);
93
- entity[computedFieldMetadata.fieldName] = computedValue; // Set the computed value on the entity
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 getComputedValue(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {
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
  }