@solidxai/core 0.1.12 → 0.1.13-beta.0

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 (50) hide show
  1. package/dist/controllers/view-metadata.controller.d.ts +1 -1
  2. package/dist/decorators/workflow-field-data-provider.decorator.d.ts +3 -0
  3. package/dist/decorators/workflow-field-data-provider.decorator.d.ts.map +1 -0
  4. package/dist/decorators/workflow-field-data-provider.decorator.js +11 -0
  5. package/dist/decorators/workflow-field-data-provider.decorator.js.map +1 -0
  6. package/dist/helpers/solid-registry.d.ts +5 -1
  7. package/dist/helpers/solid-registry.d.ts.map +1 -1
  8. package/dist/helpers/solid-registry.js +17 -0
  9. package/dist/helpers/solid-registry.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/interfaces.d.ts +24 -0
  15. package/dist/interfaces.d.ts.map +1 -1
  16. package/dist/interfaces.js.map +1 -1
  17. package/dist/repository/security-rule.repository.d.ts +1 -0
  18. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  19. package/dist/repository/security-rule.repository.js +28 -7
  20. package/dist/repository/security-rule.repository.js.map +1 -1
  21. package/dist/services/chatter-message.service.d.ts.map +1 -1
  22. package/dist/services/chatter-message.service.js +1 -1
  23. package/dist/services/chatter-message.service.js.map +1 -1
  24. package/dist/services/crud-helper.service.d.ts +16 -1
  25. package/dist/services/crud-helper.service.d.ts.map +1 -1
  26. package/dist/services/crud-helper.service.js +99 -22
  27. package/dist/services/crud-helper.service.js.map +1 -1
  28. package/dist/services/crud.service.d.ts +1 -0
  29. package/dist/services/crud.service.d.ts.map +1 -1
  30. package/dist/services/crud.service.js +15 -0
  31. package/dist/services/crud.service.js.map +1 -1
  32. package/dist/services/solid-introspect.service.d.ts +1 -0
  33. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  34. package/dist/services/solid-introspect.service.js +12 -0
  35. package/dist/services/solid-introspect.service.js.map +1 -1
  36. package/dist/services/view-metadata.service.d.ts +5 -1
  37. package/dist/services/view-metadata.service.d.ts.map +1 -1
  38. package/dist/services/view-metadata.service.js +63 -14
  39. package/dist/services/view-metadata.service.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/decorators/workflow-field-data-provider.decorator.ts +7 -0
  42. package/src/helpers/solid-registry.ts +21 -1
  43. package/src/index.ts +1 -0
  44. package/src/interfaces.ts +29 -0
  45. package/src/repository/security-rule.repository.ts +52 -10
  46. package/src/services/chatter-message.service.ts +5 -1
  47. package/src/services/crud-helper.service.ts +220 -22
  48. package/src/services/crud.service.ts +30 -0
  49. package/src/services/solid-introspect.service.ts +19 -0
  50. package/src/services/view-metadata.service.ts +87 -21
@@ -18,6 +18,7 @@ import { MenuItemMetadataService } from './menu-item-metadata.service';
18
18
  import { SolidIntrospectService } from './solid-introspect.service';
19
19
  import { UserViewMetadataService } from './user-view-metadata.service';
20
20
  import { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';
21
+ import { IWorkflowFieldDataProviderValues } from 'src/interfaces';
21
22
 
22
23
  @Injectable()
23
24
  export class ViewMetadataService extends CRUDService<ViewMetadata> {
@@ -112,6 +113,90 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
112
113
 
113
114
  private readonly logger = new Logger(ViewMetadataService.name);
114
115
 
116
+ private parseJsonObject(value: any): Record<string, any> {
117
+ if (!value) {
118
+ return {};
119
+ }
120
+
121
+ if (typeof value === 'object') {
122
+ return value;
123
+ }
124
+
125
+ if (typeof value === 'string') {
126
+ try {
127
+ return JSON.parse(value);
128
+ } catch (error: any) {
129
+ this.logger.warn(`Unable to parse workflow field provider context: ${error?.message ?? error}`);
130
+ }
131
+ }
132
+
133
+ return {};
134
+ }
135
+
136
+ private async getDefaultWorkflowFieldData(
137
+ workflowField: FieldMetadata,
138
+ workflowFieldName: string,
139
+ fieldsMap: Map<string, FieldMetadata>,
140
+ ): Promise<IWorkflowFieldDataProviderValues[]> {
141
+ if (workflowField.type === 'selectionStatic') {
142
+ return workflowField.selectionStaticValues.map(item => {
143
+ const [value, label] = item.split(":");
144
+ return { label, value };
145
+ });
146
+ }
147
+
148
+ if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {
149
+ const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);
150
+ const data = await comodelCrudService.find({ limit: 100, offset: 0, });
151
+ const records = data.records ?? [];
152
+ const workflowFieldMetadata = fieldsMap.get(workflowFieldName);
153
+ const workflowFieldUserKey = (workflowFieldMetadata as any)?.relationModel?.userKeyField?.name;
154
+
155
+ if (!workflowFieldUserKey) {
156
+ this.logger.warn(`Unable to identify relation user key for workflow field: ${workflowFieldName}`);
157
+ return [];
158
+ }
159
+
160
+ return records.map(item => ({ label: item[workflowFieldUserKey], value: item['id'] }));
161
+ }
162
+
163
+ return [];
164
+ }
165
+
166
+ private async getWorkflowFieldData(
167
+ entity: ViewMetadata,
168
+ workflowField: FieldMetadata,
169
+ workflowFieldName: string,
170
+ fieldsMap: Map<string, FieldMetadata>,
171
+ query: Record<string, any>,
172
+ activeUser: any,
173
+ ): Promise<readonly IWorkflowFieldDataProviderValues[]> {
174
+ const workflowFieldDataProviderName = entity.layout?.attrs?.workflowFieldDataProvider;
175
+ if (workflowFieldDataProviderName) {
176
+ const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
177
+ const provider = solidRegistry.getWorkflowFieldDataProviderInstance(workflowFieldDataProviderName);
178
+ if (!provider) {
179
+ throw new BadRequestException(`Workflow field data provider ${workflowFieldDataProviderName} not found`);
180
+ }
181
+
182
+ return provider.values({
183
+ entityId: query?.id,
184
+ modelName: entity.model?.singularName ?? query?.modelName,
185
+ moduleName: entity.module?.name ?? query?.moduleName,
186
+ workflowFieldName,
187
+ workflowField,
188
+ solidModel: entity.model,
189
+ solidView: entity,
190
+ solidFieldsMetadata: Object.fromEntries(fieldsMap),
191
+ query,
192
+ providerContext: this.parseJsonObject(entity.layout?.attrs?.workflowFieldDataProviderCtxt),
193
+ activeUser,
194
+ });
195
+ }
196
+
197
+ return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);
198
+ }
199
+
115
200
  //for locales
116
201
  private async getEntityRecordsInAllLocales(
117
202
  modelName: string,
@@ -331,28 +416,9 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
331
416
  }
332
417
 
333
418
  // 9. Use the resolved workflowField to populate workflow specific metadata.
334
- // Check if we were able to resolve an actual workflowField.
335
- let solidFormViewWorkflowData = [];
419
+ let solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[] = [];
336
420
  if (viewType === 'form' && workflowField) {
337
- // check for type of workflow field.
338
- // for workflowFields of type selectionStatic we simply return the key/values from field metadata AS-IS
339
- if (workflowField.type === 'selectionStatic') {
340
- solidFormViewWorkflowData = workflowField.selectionStaticValues.map(item => {
341
- const [value, label] = item.split(":");
342
- return { label, value };
343
- });
344
- }
345
- // for workflowFields of type relation.many-to-one we need to query the co-model, and return data in key/value format.
346
- if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {
347
- const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);
348
- const data = await comodelCrudService.find({ limit: 100, offset: 0, });
349
- const records = data.records ?? [];
350
- const workflowFieldMetadata = fieldsMap.get(workflowFieldName);
351
- const workflowFielUserkey = workflowFieldMetadata['relationModel']['userKeyField']['name'];
352
-
353
- // iterate over the comodel records extracting the label & value.
354
- solidFormViewWorkflowData = records.map(item => ({ 'label': item[workflowFielUserkey], 'value': item['id'] }))
355
- }
421
+ solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);
356
422
  }
357
423
 
358
424
  // 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.