@solidstarters/solid-core 1.2.157 → 1.2.159

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 (94) hide show
  1. package/dist/config/cache.options.js +2 -7
  2. package/dist/config/cache.options.js.map +1 -1
  3. package/dist/constants/error-messages.js +1 -1
  4. package/dist/constants/error-messages.js.map +1 -1
  5. package/dist/controllers/authentication.controller.d.ts +0 -2
  6. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  7. package/dist/controllers/authentication.controller.js +5 -5
  8. package/dist/controllers/authentication.controller.js.map +1 -1
  9. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  10. package/dist/factories/whatsapp.factory.js +1 -1
  11. package/dist/factories/whatsapp.factory.js.map +1 -1
  12. package/dist/helpers/environment.helper.d.ts +2 -0
  13. package/dist/helpers/environment.helper.d.ts.map +1 -1
  14. package/dist/helpers/environment.helper.js +7 -0
  15. package/dist/helpers/environment.helper.js.map +1 -1
  16. package/dist/helpers/index.d.ts +2 -0
  17. package/dist/helpers/index.d.ts.map +1 -0
  18. package/dist/helpers/index.js +13 -0
  19. package/dist/helpers/index.js.map +1 -0
  20. package/dist/helpers/model-metadata-helper.service.d.ts +5 -1
  21. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  22. package/dist/helpers/model-metadata-helper.service.js +32 -2
  23. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  24. package/dist/helpers/string.helper.d.ts +2 -0
  25. package/dist/helpers/string.helper.d.ts.map +1 -0
  26. package/dist/helpers/string.helper.js +10 -0
  27. package/dist/helpers/string.helper.js.map +1 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  33. package/dist/repository/security-rule.repository.js +16 -9
  34. package/dist/repository/security-rule.repository.js.map +1 -1
  35. package/dist/repository/user.repository.d.ts +12 -0
  36. package/dist/repository/user.repository.d.ts.map +1 -0
  37. package/dist/repository/user.repository.js +34 -0
  38. package/dist/repository/user.repository.js.map +1 -0
  39. package/dist/seeders/module-metadata-seeder.service.d.ts +12 -12
  40. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  41. package/dist/seeders/module-metadata-seeder.service.js +33 -13
  42. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  43. package/dist/seeders/seed-data/solid-core-metadata.json +40 -6
  44. package/dist/services/authentication.service.d.ts +0 -2
  45. package/dist/services/authentication.service.d.ts.map +1 -1
  46. package/dist/services/authentication.service.js +15 -14
  47. package/dist/services/authentication.service.js.map +1 -1
  48. package/dist/services/chatter-message.service.d.ts +8 -2
  49. package/dist/services/chatter-message.service.d.ts.map +1 -1
  50. package/dist/services/chatter-message.service.js +155 -30
  51. package/dist/services/chatter-message.service.js.map +1 -1
  52. package/dist/services/crud-helper.service.d.ts +7 -3
  53. package/dist/services/crud-helper.service.d.ts.map +1 -1
  54. package/dist/services/crud-helper.service.js +17 -5
  55. package/dist/services/crud-helper.service.js.map +1 -1
  56. package/dist/services/list-of-values.service.js.map +1 -1
  57. package/dist/services/user.service.d.ts +3 -2
  58. package/dist/services/user.service.d.ts.map +1 -1
  59. package/dist/services/user.service.js +2 -2
  60. package/dist/services/user.service.js.map +1 -1
  61. package/dist/services/view-metadata.service.d.ts +3 -1
  62. package/dist/services/view-metadata.service.d.ts.map +1 -1
  63. package/dist/services/view-metadata.service.js +5 -2
  64. package/dist/services/view-metadata.service.js.map +1 -1
  65. package/dist/solid-core.module.d.ts.map +1 -1
  66. package/dist/solid-core.module.js +16 -7
  67. package/dist/solid-core.module.js.map +1 -1
  68. package/dist/subscribers/audit.subscriber.d.ts +3 -1
  69. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  70. package/dist/subscribers/audit.subscriber.js +10 -5
  71. package/dist/subscribers/audit.subscriber.js.map +1 -1
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +2 -1
  74. package/src/config/cache.options.ts +1 -6
  75. package/src/constants/error-messages.ts +1 -1
  76. package/src/controllers/authentication.controller.ts +5 -5
  77. package/src/factories/whatsapp.factory.ts +2 -1
  78. package/src/helpers/environment.helper.ts +9 -0
  79. package/src/helpers/index.ts +9 -0
  80. package/src/helpers/model-metadata-helper.service.ts +30 -2
  81. package/src/helpers/string.helper.ts +4 -0
  82. package/src/index.ts +1 -0
  83. package/src/repository/security-rule.repository.ts +25 -12
  84. package/src/repository/user.repository.ts +17 -0
  85. package/src/seeders/module-metadata-seeder.service.ts +36 -15
  86. package/src/seeders/seed-data/solid-core-metadata.json +40 -6
  87. package/src/services/authentication.service.ts +20 -14
  88. package/src/services/chatter-message.service.ts +185 -35
  89. package/src/services/crud-helper.service.ts +24 -6
  90. package/src/services/list-of-values.service.ts +1 -1
  91. package/src/services/user.service.ts +3 -2
  92. package/src/services/view-metadata.service.ts +3 -1
  93. package/src/solid-core.module.ts +13 -3
  94. package/src/subscribers/audit.subscriber.ts +9 -3
@@ -29,8 +29,10 @@ const chatter_message_details_entity_1 = require("../entities/chatter-message-de
29
29
  const model_metadata_entity_1 = require("../entities/model-metadata.entity");
30
30
  const request_context_service_1 = require("./request-context.service");
31
31
  const chatter_message_repository_1 = require("../repository/chatter-message.repository");
32
+ const string_helper_1 = require("../helpers/string.helper");
33
+ const model_metadata_helper_service_1 = require("../helpers/model-metadata-helper.service");
32
34
  let ChatterMessageService = class ChatterMessageService extends crud_service_1.CRUDService {
33
- constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, chatterMessageDetailsRepo, moduleRef, modelMetadataRepo, requestContextService) {
35
+ constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, chatterMessageDetailsRepo, moduleRef, modelMetadataRepo, requestContextService, modelMetadataHelperService) {
34
36
  super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
35
37
  this.modelMetadataService = modelMetadataService;
36
38
  this.moduleMetadataService = moduleMetadataService;
@@ -44,6 +46,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
44
46
  this.moduleRef = moduleRef;
45
47
  this.modelMetadataRepo = modelMetadataRepo;
46
48
  this.requestContextService = requestContextService;
49
+ this.modelMetadataHelperService = modelMetadataHelperService;
47
50
  }
48
51
  async postMessage(postDto, files = []) {
49
52
  const chatterMessage = new chatter_message_entity_1.ChatterMessage();
@@ -88,7 +91,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
88
91
  }
89
92
  const model = await this.modelMetadataRepo.findOne({
90
93
  where: {
91
- displayName: metadata.name
94
+ singularName: (0, string_helper_1.lowerFirst)(metadata.name)
92
95
  },
93
96
  relations: {
94
97
  fields: true,
@@ -130,13 +133,13 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
130
133
  }
131
134
  }
132
135
  }
133
- async postAuditMessageOnUpdate(entity, metadata, databaseEntity, messageQueue = false) {
136
+ async postAuditMessageOnUpdate(entity, metadata, databaseEntity, updatedColumns = [], messageQueue = false) {
134
137
  if (!databaseEntity || !entity) {
135
138
  return;
136
139
  }
137
140
  const model = await this.modelMetadataRepo.findOne({
138
141
  where: {
139
- displayName: metadata.name
142
+ singularName: (0, string_helper_1.lowerFirst)(metadata.name)
140
143
  },
141
144
  relations: {
142
145
  fields: true,
@@ -146,25 +149,50 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
146
149
  if (!model || !model.enableAuditTracking) {
147
150
  return;
148
151
  }
149
- const auditFields = model.fields.filter(field => field.enableAuditTracking &&
152
+ const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName);
153
+ const auditFields = modelFields.filter(field => field.enableAuditTracking &&
150
154
  !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&
151
155
  !(field.type === 'relation' && field.relationType === 'one-to-many'));
152
- const relationFields = auditFields.filter(field => field.type === 'relation');
153
- if (relationFields.length > 0) {
154
- const populatedEntity = await this.entityManager.findOne(metadata.target, {
155
- where: { id: databaseEntity.id },
156
- relations: relationFields.map(field => field.name)
157
- });
158
- if (populatedEntity) {
159
- databaseEntity = populatedEntity;
160
- }
156
+ const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));
157
+ const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');
158
+ const allRelationFields = auditFields.filter(field => field.type === 'relation');
159
+ let potentialNonRelationFields = [];
160
+ if (updatedColumns.length > 0) {
161
+ potentialNonRelationFields = allNonRelationFields.filter(field => updatedFieldNames.has(field.name));
161
162
  }
162
- const changedFields = auditFields.filter(field => {
163
+ else {
164
+ potentialNonRelationFields = allNonRelationFields;
165
+ }
166
+ const potentialRelationFields = allRelationFields;
167
+ const changedNonRelationFields = potentialNonRelationFields.filter(field => {
163
168
  const newValue = entity[field.name];
164
169
  const oldValue = databaseEntity[field.name];
165
170
  return this.hasValueChanged(newValue, oldValue);
166
171
  });
167
- if (changedFields.length === 0) {
172
+ const changedRelationFields = [];
173
+ if (potentialRelationFields.length > 0) {
174
+ const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);
175
+ for (const field of potentialRelationFields) {
176
+ const newValue = entity[field.name];
177
+ const oldValue = populatedOldEntity[field.name];
178
+ if (this.hasRelationValueChanged(field, newValue, oldValue)) {
179
+ changedRelationFields.push({
180
+ field,
181
+ newValue,
182
+ oldValue
183
+ });
184
+ }
185
+ }
186
+ }
187
+ const allChangedFields = [
188
+ ...changedNonRelationFields.map(field => ({
189
+ field,
190
+ newValue: entity[field.name],
191
+ oldValue: databaseEntity[field.name]
192
+ })),
193
+ ...changedRelationFields
194
+ ];
195
+ if (allChangedFields.length === 0) {
168
196
  return;
169
197
  }
170
198
  const activeUser = this.requestContextService.getActiveUser();
@@ -182,21 +210,21 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
182
210
  chatterMessage.user = null;
183
211
  }
184
212
  const savedMessage = await this.repo.save(chatterMessage);
185
- for (const field of changedFields) {
213
+ for (const { field, newValue, oldValue } of allChangedFields) {
186
214
  const messageDetail = new chatter_message_details_entity_1.ChatterMessageDetails();
187
215
  messageDetail.chatterMessage = savedMessage;
188
216
  messageDetail.fieldName = field.name;
189
- messageDetail.oldValue = this.formatFieldValue(field, databaseEntity[field.name]);
190
- messageDetail.newValue = this.formatFieldValue(field, entity[field.name]);
191
- messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, databaseEntity[field.name]);
192
- messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, entity[field.name]);
217
+ messageDetail.oldValue = this.formatFieldValue(field, oldValue);
218
+ messageDetail.newValue = this.formatFieldValue(field, newValue);
219
+ messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, oldValue);
220
+ messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, newValue);
193
221
  await this.chatterMessageDetailsRepo.save(messageDetail);
194
222
  }
195
223
  }
196
224
  async postAuditMessageOnDelete(entity, metadata, databaseEntity, messageQueue = false) {
197
225
  const model = await this.modelMetadataRepo.findOne({
198
226
  where: {
199
- displayName: metadata.name
227
+ singularName: (0, string_helper_1.lowerFirst)(metadata.name)
200
228
  },
201
229
  relations: {
202
230
  fields: true,
@@ -257,22 +285,118 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
257
285
  return value.toString();
258
286
  }
259
287
  hasValueChanged(newValue, oldValue) {
260
- if ((newValue === null || newValue === undefined) &&
261
- (oldValue === null || oldValue === undefined)) {
288
+ if (newValue === oldValue) {
262
289
  return false;
263
290
  }
264
- if (newValue === oldValue) {
291
+ if (newValue === null && oldValue === null) {
265
292
  return false;
266
293
  }
267
- if (Array.isArray(newValue) && Array.isArray(oldValue)) {
268
- return JSON.stringify(newValue) !== JSON.stringify(oldValue);
294
+ if (newValue === undefined && oldValue === undefined) {
295
+ return false;
296
+ }
297
+ if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {
298
+ if (newValue.id !== undefined && oldValue.id !== undefined) {
299
+ return newValue.id !== oldValue.id;
300
+ }
301
+ if (Array.isArray(newValue) && Array.isArray(oldValue)) {
302
+ if (newValue.length !== oldValue.length) {
303
+ return true;
304
+ }
305
+ const newIds = newValue.map(item => item.id || item).sort();
306
+ const oldIds = oldValue.map(item => item.id || item).sort();
307
+ return JSON.stringify(newIds) !== JSON.stringify(oldIds);
308
+ }
269
309
  }
270
- if (typeof newValue === 'object' && newValue !== null &&
271
- typeof oldValue === 'object' && oldValue !== null) {
310
+ if (Array.isArray(newValue) && Array.isArray(oldValue)) {
272
311
  return JSON.stringify(newValue) !== JSON.stringify(oldValue);
273
312
  }
274
313
  return true;
275
314
  }
315
+ hasRelationValueChanged(field, newValue, oldValue) {
316
+ if (newValue === oldValue) {
317
+ return false;
318
+ }
319
+ if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {
320
+ return false;
321
+ }
322
+ if (field.relationType === 'many-to-one') {
323
+ const newId = this.extractRelationId(newValue);
324
+ const oldId = this.extractRelationId(oldValue);
325
+ return newId !== oldId;
326
+ }
327
+ if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {
328
+ const newIds = this.extractRelationIds(newValue);
329
+ const oldIds = this.extractRelationIds(oldValue);
330
+ if (newIds.length !== oldIds.length) {
331
+ return true;
332
+ }
333
+ newIds.sort();
334
+ oldIds.sort();
335
+ return JSON.stringify(newIds) !== JSON.stringify(oldIds);
336
+ }
337
+ return this.hasValueChanged(newValue, oldValue);
338
+ }
339
+ extractRelationId(value) {
340
+ if (value === null || value === undefined) {
341
+ return null;
342
+ }
343
+ if (typeof value === 'string' || typeof value === 'number') {
344
+ return value;
345
+ }
346
+ if (typeof value === 'object' && value.id !== undefined) {
347
+ return value.id;
348
+ }
349
+ return null;
350
+ }
351
+ extractRelationIds(value) {
352
+ if (!Array.isArray(value)) {
353
+ const id = this.extractRelationId(value);
354
+ return id !== null ? [id] : [];
355
+ }
356
+ return value.map(item => this.extractRelationId(item)).filter(id => id !== null);
357
+ }
358
+ async populateRelationFields(databaseEntity, relationFields, metadata) {
359
+ const populatedEntity = { ...databaseEntity };
360
+ for (const field of relationFields) {
361
+ const relationValue = databaseEntity[field.name];
362
+ if (relationValue === null || relationValue === undefined) {
363
+ populatedEntity[field.name] = relationValue;
364
+ continue;
365
+ }
366
+ const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);
367
+ if (!relationMetadata) {
368
+ populatedEntity[field.name] = relationValue;
369
+ continue;
370
+ }
371
+ const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;
372
+ if (field.relationType === 'many-to-one') {
373
+ const relationId = this.extractRelationId(relationValue);
374
+ if (relationId) {
375
+ const relatedEntity = await this.entityManager.findOne(targetEntity, {
376
+ where: { id: relationId }
377
+ });
378
+ populatedEntity[field.name] = relatedEntity;
379
+ }
380
+ else {
381
+ populatedEntity[field.name] = relationValue;
382
+ }
383
+ }
384
+ else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {
385
+ const relationIds = this.extractRelationIds(relationValue);
386
+ if (relationIds.length > 0) {
387
+ const relatedEntities = await this.entityManager.findByIds(targetEntity, relationIds);
388
+ populatedEntity[field.name] = relatedEntities;
389
+ }
390
+ else {
391
+ populatedEntity[field.name] = relationValue;
392
+ }
393
+ }
394
+ else {
395
+ populatedEntity[field.name] = relationValue;
396
+ }
397
+ }
398
+ return populatedEntity;
399
+ }
276
400
  };
277
401
  exports.ChatterMessageService = ChatterMessageService;
278
402
  exports.ChatterMessageService = ChatterMessageService = __decorate([
@@ -291,6 +415,7 @@ exports.ChatterMessageService = ChatterMessageService = __decorate([
291
415
  typeorm_2.Repository,
292
416
  core_1.ModuleRef,
293
417
  typeorm_2.Repository,
294
- request_context_service_1.RequestContextService])
418
+ request_context_service_1.RequestContextService,
419
+ model_metadata_helper_service_1.ModelMetadataHelperService])
295
420
  ], ChatterMessageService);
296
421
  //# sourceMappingURL=chatter-message.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository, EntityMetadata } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RequestContextService } from './request-context.service';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage>{\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n @InjectRepository(ChatterMessageDetails, 'default')\n readonly chatterMessageDetailsRepo: Repository<ChatterMessageDetails>,\n readonly moduleRef: ModuleRef,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n readonly requestContextService: RequestContextService\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService,entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'custom';\n chatterMessage.messageSubType = postDto.messageSubType || 'post_message';\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n \n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, metadata: EntityMetadata, messageQueue: boolean = false) {\n if(!entity){\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n displayName: metadata.name\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field => \n field.enableAuditTracking && \n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'insert';\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `New ${model.displayName} created`;\n \n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n}\n\nasync postAuditMessageOnUpdate(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n if(!databaseEntity || !entity){\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n displayName: metadata.name\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field => \n field.enableAuditTracking && \n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const relationFields = auditFields.filter(field => \n field.type === 'relation'\n );\n if (relationFields.length > 0) {\n const populatedEntity = await this.entityManager.findOne(metadata.target, {\n where: { id: databaseEntity.id },\n relations: relationFields.map(field => field.name)\n });\n if (populatedEntity) {\n databaseEntity = populatedEntity;\n }\n }\n const changedFields = auditFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n \n if (changedFields.length === 0) {\n return;\n }\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'update';\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `${model.displayName} updated`;\n \n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of changedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.oldValue = this.formatFieldValue(field, databaseEntity[field.name]);\n messageDetail.newValue = this.formatFieldValue(field, entity[field.name]);\n messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, databaseEntity[field.name]);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, entity[field.name]);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n}\n\nasync postAuditMessageOnDelete(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n displayName: metadata.name\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'delete';\n chatterMessage.coModelEntityId = databaseEntity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `${model.displayName} deleted`;\n \n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n await this.repo.save(chatterMessage);\n}\n\nprivate formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'manyToMany') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n\n return value.toString();\n}\n\nprivate formatFieldValueDisplay(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.name;\n }\n if (field.relationType === 'many-toMany') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n\n return value.toString();\n}\n\nprivate hasValueChanged(newValue: any, oldValue: any): boolean {\n if (\n (newValue === null || newValue === undefined) &&\n (oldValue === null || oldValue === undefined)\n ) {\n return false;\n }\n\n if (newValue === oldValue) {\n return false;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n if (\n typeof newValue === 'object' && newValue !== null &&\n typeof oldValue === 'object' && oldValue !== null\n ) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n}\n}\n"]}
1
+ {"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository, EntityMetadata } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RequestContextService } from './request-context.service';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage>{\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n @InjectRepository(ChatterMessageDetails, 'default')\n readonly chatterMessageDetailsRepo: Repository<ChatterMessageDetails>,\n readonly moduleRef: ModuleRef,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService,entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'custom';\n chatterMessage.messageSubType = postDto.messageSubType || 'post_message';\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n \n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, metadata: EntityMetadata, messageQueue: boolean = false) {\n if(!entity){\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field => \n field.enableAuditTracking && \n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'insert';\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `New ${model.displayName} created`;\n \n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n}\n\nasync postAuditMessageOnUpdate(entity: any, metadata: EntityMetadata, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {\n if(!databaseEntity || !entity){\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n \n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field => \n field.enableAuditTracking && \n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n \n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n \n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field => \n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n \n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n \n if (allChangedFields.length === 0) {\n return;\n }\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'update';\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `${model.displayName} updated`;\n \n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n}\n\nasync postAuditMessageOnDelete(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'delete';\n chatterMessage.coModelEntityId = databaseEntity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `${model.displayName} deleted`;\n \n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n await this.repo.save(chatterMessage);\n}\n\nprivate formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'manyToMany') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n\n return value.toString();\n}\n\nprivate formatFieldValueDisplay(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.name;\n }\n if (field.relationType === 'many-toMany') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n\n return value.toString();\n}\n\nprivate hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n \n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n}\n\nprivate hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n \n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n \n if (newIds.length !== oldIds.length) {\n return true;\n }\n \n newIds.sort();\n oldIds.sort();\n \n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n}\n\nprivate extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n \n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n \n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n \n return null;\n}\n\nprivate extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n \n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n}\n\nprivate async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n \n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n \n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n \n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue; \n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue; \n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n \n return populatedEntity;\n}\n}\n"]}
@@ -1,17 +1,21 @@
1
- import { SelectQueryBuilder } from "typeorm";
1
+ import { SelectQueryBuilder, WhereExpressionBuilder } from "typeorm";
2
2
  import { BasicFilterDto } from "../dtos/basic-filters.dto";
3
3
  import { ActiveUserData } from "src/interfaces/active-user-data.interface";
4
+ export declare enum FilterCombinator {
5
+ AND = "$and",
6
+ OR = "$or"
7
+ }
4
8
  export declare class CrudHelperService {
5
9
  constructor();
6
10
  private readonly logger;
7
11
  private orderOptions;
8
- private applyFilters;
12
+ applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string, selectQb: SelectQueryBuilder<any>): void;
9
13
  private buildOperatorQuery;
10
14
  private normalizeObjectKeys;
11
15
  normalize(value: string | string[]): string[];
12
16
  private isRelationJoined;
13
17
  private hasJoins;
14
- buildFilterQuery(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean, moduleRef?: any): SelectQueryBuilder<any>;
18
+ buildFilterQuery(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean, moduleRef?: any, filterCombinator?: FilterCombinator): SelectQueryBuilder<any>;
15
19
  additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia: string[]): string[];
16
20
  private buildPopulateQuery;
17
21
  private buildJoinQueryForRelation;
@@ -1 +1 @@
1
- {"version":3,"file":"crud-helper.service.d.ts","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,kBAAkB,EAA0B,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAM3E,qBAAa,iBAAiB;;IAG1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;IAuCpB,OAAO,CAAC,kBAAkB;IAwE1B,OAAO,CAAC,mBAAmB;IAU3B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;IAK7C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,QAAQ;IAIhB,gBAAgB,CAAC,EAAE,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,OAAO,EAAC,SAAS,CAAC,EAAC,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC;IAiG1M,6CAA6C,CAAC,uBAAuB,EAAE,MAAM,EAAE;IAW/E,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,yBAAyB;IAqBjC,OAAO,CAAC,kBAAkB;IAS1B,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxD,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvE,wBAAwB,CAAC,EAAE,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC;IAazG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAO/C,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;;;;IAO5D,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM;;;IAenC,mBAAmB,CAAC,EAAE,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM;IA0B1G,wBAAwB,eAAgB,cAAc,aAAa,MAAM,aAIxE;IAED,yBAAyB,eAAgB,cAAc,aAAa,MAAM,aAIzE;IAED,0BAA0B,eAAgB,cAAc,aAAa,MAAM,aAI1E;IAED,0BAA0B,eAAgB,cAAc,aAAa,MAAM,aAI1E;IACD,0BAA0B,eAAgB,cAAc,aAAa,MAAM,aAI1E;IACD,2BAA2B,eAAgB,cAAc,aAAa,MAAM,aAI3E;CAIJ"}
1
+ {"version":3,"file":"crud-helper.service.d.ts","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAK3E,oBAAY,gBAAgB;IACxB,GAAG,SAAS;IACZ,EAAE,QAAQ;CACb;AAED,qBAAa,iBAAiB;;IAG1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D,OAAO,CAAC,YAAY;IAYpB,YAAY,CAAC,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAiB,EAAE,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC;IAuClH,OAAO,CAAC,kBAAkB;IAwE1B,OAAO,CAAC,mBAAmB;IAU3B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;IAK7C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,QAAQ;IAIhB,gBAAgB,CACZ,EAAE,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAC3B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,EACnB,oBAAoB,CAAC,EAAE,OAAO,EAC9B,oBAAoB,CAAC,EAAE,OAAO,EAC9B,SAAS,CAAC,EAAE,GAAG,EACf,gBAAgB,GAAE,gBAAuC,GAC1D,kBAAkB,CAAC,GAAG,CAAC;IAuG1B,6CAA6C,CAAC,uBAAuB,EAAE,MAAM,EAAE;IAW/E,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,yBAAyB;IAqBjC,OAAO,CAAC,kBAAkB;IAS1B,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxD,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvE,wBAAwB,CAAC,EAAE,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC;IAazG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAO/C,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;;;;IAO5D,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM;;;IAenC,mBAAmB,CAAC,EAAE,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM;IA0B1G,wBAAwB,eAAgB,cAAc,aAAa,MAAM,aAIxE;IAED,yBAAyB,eAAgB,cAAc,aAAa,MAAM,aAIzE;IAED,0BAA0B,eAAgB,cAAc,aAAa,MAAM,aAI1E;IAED,0BAA0B,eAAgB,cAAc,aAAa,MAAM,aAI1E;IACD,0BAA0B,eAAgB,cAAc,aAAa,MAAM,aAI1E;IACD,2BAA2B,eAAgB,cAAc,aAAa,MAAM,aAI3E;CAIJ"}
@@ -1,11 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CrudHelperService = void 0;
3
+ exports.CrudHelperService = exports.FilterCombinator = void 0;
4
4
  const typeorm_1 = require("typeorm");
5
5
  const strings_1 = require("@angular-devkit/core/src/utils/strings");
6
6
  const solid_registry_1 = require("../helpers/solid-registry");
7
7
  const common_1 = require("@nestjs/common");
8
8
  const error_messages_1 = require("../constants/error-messages");
9
+ var FilterCombinator;
10
+ (function (FilterCombinator) {
11
+ FilterCombinator["AND"] = "$and";
12
+ FilterCombinator["OR"] = "$or";
13
+ })(FilterCombinator || (exports.FilterCombinator = FilterCombinator = {}));
9
14
  class CrudHelperService {
10
15
  constructor() {
11
16
  this.logger = new common_1.Logger(CrudHelperService.name);
@@ -174,7 +179,7 @@ class CrudHelperService {
174
179
  hasJoins(queryBuilder) {
175
180
  return queryBuilder.expressionMap.joinAttributes.length > 0;
176
181
  }
177
- buildFilterQuery(qb, basicFilterDto, entityAlias, internationalisation, draftPublishWorkflow, moduleRef) {
182
+ buildFilterQuery(qb, basicFilterDto, entityAlias, internationalisation, draftPublishWorkflow, moduleRef, filterCombinator = FilterCombinator.AND) {
178
183
  let { limit, offset, showSoftDeleted, filters } = basicFilterDto;
179
184
  const { fields, sort, groupBy, populate = [], populateMedia = [], locale, status } = basicFilterDto;
180
185
  const normalizedFields = this.normalize(fields);
@@ -191,9 +196,16 @@ class CrudHelperService {
191
196
  this.buildPopulateQuery(normalizedPopulate, entityAlias, qb);
192
197
  }
193
198
  if (filters) {
194
- qb.andWhere(new typeorm_1.Brackets(whereQb => {
195
- this.applyFilters(whereQb, filters, entityAlias, qb);
196
- }));
199
+ if (filterCombinator === FilterCombinator.AND) {
200
+ qb.andWhere(new typeorm_1.Brackets(whereQb => {
201
+ this.applyFilters(whereQb, filters, entityAlias, qb);
202
+ }));
203
+ }
204
+ else if (filterCombinator === FilterCombinator.OR) {
205
+ qb.orWhere(new typeorm_1.Brackets(whereQb => {
206
+ this.applyFilters(whereQb, filters, entityAlias, qb);
207
+ }));
208
+ }
197
209
  }
198
210
  let finalLocale = locale;
199
211
  if (internationalisation) {