@solidxai/core 0.1.13-beta.9 → 0.1.13

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 (255) hide show
  1. package/CHANGELOG.md +7465 -0
  2. package/README.md +19 -0
  3. package/dist/commands/run-tests.command.d.ts +2 -0
  4. package/dist/commands/run-tests.command.d.ts.map +1 -1
  5. package/dist/commands/run-tests.command.js +20 -3
  6. package/dist/commands/run-tests.command.js.map +1 -1
  7. package/dist/config/cache.options.d.ts.map +1 -1
  8. package/dist/config/cache.options.js +2 -2
  9. package/dist/config/cache.options.js.map +1 -1
  10. package/dist/constants/error-messages.d.ts +7 -0
  11. package/dist/constants/error-messages.d.ts.map +1 -1
  12. package/dist/constants/error-messages.js +7 -0
  13. package/dist/constants/error-messages.js.map +1 -1
  14. package/dist/constants/media-file-types.d.ts +3 -0
  15. package/dist/constants/media-file-types.d.ts.map +1 -1
  16. package/dist/constants/media-file-types.js +47 -8
  17. package/dist/constants/media-file-types.js.map +1 -1
  18. package/dist/constants/success-messages.d.ts +3 -0
  19. package/dist/constants/success-messages.d.ts.map +1 -1
  20. package/dist/constants/success-messages.js +3 -0
  21. package/dist/constants/success-messages.js.map +1 -1
  22. package/dist/controllers/authentication.controller.d.ts +1 -1
  23. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  24. package/dist/controllers/authentication.controller.js +4 -3
  25. package/dist/controllers/authentication.controller.js.map +1 -1
  26. package/dist/controllers/field-metadata.controller.d.ts +2 -2
  27. package/dist/controllers/mpin-authentication.controller.d.ts +44 -0
  28. package/dist/controllers/mpin-authentication.controller.d.ts.map +1 -0
  29. package/dist/controllers/mpin-authentication.controller.js +102 -0
  30. package/dist/controllers/mpin-authentication.controller.js.map +1 -0
  31. package/dist/dtos/change-mpin.dto.d.ts +6 -0
  32. package/dist/dtos/change-mpin.dto.d.ts.map +1 -0
  33. package/dist/dtos/change-mpin.dto.js +39 -0
  34. package/dist/dtos/change-mpin.dto.js.map +1 -0
  35. package/dist/dtos/create-field-metadata.dto.d.ts +3 -6
  36. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  37. package/dist/dtos/create-field-metadata.dto.js +15 -10
  38. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  39. package/dist/dtos/create-model-sequence.dto.d.ts +1 -1
  40. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -1
  41. package/dist/dtos/create-model-sequence.dto.js +1 -1
  42. package/dist/dtos/create-model-sequence.dto.js.map +1 -1
  43. package/dist/dtos/mpin-login.dto.d.ts +5 -0
  44. package/dist/dtos/mpin-login.dto.d.ts.map +1 -0
  45. package/dist/dtos/mpin-login.dto.js +33 -0
  46. package/dist/dtos/mpin-login.dto.js.map +1 -0
  47. package/dist/dtos/setup-mpin.dto.d.ts +7 -0
  48. package/dist/dtos/setup-mpin.dto.d.ts.map +1 -0
  49. package/dist/dtos/setup-mpin.dto.js +47 -0
  50. package/dist/dtos/setup-mpin.dto.js.map +1 -0
  51. package/dist/entities/dashboard-user-layout.entity.js +2 -2
  52. package/dist/entities/dashboard-user-layout.entity.js.map +1 -1
  53. package/dist/entities/field-metadata.entity.d.ts +1 -0
  54. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  55. package/dist/entities/field-metadata.entity.js +5 -1
  56. package/dist/entities/field-metadata.entity.js.map +1 -1
  57. package/dist/entities/user-device-credential.entity.d.ts +18 -0
  58. package/dist/entities/user-device-credential.entity.d.ts.map +1 -0
  59. package/dist/entities/user-device-credential.entity.js +91 -0
  60. package/dist/entities/user-device-credential.entity.js.map +1 -0
  61. package/dist/entities/user.entity.js +2 -2
  62. package/dist/entities/user.entity.js.map +1 -1
  63. package/dist/entities/view-metadata.entity.js.map +1 -1
  64. package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -1
  65. package/dist/entities/workflow-execution-artifact.entity.js +4 -3
  66. package/dist/entities/workflow-execution-artifact.entity.js.map +1 -1
  67. package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -1
  68. package/dist/entities/workflow-execution-log.entity.js +4 -3
  69. package/dist/entities/workflow-execution-log.entity.js.map +1 -1
  70. package/dist/entities/workflow-execution.entity.d.ts.map +1 -1
  71. package/dist/entities/workflow-execution.entity.js +3 -2
  72. package/dist/entities/workflow-execution.entity.js.map +1 -1
  73. package/dist/entities/workflow-secret.entity.d.ts.map +1 -1
  74. package/dist/entities/workflow-secret.entity.js +3 -2
  75. package/dist/entities/workflow-secret.entity.js.map +1 -1
  76. package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -1
  77. package/dist/entities/workflow-step-execution.entity.js +3 -2
  78. package/dist/entities/workflow-step-execution.entity.js.map +1 -1
  79. package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -1
  80. package/dist/entities/workflow-trigger-execution.entity.js +6 -5
  81. package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
  82. package/dist/filters/http-exception.filter.d.ts.map +1 -1
  83. package/dist/filters/http-exception.filter.js +5 -1
  84. package/dist/filters/http-exception.filter.js.map +1 -1
  85. package/dist/helpers/bootstrap.helper.d.ts +5 -2
  86. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  87. package/dist/helpers/bootstrap.helper.js +7 -3
  88. package/dist/helpers/bootstrap.helper.js.map +1 -1
  89. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +6 -0
  90. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  91. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +54 -27
  92. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  93. package/dist/helpers/file-download.helper.d.ts.map +1 -1
  94. package/dist/helpers/file-download.helper.js +6 -1
  95. package/dist/helpers/file-download.helper.js.map +1 -1
  96. package/dist/helpers/security.helper.d.ts +5 -1
  97. package/dist/helpers/security.helper.d.ts.map +1 -1
  98. package/dist/helpers/security.helper.js +15 -4
  99. package/dist/helpers/security.helper.js.map +1 -1
  100. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
  101. package/dist/helpers/solid-core-error-codes-provider.service.js +45 -0
  102. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
  103. package/dist/helpers/solid-microservice-adapter.service.d.ts.map +1 -1
  104. package/dist/helpers/solid-microservice-adapter.service.js +1 -1
  105. package/dist/helpers/solid-microservice-adapter.service.js.map +1 -1
  106. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  107. package/dist/helpers/typeorm-db-helper.js +9 -0
  108. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  109. package/dist/index.d.ts +6 -0
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +6 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/interfaces/active-user-data.interface.d.ts +1 -0
  114. package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
  115. package/dist/interfaces/active-user-data.interface.js.map +1 -1
  116. package/dist/repository/user-device-credential.repository.d.ts +12 -0
  117. package/dist/repository/user-device-credential.repository.d.ts.map +1 -0
  118. package/dist/repository/user-device-credential.repository.js +34 -0
  119. package/dist/repository/user-device-credential.repository.js.map +1 -0
  120. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  121. package/dist/seeders/module-metadata-seeder.service.js +7 -3
  122. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  123. package/dist/seeders/seed-data/solid-core-metadata.json +168 -2
  124. package/dist/services/api-key.service.d.ts.map +1 -1
  125. package/dist/services/api-key.service.js +1 -1
  126. package/dist/services/api-key.service.js.map +1 -1
  127. package/dist/services/authentication.service.d.ts +5 -4
  128. package/dist/services/authentication.service.d.ts.map +1 -1
  129. package/dist/services/authentication.service.js +50 -19
  130. package/dist/services/authentication.service.js.map +1 -1
  131. package/dist/services/chatter-message.service.d.ts +5 -1
  132. package/dist/services/chatter-message.service.d.ts.map +1 -1
  133. package/dist/services/chatter-message.service.js +48 -13
  134. package/dist/services/chatter-message.service.js.map +1 -1
  135. package/dist/services/crud-helper.service.d.ts +1 -2
  136. package/dist/services/crud-helper.service.d.ts.map +1 -1
  137. package/dist/services/crud-helper.service.js +2 -16
  138. package/dist/services/crud-helper.service.js.map +1 -1
  139. package/dist/services/crud.service.d.ts.map +1 -1
  140. package/dist/services/crud.service.js +2 -1
  141. package/dist/services/crud.service.js.map +1 -1
  142. package/dist/services/draft-publish-helper.service.d.ts +1 -0
  143. package/dist/services/draft-publish-helper.service.d.ts.map +1 -1
  144. package/dist/services/draft-publish-helper.service.js +38 -4
  145. package/dist/services/draft-publish-helper.service.js.map +1 -1
  146. package/dist/services/field-metadata.service.d.ts +2 -2
  147. package/dist/services/field-metadata.service.d.ts.map +1 -1
  148. package/dist/services/field-metadata.service.js +4 -1
  149. package/dist/services/field-metadata.service.js.map +1 -1
  150. package/dist/services/media-storage.utils.d.ts +1 -0
  151. package/dist/services/media-storage.utils.d.ts.map +1 -1
  152. package/dist/services/media-storage.utils.js +12 -1
  153. package/dist/services/media-storage.utils.js.map +1 -1
  154. package/dist/services/media.service.d.ts.map +1 -1
  155. package/dist/services/media.service.js +1 -0
  156. package/dist/services/media.service.js.map +1 -1
  157. package/dist/services/module-metadata.service.d.ts.map +1 -1
  158. package/dist/services/module-metadata.service.js +9 -1
  159. package/dist/services/module-metadata.service.js.map +1 -1
  160. package/dist/services/mpin.service.d.ts +67 -0
  161. package/dist/services/mpin.service.d.ts.map +1 -0
  162. package/dist/services/mpin.service.js +282 -0
  163. package/dist/services/mpin.service.js.map +1 -0
  164. package/dist/services/refresh-token-ids-storage.service.d.ts +25 -6
  165. package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
  166. package/dist/services/refresh-token-ids-storage.service.js +80 -42
  167. package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
  168. package/dist/services/setting.service.d.ts.map +1 -1
  169. package/dist/services/setting.service.js +6 -1
  170. package/dist/services/setting.service.js.map +1 -1
  171. package/dist/services/settings/default-settings-provider.service.d.ts +202 -6
  172. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  173. package/dist/services/settings/default-settings-provider.service.js +114 -3
  174. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  175. package/dist/solid-core.module.d.ts +1 -3
  176. package/dist/solid-core.module.d.ts.map +1 -1
  177. package/dist/solid-core.module.js +14 -39
  178. package/dist/solid-core.module.js.map +1 -1
  179. package/dist/testing/reporter/console-reporter.d.ts +3 -0
  180. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  181. package/dist/testing/reporter/console-reporter.js +2 -0
  182. package/dist/testing/reporter/console-reporter.js.map +1 -1
  183. package/dist/testing/reporter/progress-reporter.d.ts +64 -0
  184. package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
  185. package/dist/testing/reporter/progress-reporter.js +224 -0
  186. package/dist/testing/reporter/progress-reporter.js.map +1 -0
  187. package/dist/testing/reporter/reporter.types.d.ts +3 -0
  188. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  189. package/dist/testing/reporter/reporter.types.js.map +1 -1
  190. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  191. package/dist/testing/runner/run-from-metadata.js +1 -0
  192. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  193. package/dist/theme/theme-registry.d.ts +14 -0
  194. package/dist/theme/theme-registry.d.ts.map +1 -0
  195. package/dist/theme/theme-registry.js +147 -0
  196. package/dist/theme/theme-registry.js.map +1 -0
  197. package/package.json +2 -2
  198. package/src/commands/run-tests.command.ts +17 -3
  199. package/src/config/cache.options.ts +9 -1
  200. package/src/constants/error-messages.ts +14 -0
  201. package/src/constants/media-file-types.ts +87 -9
  202. package/src/constants/success-messages.ts +5 -0
  203. package/src/controllers/authentication.controller.ts +5 -2
  204. package/src/controllers/mpin-authentication.controller.ts +67 -0
  205. package/src/dtos/change-mpin.dto.ts +18 -0
  206. package/src/dtos/create-field-metadata.dto.ts +17 -9
  207. package/src/dtos/create-model-sequence.dto.ts +1 -1
  208. package/src/dtos/mpin-login.dto.ts +24 -0
  209. package/src/dtos/setup-mpin.dto.ts +51 -0
  210. package/src/entities/dashboard-user-layout.entity.ts +2 -2
  211. package/src/entities/field-metadata.entity.ts +3 -0
  212. package/src/entities/user-device-credential.entity.ts +130 -0
  213. package/src/entities/user.entity.ts +2 -2
  214. package/src/entities/view-metadata.entity.ts +2 -2
  215. package/src/entities/workflow-execution-artifact.entity.ts +4 -3
  216. package/src/entities/workflow-execution-log.entity.ts +4 -3
  217. package/src/entities/workflow-execution.entity.ts +3 -2
  218. package/src/entities/workflow-secret.entity.ts +3 -2
  219. package/src/entities/workflow-step-execution.entity.ts +3 -2
  220. package/src/entities/workflow-trigger-execution.entity.ts +6 -5
  221. package/src/filters/http-exception.filter.ts +11 -1
  222. package/src/helpers/bootstrap.helper.ts +43 -6
  223. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +73 -34
  224. package/src/helpers/file-download.helper.ts +15 -1
  225. package/src/helpers/security.helper.ts +35 -8
  226. package/src/helpers/solid-core-error-codes-provider.service.ts +53 -0
  227. package/src/helpers/solid-microservice-adapter.service.ts +6 -1
  228. package/src/helpers/typeorm-db-helper.ts +12 -1
  229. package/src/index.ts +6 -0
  230. package/src/interfaces/active-user-data.interface.ts +9 -0
  231. package/src/repository/user-device-credential.repository.ts +17 -0
  232. package/src/seeders/module-metadata-seeder.service.ts +11 -3
  233. package/src/seeders/seed-data/solid-core-metadata.json +168 -2
  234. package/src/services/api-key.service.ts +13 -1
  235. package/src/services/authentication.service.ts +127 -36
  236. package/src/services/chatter-message.service.ts +78 -15
  237. package/src/services/crud-helper.service.ts +19 -16
  238. package/src/services/crud.service.ts +3 -1
  239. package/src/services/draft-publish-helper.service.ts +56 -4
  240. package/src/services/field-metadata.service.ts +5 -2
  241. package/src/services/media-storage.utils.ts +26 -1
  242. package/src/services/media.service.ts +1 -0
  243. package/src/services/module-metadata.service.ts +10 -1
  244. package/src/services/mpin.service.ts +447 -0
  245. package/src/services/refresh-token-ids-storage.service.ts +229 -90
  246. package/src/services/setting.service.ts +8 -1
  247. package/src/services/settings/default-settings-provider.service.ts +119 -3
  248. package/src/solid-core.module.ts +26 -12
  249. package/src/testing/README.md +2 -1
  250. package/src/testing/reporter/console-reporter.ts +4 -0
  251. package/src/testing/reporter/progress-reporter.ts +251 -0
  252. package/src/testing/reporter/reporter.types.ts +3 -0
  253. package/src/testing/runner/run-from-metadata.ts +1 -0
  254. package/src/theme/theme-registry.ts +181 -0
  255. package/CLAUDE.md +0 -26
@@ -1 +1 @@
1
- {"version":3,"file":"crud-helper.service.d.ts","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crud-helper.service.d.ts","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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"}
@@ -728,20 +728,6 @@ let CrudHelperService = CrudHelperService_1 = class CrudHelperService {
728
728
  ...groupAggregateValues
729
729
  };
730
730
  }
731
- async countGroupedRecords(qb, basicFilterDto, entityAlias) {
732
- const { limit, offset, ...rest } = basicFilterDto;
733
- const filteredDto = { ...rest, limit: undefined, offset: undefined };
734
- const filteredQB = this.buildFilterQuery(qb, filteredDto, entityAlias, undefined, undefined, undefined, FilterCombinator.AND, false, false);
735
- const groupByFields = this.normalize(filteredDto.groupBy);
736
- if (!groupByFields || groupByFields.length === 0) {
737
- throw new Error(error_messages_1.ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
738
- }
739
- this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);
740
- this.applyAggregates(filteredQB, ['count'], entityAlias);
741
- filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);
742
- const rawResults = await filteredQB.getRawMany();
743
- return rawResults.length;
744
- }
745
731
  pagedResponse(offset, limit, count, entities) {
746
732
  const safeLimit = limit ?? count ?? 0;
747
733
  const safeOffset = offset ?? 0;
@@ -761,7 +747,7 @@ let CrudHelperService = CrudHelperService_1 = class CrudHelperService {
761
747
  records: entities,
762
748
  };
763
749
  }
764
- async executeGroupPipeline(filterQb, basicFilterDto, alias, createQbFn, postProcessEntities) {
750
+ async executeGroupPipeline(filterQb, basicFilterDto, alias, createQbFn, postProcessEntities, internationalisation, draftPublishWorkflow, moduleRef) {
765
751
  const groupByFields = this.normalize(basicFilterDto.groupBy);
766
752
  if (!groupByFields.length)
767
753
  throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
@@ -790,7 +776,7 @@ let CrudHelperService = CrudHelperService_1 = class CrudHelperService {
790
776
  aggregates: undefined,
791
777
  sort: basicFilterDto.groupFilter?.sort,
792
778
  };
793
- groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias);
779
+ groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias, internationalisation, draftPublishWorkflow, moduleRef);
794
780
  groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
795
781
  const [entities, count] = await groupQb.getManyAndCount();
796
782
  if (postProcessEntities)
@@ -1 +1 @@
1
- {"version":3,"file":"crud-helper.service.js","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets, EntityMetadata, SelectQueryBuilder, WhereExpressionBuilder } from \"typeorm\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { classify } from '../helpers/string.helper';\nimport { ActiveUserData } from \"src/interfaces/active-user-data.interface\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { BadRequestException, Injectable, Logger } from \"@nestjs/common\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { buildCastToText } from \"src/helpers/typeorm-db-helper\";\nimport { DraftPublishHelperService } from \"./draft-publish-helper.service\";\nimport { InternationalisationHelperService } from \"./internationalisation-helper.service\";\nimport { normalizeObjectKeys } from \"./object.utils\";\n\nexport enum FilterCombinator {\n AND = '$and',\n OR = '$or'\n}\n\nexport enum UserIdFields {\n CREATED_BY = 'createdBy',\n UPDATED_BY = 'updatedBy'\n}\n\n/** Aggregate functions permitted in the `fields` `fn(field)` syntax. */\nconst SUPPORTED_FIELD_FUNCTIONS = ['COUNT', 'SUM', 'AVG', 'MIN', 'MAX'];\n\n/** Date granularities permitted in `groupBy` (`field:granularity`) and filter func-aliases. */\nconst SUPPORTED_GRANULARITIES = ['day', 'week', 'month', 'year'];\n\n/**\n * Outcome of resolving a user-supplied dotted path against real entity metadata.\n * Every string here originates from TypeORM metadata, never from request input.\n */\nexport interface ResolvedFieldPath {\n /** Canonical relation property names for each hop traversed (excludes a column leaf). */\n relationSegments: string[];\n /** Canonical column property name, when the leaf is a column. */\n leafProperty?: string;\n /** True when the leaf itself is a relation (populate / nested-filter join). */\n leafIsRelation: boolean;\n}\n\n@Injectable()\nexport class CrudHelperService {\n private readonly logger = new Logger(CrudHelperService.name);\n\n constructor(\n private readonly draftPublishHelperService: DraftPublishHelperService,\n private readonly internationalisationHelperService: InternationalisationHelperService,\n ) { }\n\n /**\n * Resolve a user-supplied dotted path (e.g. \"customer.name\") against real TypeORM metadata.\n *\n * SECURITY — this is the choke point that makes the filtering vocabulary safe.\n * SQL can bind *values* as parameters but never *identifiers* (column names, aliases,\n * ORDER BY expressions), so a client-chosen field name must be allow-listed instead.\n * The caller's string is used ONLY as a lookup key; every value returned comes from\n * ColumnMetadata/RelationMetadata, so callers build SQL exclusively from strings this\n * codebase produced, never from request input.\n *\n * Throws BadRequestException on any segment that is not a real column/relation.\n */\n resolveFieldPathFromMetadata(\n rootMetadata: EntityMetadata,\n pathParts: string[],\n { allowRelationLeaf = false }: { allowRelationLeaf?: boolean } = {}\n ): ResolvedFieldPath {\n // Fail closed: without metadata we cannot prove the identifier is safe.\n if (!rootMetadata) throw new BadRequestException(`Cannot resolve field '${this.describeInvalidField(pathParts?.join('.'))}'`);\n if (!pathParts?.length || pathParts.some(part => !part)) {\n throw new BadRequestException(`Invalid field path '${this.describeInvalidField(pathParts?.join('.'))}'`);\n }\n\n let metadata = rootMetadata;\n const relationSegments: string[] = [];\n\n for (let i = 0; i < pathParts.length; i++) {\n const isLeaf = i === pathParts.length - 1;\n // `metadata` is the entity currently being walked; it advances one hop per segment.\n // These lookups key on propertyName/propertyPath (NOT database name), so they are\n // naming-strategy agnostic and resolve implicit relation FK columns correctly.\n const relation = metadata.findRelationWithPropertyPath(pathParts[i]);\n const column = metadata.findColumnWithPropertyName(pathParts[i]);\n\n if (!isLeaf) {\n // Interior segments must be relations so we can keep walking.\n if (!relation) {\n throw new BadRequestException(`Invalid relation '${this.describeInvalidField(pathParts[i])}' in '${this.describeInvalidField(pathParts.join('.'))}'`);\n }\n relationSegments.push(relation.propertyName); // canonical, from metadata\n // THE HOP: advance to the entity on the other side so the NEXT iteration validates\n // against that entity rather than the root. Consumed at the top of the next pass —\n // it only looks unused here because `continue` follows immediately.\n // e.g. \"shop.customer.mcc\": NbfTransaction -> CustomerLocation -> Customer.\n // Without this, \"customer\" would be checked on NbfTransaction (wrongly accepted)\n // and \"mcc\" on NbfTransaction (wrongly rejected).\n metadata = relation.inverseEntityMetadata;\n continue;\n }\n\n // Leaf ordering matters: a many-to-one name can match BOTH a relation and its FK column.\n // populate (allowRelationLeaf) must treat it as a relation so it can be joined;\n // sort/filter must treat it as a column so it compares on the FK, as today.\n if (allowRelationLeaf && relation) {\n relationSegments.push(relation.propertyName);\n return { relationSegments, leafIsRelation: true };\n }\n if (column) {\n return { relationSegments, leafProperty: column.propertyName, leafIsRelation: false };\n }\n throw new BadRequestException(`Invalid field '${this.describeInvalidField(pathParts[i])}' in '${this.describeInvalidField(pathParts.join('.'))}'`);\n }\n\n throw new BadRequestException(`Invalid field path '${this.describeInvalidField(pathParts.join('.'))}'`);\n }\n\n /**\n * Query-builder flavoured wrapper around {@link resolveFieldPathFromMetadata}.\n *\n * `startAlias` matters for nested filters: applyFilters recurses into joined relations\n * carrying that relation's alias, so the leaf must resolve against the joined entity\n * rather than always the root.\n */\n resolveFieldPath(\n qb: SelectQueryBuilder<any>,\n pathParts: string[],\n { allowRelationLeaf = false, startAlias }: { allowRelationLeaf?: boolean; startAlias?: string } = {}\n ): ResolvedFieldPath {\n const aliasMetadata = startAlias ? this.findAliasMetadata(qb, startAlias) : undefined;\n const rootMetadata = aliasMetadata ?? qb?.expressionMap?.mainAlias?.metadata;\n return this.resolveFieldPathFromMetadata(rootMetadata, pathParts, { allowRelationLeaf });\n }\n\n private findAliasMetadata(qb: SelectQueryBuilder<any>, alias: string): EntityMetadata | undefined {\n const found = qb?.expressionMap?.aliases?.find(a => a.name === alias);\n return found?.hasMetadata ? found.metadata : undefined;\n }\n\n /**\n * Echo a rejected identifier back in a bounded way.\n *\n * Naming the bad field is what makes a 400 actionable for a legitimate typo, but reflecting an\n * unbounded attacker-supplied string is needless: it hands an attacker a reliable echo channel\n * and bloats logs. 80 characters is ample for a real field name.\n */\n private describeInvalidField(value: string): string {\n const text = String(value ?? '');\n return text.length > 80 ? `${text.slice(0, 80)}...` : text;\n }\n\n private orderOptions(sort: any[] = []) {\n const orderOptions = {};\n sort.forEach((s: string) => {\n const parts = s.split(':');\n let order: string | undefined;\n let field: string;\n if (parts.length > 1) {\n order = parts.pop();\n field = parts.join(':');\n } else {\n field = parts[0];\n }\n const normalizedOrder = order ? order.toUpperCase() : 'ASC';\n if (!['ASC', 'DESC'].includes(normalizedOrder)) {\n throw new Error(`Invalid sort order provided: ${order}`);\n }\n orderOptions[field] = normalizedOrder;\n });\n return orderOptions;\n }\n\n applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {\n const normalizedFilters = normalizeObjectKeys(filters);\n if (normalizedFilters.$and) {\n normalizedFilters.$and.forEach((andFilter: any) => {\n qb.andWhere(\n new Brackets(subQb => {\n this.applyFilters(subQb, andFilter, alias, selectQb);\n })\n );\n });\n } else if (normalizedFilters.$or) {\n normalizedFilters.$or.forEach((orFilter: any) => {\n qb.orWhere(new Brackets(subQb => {\n this.applyFilters(subQb, orFilter, alias, selectQb);\n }));\n });\n } else {\n // For individual conditions\n Object.keys(normalizedFilters).forEach(key => {\n const primaryFilterObj = normalizedFilters[key];\n const normalizedPrimaryFilterObj = normalizeObjectKeys(primaryFilterObj);\n\n const [rawField, funcAlias] = key.split(':');\n\n // Get the operator or field from the key\n const operatorOrField = Object.keys(normalizedPrimaryFilterObj)[0];\n // if the key is an operator, then build the query based on the operator\n if (operatorOrField.startsWith('$')) {\n const operator = operatorOrField;\n // SECURITY: resolve against the CURRENT alias (this method recurses into joined\n // relations), so a nested filter key is checked on the joined entity rather than\n // the root. Resolution is driven off `selectQb` because `qb` is a\n // WhereExpressionBuilder and exposes no expressionMap.\n const { leafProperty } = this.resolveFieldPath(selectQb, [rawField], { startAlias: alias });\n let columnExpression: string | undefined;\n if (funcAlias) {\n try {\n columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${leafProperty}`, funcAlias);\n } catch (error) {\n // Surface the precise granularity message; keep the original fallback\n // for driver-level failures.\n if (error instanceof BadRequestException) throw error;\n throw new BadRequestException(`Unsupported field function '${this.describeInvalidField(funcAlias)}'. Supported functions are: ${SUPPORTED_GRANULARITIES.join(', ')}.`);\n }\n }\n this.buildOperatorQuery(qb, alias, leafProperty, normalizedPrimaryFilterObj, operator, columnExpression);\n return;\n }\n else { // Recursively call the applyFilters method to handle nested conditions\n if (funcAlias) {\n throw new BadRequestException(`Function alias ':${funcAlias}' is not valid on relation field '${rawField}'. It can only be applied to scalar fields.`);\n }\n // SECURITY: the nested key must be a real relation on the current entity.\n const resolvedRelation = this.resolveFieldPath(selectQb, [rawField], { allowRelationLeaf: true, startAlias: alias });\n if (!resolvedRelation.leafIsRelation) {\n throw new BadRequestException(`'${this.describeInvalidField(rawField)}' is not a relation and cannot contain nested filters.`);\n }\n const relationName = resolvedRelation.relationSegments[resolvedRelation.relationSegments.length - 1];\n const joinField = `${alias}.${relationName}`;\n if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, relationName);\n this.applyFilters(qb, primaryFilterObj, relationName, selectQb);\n }\n });\n }\n }\n\n private buildOperatorQuery(qb: any, alias: string, field: string, normalizedPrimaryOperatorObj: any, operator: string, columnExpression?: string) {\n const uniqueFieldAlias = `${alias}_${field}_${Math.floor(Math.random() * 1000)}`;\n const colExpr = columnExpression ?? `${alias}.${field}`;\n switch (operator) {\n case '$eq':\n qb.andWhere(`${colExpr} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });\n break;\n case '$eqi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: String(normalizedPrimaryOperatorObj.$eqi).toLowerCase() });\n break;\n }\n case '$ne':\n qb.andWhere(`${colExpr} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });\n break;\n case '$nei': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: String(normalizedPrimaryOperatorObj.$nei).toLowerCase() });\n break;\n }\n case '$gt':\n qb.andWhere(`${colExpr} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });\n break;\n case '$gte':\n qb.andWhere(`${colExpr} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });\n break;\n case '$lt':\n qb.andWhere(`${colExpr} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });\n break;\n case '$lte':\n qb.andWhere(`${colExpr} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });\n break;\n case '$in':\n qb.andWhere(`${colExpr} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });\n break;\n case '$notIn':\n qb.andWhere(`${colExpr} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });\n break;\n case '$contains':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });\n break;\n case '$notContains':\n qb.andWhere(`${colExpr} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });\n break;\n case '$containsi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${String(normalizedPrimaryOperatorObj.$containsi).toLowerCase()}%` });\n break;\n }\n case '$notContainsi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${String(normalizedPrimaryOperatorObj.$notContainsi).toLowerCase()}%` });\n break;\n }\n case '$null':\n qb.andWhere(`${colExpr} IS NULL`);\n break;\n case '$notNull':\n qb.andWhere(`${colExpr} IS NOT NULL`);\n break;\n case '$between':\n qb.andWhere(`${colExpr} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });\n break;\n case '$startsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });\n break;\n case '$startsWithi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${String(normalizedPrimaryOperatorObj.$startsWithi).toLowerCase()}%` });\n break;\n }\n case '$endsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });\n break;\n case '$endsWithi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${String(normalizedPrimaryOperatorObj.$endsWithi).toLowerCase()}` });\n break;\n }\n default:\n throw new Error(`Operator ${operator} is not supported`);\n }\n }\n\n normalize(value: string | string[]): string[] {\n if (!value) return []; // if the value is nullish, then return an empty array\n return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array\n }\n\n private normalizeAndFilterPopulateAttributes(value: string | string[]): string[] {\n // Normalize and remove the userId fields from the populate filter, since they are handled separately\n const normalized = this.normalize(value);\n return normalized.filter(item => item !== UserIdFields.CREATED_BY && item !== UserIdFields.UPDATED_BY);\n }\n\n extractUserIdFieldsFromPopulate(value: string | string[]): UserIdFields[] {\n const normalized = this.normalize(value);\n return normalized.filter(item => item === UserIdFields.CREATED_BY || item === UserIdFields.UPDATED_BY);\n }\n\n private isRelationJoined(queryBuilder: SelectQueryBuilder<any>, joinProperty: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.entityOrProperty === joinProperty);\n }\n\n private hasJoins(queryBuilder: SelectQueryBuilder<any>): boolean {\n return queryBuilder.expressionMap.joinAttributes.length > 0;\n }\n\n buildFilterQuery(\n qb: SelectQueryBuilder<any>,\n basicFilterDto: BasicFilterDto,\n entityAlias: string,\n internationalisation?: boolean,\n draftPublishWorkflow?: boolean,\n moduleRef?: any,\n filterCombinator: FilterCombinator = FilterCombinator.AND,\n applyPagination: boolean = true,\n applySorting: boolean = true\n ): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any\n let { limit, offset, showSoftDeleted, filters } = basicFilterDto;\n const { fields, sort, populate = [], populateMedia = [], locale } = basicFilterDto;\n\n // Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)\n const normalizedFields = this.normalize(fields);\n const normalizedAndFilteredPopulateAttributes = this.normalizeAndFilterPopulateAttributes(populate);\n const normalizedPopulateMedia = this.normalize(populateMedia);\n\n // if normalizedPopulateMedia, has any nested media paths, then add then to populate excluding the last part\n const additionalPopulate = this.additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia);\n // Add the additional populate relations to the normalizedPopulate, if they are not already present\n normalizedAndFilteredPopulateAttributes.push(...additionalPopulate.filter((relation) => !normalizedAndFilteredPopulateAttributes.includes(relation)));\n\n const normalizedSort = this.normalize(sort);\n\n // Depending upon the populate option, apply the join clause\n if (normalizedAndFilteredPopulateAttributes && normalizedAndFilteredPopulateAttributes.length) {\n this.buildPopulateQuery(normalizedAndFilteredPopulateAttributes, entityAlias, qb);\n }\n\n if (filters) {\n if (filterCombinator === FilterCombinator.AND) {\n qb.andWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n } else if (filterCombinator === FilterCombinator.OR) {\n qb.orWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n }\n }\n\n if (internationalisation) {\n // If locale is not provided in the filter dto, then assume it is the default locale to be used.\n const finalLocale = locale || this.internationalisationHelperService.resolveDefaultLocaleName(moduleRef.get(SolidRegistry, { strict: false }));\n qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });\n }\n\n if (draftPublishWorkflow) {\n this.draftPublishHelperService.applyDraftPublishFilterDefaults(qb, filters, entityAlias);\n }\n // Depending upon the select option, apply the select clause\n if (normalizedFields && normalizedFields.length) {\n qb.select(normalizedFields.map(field => {\n // If the field contains a (, do not prefix the entity alias\n return this.wrapFieldWithAlias(qb, field, entityAlias);\n }));\n }\n\n // Depending upon the order option, apply the order by clause\n if (applySorting && normalizedSort && normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n if (orderOptions) {\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n let hasExplicitIdSort = false;\n orderOptionKeys.forEach((key) => {\n const value = orderOptions[key] as 'ASC' | 'DESC';\n const field = String(key);\n if (field === 'id') {\n hasExplicitIdSort = true;\n }\n if (field.includes('.')) {\n const { alias, property, created } = this.ensureRelationPathJoined(qb, entityAlias, field.split('.'));\n const orderColumn = `${alias}.${property}`;\n qb.addOrderBy(orderColumn, value);\n if (created) qb.addSelect(orderColumn);\n } else {\n // SECURITY: resolve against real metadata and order by the canonical column\n // name, never the raw input (addOrderBy accepts arbitrary SQL text).\n const { leafProperty } = this.resolveFieldPath(qb, [field]);\n qb.addOrderBy(`${entityAlias}.${leafProperty}`, value);\n }\n });\n if (!hasExplicitIdSort) {\n qb.addOrderBy(`${entityAlias}.id`, 'DESC');\n }\n }\n }\n\n if (showSoftDeleted === 'inclusive') {\n qb.withDeleted();\n }\n\n if (showSoftDeleted === 'exclusive') {\n qb.withDeleted();\n // SECURITY: must be andWhere. `where()` REPLACES every previously registered condition,\n // which discarded the user's filters, the locale/status predicates and — critically —\n // the row-level security rules applied by createSecurityRuleAwareQueryBuilder.\n qb.andWhere(`${entityAlias}.deletedAt IS NOT NULL`);\n }\n\n // Apply the pagination options & handle the case when the query has joins\n if (applyPagination) {\n if (limit) this.hasJoins(qb) ? qb.take(limit) : qb.limit(limit);\n if (offset) this.hasJoins(qb) ? qb.skip(offset) : qb.offset(offset);\n }\n return qb;\n }\n\n additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia: string[]) {\n // Populate relations containing the media field\n return normalizedPopulateMedia\n .filter(pm => pm.includes(\".\"))\n .map((pm) => {\n const mediaPathParts = pm.split('.');\n if (mediaPathParts.length <= 1) return pm;\n return mediaPathParts.slice(0, -1).join('.');\n });\n }\n\n private buildPopulateQuery(normalizedPopulate: string[], entityAlias: string, qb: SelectQueryBuilder<any>) {\n normalizedPopulate.forEach((relation) => {\n this.buildJoinQueryForRelation(qb, entityAlias, relation);\n });\n return qb;\n }\n\n private sanitizeAlias(alias: string) {\n return alias.replace(/[^a-zA-Z0-9_]/g, '_');\n }\n\n private isAliasJoined(queryBuilder: SelectQueryBuilder<any>, alias: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.alias?.name === alias);\n }\n\n private getExistingJoinAlias(qb: SelectQueryBuilder<any>, joinProperty: string): string | undefined {\n const existingJoin = qb.expressionMap.joinAttributes.find(join => join.entityOrProperty === joinProperty);\n return existingJoin?.alias?.name;\n }\n\n private ensureRelationPathJoined(qb: SelectQueryBuilder<any>, rootAlias: string, pathParts: string[]) {\n // SECURITY: validate the whole path against real metadata before any segment reaches SQL,\n // and build from the canonical names returned rather than the caller's strings. Covers\n // dotted `sort`, `groupBy` and `aggregates`, which all route through here.\n const resolved = this.resolveFieldPath(qb, pathParts);\n const mainAlias =\n qb.expressionMap?.mainAlias?.name ||\n qb.expressionMap?.aliases?.find(a => a.metadata)?.name ||\n qb.expressionMap?.aliases?.[0]?.name;\n let parentAlias = mainAlias || rootAlias;\n let leafJoinCreated = false;\n for (let i = 0; i < resolved.relationSegments.length; i++) {\n const part = resolved.relationSegments[i];\n const joinProperty = `${parentAlias}.${part}`;\n const existingAlias = this.getExistingJoinAlias(qb, joinProperty);\n const joinAlias = existingAlias ?? this.sanitizeAlias(`${parentAlias}_${part}`);\n if (!existingAlias && !this.isRelationJoined(qb, joinProperty) && !this.isAliasJoined(qb, joinAlias)) {\n qb.leftJoin(joinProperty, joinAlias);\n leafJoinCreated = true;\n } else {\n leafJoinCreated = false;\n }\n parentAlias = joinAlias;\n }\n return { alias: parentAlias, property: resolved.leafProperty, created: leafJoinCreated };\n }\n\n private getDriver(qb: SelectQueryBuilder<any>) {\n return qb.connection.options.type as string;\n }\n\n private buildDateGranularityExpression(driver: string, columnExpr: string, granularity: string) {\n // SECURITY: `granularity` is caller-supplied (groupBy `field:granularity`, or a filter\n // func-alias) and is interpolated into a quoted SQL string literal in the postgres branch\n // below. Validate it for EVERY driver here rather than per-driver: the whitelist used to be\n // duplicated inside the mysql/mssql switches and simply absent for postgres, which is\n // exactly how a quote break-out (`x'||(SELECT version())||'`) slipped through.\n if (!SUPPORTED_GRANULARITIES.includes(granularity)) {\n throw new BadRequestException(\n `Unsupported granularity '${this.describeInvalidField(granularity)}'. Supported granularities are: ${SUPPORTED_GRANULARITIES.join(', ')}.`\n );\n }\n switch (driver) {\n case 'postgres':\n case 'cockroachdb':\n return `DATE_TRUNC('${granularity}', ${columnExpr})`;\n case 'mysql':\n case 'mariadb':\n switch (granularity) {\n case 'day': return `DATE(${columnExpr})`;\n case 'week': return `STR_TO_DATE(DATE_FORMAT(${columnExpr}, '%x-%v-1'), '%x-%v-%w')`;\n case 'month': return `DATE_FORMAT(${columnExpr}, '%Y-%m-01')`;\n case 'year': return `DATE_FORMAT(${columnExpr}, '%Y-01-01')`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n case 'mssql':\n case 'sqlserver':\n switch (granularity) {\n case 'day': return `CONVERT(date, ${columnExpr})`;\n case 'week': return `DATEADD(week, DATEDIFF(week, 0, ${columnExpr}), 0)`;\n case 'month': return `DATEFROMPARTS(YEAR(${columnExpr}), MONTH(${columnExpr}), 1)`;\n case 'year': return `DATEFROMPARTS(YEAR(${columnExpr}), 1, 1)`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n default:\n throw new Error(`Granularity not supported for driver ${driver}`);\n }\n }\n\n private buildGroupByExpression(qb: SelectQueryBuilder<any>, rootAlias: string, field: string) {\n const parts = field.split(':');\n const rawField = parts[0];\n const granularity = parts[1];\n const format = parts[2];\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const groupExpr = granularity ? this.buildDateGranularityExpression(this.getDriver(qb), columnExpr, granularity) : columnExpr;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}${granularity ? '_' + granularity : ''}`);\n return { groupExpr, selectAlias, sourceKey: field, format };\n }\n\n applyGroupBySelections(\n qb: SelectQueryBuilder<any>,\n groupBy: string[],\n entityAlias: string\n ) {\n const aliasMap: Record<string, string> = {};\n const formatMap: Record<string, string | undefined> = {};\n const expressionMap: Record<string, string> = {};\n qb.select([]);\n groupBy.forEach((field) => {\n const { groupExpr, selectAlias, sourceKey, format } = this.buildGroupByExpression(qb, entityAlias, field);\n qb.addSelect(groupExpr, selectAlias);\n qb.addGroupBy(groupExpr);\n aliasMap[sourceKey] = selectAlias;\n formatMap[selectAlias] = format;\n expressionMap[selectAlias] = groupExpr;\n });\n return { aliasMap, formatMap, expressionMap };\n }\n\n private buildAggregateExpression(qb: SelectQueryBuilder<any>, rootAlias: string, aggregate: string) {\n const [rawField, rawFn] = aggregate.split(':');\n const fn = (rawFn || 'count').toLowerCase();\n if ((!rawField || rawField.toLowerCase() === 'count') && fn === 'count') {\n return { expression: 'COUNT(*)', selectAlias: 'count' };\n }\n if (!rawField) throw new Error(`Invalid aggregate specification: ${aggregate}`);\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}_${fn}`);\n let expression = '';\n switch (fn) {\n case 'count': expression = `COUNT(${columnExpr})`; break;\n case 'count_distinct': expression = `COUNT(DISTINCT ${columnExpr})`; break;\n case 'sum': expression = `SUM(${columnExpr})`; break;\n case 'avg': expression = `AVG(${columnExpr})`; break;\n case 'min': expression = `MIN(${columnExpr})`; break;\n case 'max': expression = `MAX(${columnExpr})`; break;\n default: throw new Error(`Unsupported aggregate function ${fn}`);\n }\n return { expression, selectAlias, sourceKey: aggregate };\n }\n\n applyAggregates(\n qb: SelectQueryBuilder<any>,\n aggregates: string[] | undefined,\n entityAlias: string\n ) {\n const aggregateList = this.normalize(aggregates);\n const aggregateAliasMap: Record<string, string> = {};\n if (!aggregateList.length) {\n qb.addSelect('COUNT(*)', 'count');\n aggregateAliasMap['count'] = 'count';\n return aggregateAliasMap;\n }\n aggregateList.forEach((agg) => {\n const { expression, selectAlias, sourceKey } = this.buildAggregateExpression(qb, entityAlias, agg);\n qb.addSelect(expression, selectAlias);\n aggregateAliasMap[sourceKey] = selectAlias;\n });\n return aggregateAliasMap;\n }\n\n applyGroupSortingAndPagination(\n qb: SelectQueryBuilder<any>,\n sort: string[] | undefined,\n aliasMap: Record<string, string>,\n limit?: number,\n offset?: number\n ) {\n const normalizedSort = this.normalize(sort);\n if (normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n orderOptionKeys.forEach((key) => {\n // SECURITY: in a grouped query the only legally sortable names are the declared\n // group/aggregate aliases. Falling back to the raw key spliced it into a quoted\n // identifier, which an embedded double-quote could break out of.\n const resolvedKey = aliasMap[key];\n if (!resolvedKey) {\n throw new BadRequestException(\n `Cannot sort by '${this.describeInvalidField(String(key))}' on a grouped query. Sort only by a groupBy or aggregate field.`\n );\n }\n const value = orderOptions[key] as 'ASC' | 'DESC';\n qb.addOrderBy(`\"${resolvedKey}\"`, value);\n });\n }\n const hasLimit = limit !== undefined && limit !== null;\n const hasOffset = offset !== undefined && offset !== null;\n\n // Use both take/skip and limit/offset to ensure pagination is applied even when joins are present.\n if (hasLimit) {\n qb.take(limit);\n qb.limit(limit);\n }\n if (hasOffset) {\n qb.skip(offset);\n qb.offset(offset);\n }\n }\n\n async countGroups(qb: SelectQueryBuilder<any>) {\n const clone = qb.clone();\n clone.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n const rows = await clone.getRawMany();\n return rows.length;\n }\n\n private buildJoinQueryForRelation(qb: SelectQueryBuilder<any>, entityAlias: string, relation: string) {\n // We split the joinProperty to get the alias of the entity we are joining\n const relationParts = relation.split('.');\n // SECURITY: every segment must be a real relation on the entity being walked. The canonical\n // names returned here are what get spliced below, so no request string reaches the join.\n const { relationSegments, leafIsRelation } = this.resolveFieldPath(qb, relationParts, { allowRelationLeaf: true });\n if (!leafIsRelation) {\n throw new BadRequestException(`'${this.describeInvalidField(relation)}' is not a relation and cannot be populated.`);\n }\n let parentAlias = entityAlias;\n relationSegments.forEach((part, i) => {\n const joinProperty = `${parentAlias}.${part}`;\n // Check if the relation is already joined, if not then join it\n if (!this.isRelationJoined(qb, joinProperty)) {\n const joinAlias = this.sanitizeAlias(relationSegments.slice(0, i + 1).join('_'));\n qb.leftJoinAndSelect(joinProperty, joinAlias);\n }\n else {\n // Since in populate, we are create a unique alias based on the relation path\n //If the join is already present, it is probably because of the relation being passed in the where filter i.e applyFilters method\n qb.addSelect(`${part}`);\n }\n // NOTE: deliberately left as `part` rather than the joinAlias. That is a pre-existing\n // alias-chaining bug which breaks 3+ level populate; fixing it is tracked separately so\n // this security change stays behaviour-preserving for queries that work today.\n parentAlias = part; // Update the parent alias for the next iteration\n });\n return qb;\n }\n\n private wrapFieldWithAlias(qb: SelectQueryBuilder<any>, field: string, entityAlias: string): string {\n // SECURITY: `qb.select()` accepts arbitrary SQL text, so the field name must be resolved\n // against real metadata and the canonical column name spliced instead of the raw input.\n if (!this.isAggregateField(field)) {\n return `${entityAlias}.${this.resolveOwnColumn(qb, field, 'fields')}`;\n }\n // For aggregate fields, extract the field name from the aggregate function & wrap it with the entity alias, if it is not already wrapped\n const fieldParts = field.split('(');\n const aggregateFunction = fieldParts[0].trim().toUpperCase();\n // Whitelist the function name too, mirroring buildAggregateExpression.\n if (!SUPPORTED_FIELD_FUNCTIONS.includes(aggregateFunction)) {\n throw new BadRequestException(\n `Unsupported field function '${this.describeInvalidField(fieldParts[0])}'. Supported functions are: ${SUPPORTED_FIELD_FUNCTIONS.join(', ')}.`\n );\n }\n const fieldName = fieldParts[1].replace(')', '').trim();\n return `${aggregateFunction}(${entityAlias}.${this.resolveOwnColumn(qb, fieldName, 'fields')})`;\n }\n\n /**\n * Resolve a single-segment column on the root entity and return its canonical name.\n *\n * Related (dotted) paths are rejected rather than resolved: the caller emits\n * `<rootAlias>.<column>` and builds no joins, so resolving a dotted path here would splice the\n * leaf against the root alias and silently read the wrong column. Such paths previously\n * produced invalid SQL, so rejecting them is the honest behaviour.\n */\n private resolveOwnColumn(qb: SelectQueryBuilder<any>, field: string, context: string): string {\n const resolved = this.resolveFieldPath(qb, field.split('.'));\n if (resolved.relationSegments.length) {\n throw new BadRequestException(\n `Related field '${this.describeInvalidField(field)}' is not supported in '${context}'. Use 'populate' to fetch related records.`\n );\n }\n return resolved.leafProperty;\n }\n\n isAggregateField(field: string): boolean {\n return field.includes('(');\n }\n\n isAggregateFieldKey(key: string, aggregateAliases: Set<string>): boolean {\n return aggregateAliases.has(key);\n }\n\n getFieldFromQueryFieldKey(queryFieldKey: string, alias: string): string {\n return queryFieldKey.replace(`${alias}_`, '');\n }\n\n buildGroupByRecordsQuery(\n qb: SelectQueryBuilder<any>,\n group: any,\n alias: string,\n groupAliasMap: Record<string, string> = {},\n aggregateAliasMap: Record<string, string> = {},\n groupExpressionMap: Record<string, string> = {}\n ): SelectQueryBuilder<any> {\n const rootAlias = qb.expressionMap?.mainAlias?.name\n ?? qb.expressionMap?.aliases?.find(a => a.metadata)?.name\n ?? qb.expressionMap?.aliases?.[0]?.name\n ?? (qb as any).alias\n ?? alias;\n qb.andWhere(new Brackets(qb => {\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n const reverseGroupAliasMap = Object.entries(groupAliasMap).reduce((acc, [sourceKey, aliasKey]) => {\n acc[aliasKey] = sourceKey;\n return acc;\n }, {} as Record<string, string>);\n for (const key in group) {\n if (group.hasOwnProperty(key) && !this.isAggregateFieldKey(key, aggregateAliasSet)) {\n const value = group[key];\n const sourceField = reverseGroupAliasMap[key] || key;\n const cleanedField = sourceField.split(':')[0];\n const pathParts = cleanedField.split('.');\n const { alias: resolvedAlias, property } = this.ensureRelationPathJoined(qb as any, rootAlias, pathParts);\n const paramKey = this.sanitizeAlias(`${resolvedAlias}_${property}_${key}`);\n const expr = (sourceField.includes(':') && groupExpressionMap[key])\n ? groupExpressionMap[key]\n : `${resolvedAlias}.${property}`;\n qb.andWhere(`${expr} = :${paramKey}`, { [paramKey]: value });\n }\n }\n }));\n return qb;\n }\n\n private formatGroupValue(value: any, format?: string) {\n if (!format) return value;\n if (value === null || value === undefined) return value;\n const dateVal = value instanceof Date ? value : new Date(value);\n if (isNaN(dateVal.getTime())) return value;\n switch (format) {\n case 'MMM':\n return dateVal.toLocaleString('en', { month: 'short' });\n case 'MMMM':\n return dateVal.toLocaleString('en', { month: 'long' });\n case 'YYYY':\n return dateVal.getFullYear();\n case 'YYYY-MM':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}`;\n case 'YYYY-MM-DD':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}-${String(dateVal.getDate()).padStart(2, '0')}`;\n default:\n return value;\n }\n }\n\n private getGroupFieldValues(\n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): Array<{ rawVal: any; alias: string; granularity?: string }> {\n return groupByFields\n .map(field => {\n const parts = field.split(':');\n const granularity = parts[1];\n const alias = groupAliasMap[field] ?? this.sanitizeAlias(field.replace(/\\./g, '_'));\n const rawVal = group[alias] ?? group[field] ?? group[field.replace(/\\./g, '_')];\n return { rawVal, alias, granularity };\n })\n .filter(({ rawVal }) => rawVal !== undefined && rawVal !== null);\n }\n\n private normalizeGroupValue(value: any, granularity?: string): any {\n if (!granularity) return value;\n return this.formatGroupValue(value, 'YYYY-MM-DD');\n }\n\n getGroupName(\n group: any,\n aggregateAliases: Set<string>,\n groupByFields: string[],\n groupAliasMap: Record<string, string>,\n groupFormatMap: Record<string, string | undefined>\n ): string {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n\n if (fieldValues.length === 0) {\n return Object.keys(group)\n .filter(key => !this.isAggregateFieldKey(key, aggregateAliases))\n .map(key => group[key])\n .join('_');\n }\n\n return fieldValues\n .map(({ rawVal, alias }) => this.formatGroupValue(rawVal, groupFormatMap[alias]))\n .join('_');\n }\n\n getGroupValue( \n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): any {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n if (fieldValues.length === 1) return this.normalizeGroupValue(fieldValues[0].rawVal, fieldValues[0].granularity);\n return fieldValues.map(({ rawVal, granularity }) => this.normalizeGroupValue(rawVal, granularity)).join('_');\n }\n\n createGroupRecords(group: any, aggregateAliases: Set<string>, groupData: any, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n return {\n groupName,\n groupData\n }\n }\n createGroupMeta(group: any, aggregateAliases: Set<string>, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n const groupValue = this.getGroupValue(group, groupByFields, groupAliasMap);\n const groupAggregateValues = {}\n for (const key in group) {\n if (group.hasOwnProperty(key) && this.isAggregateFieldKey(key, aggregateAliases)) {\n const value = group[key];\n groupAggregateValues[key] = value;\n }\n }\n return {\n groupName,\n groupValue,\n ...groupAggregateValues\n };\n }\n\n async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any\n const { limit, offset, ...rest } = basicFilterDto;\n const filteredDto = { ...rest, limit: undefined, offset: undefined };\n\n const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, undefined, undefined, undefined, FilterCombinator.AND, false, false);\n\n const groupByFields = this.normalize(filteredDto.groupBy);\n\n if (!groupByFields || groupByFields.length === 0) {\n throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n }\n\n this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);\n this.applyAggregates(filteredQB, ['count'], entityAlias);\n filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n\n const rawResults = await filteredQB.getRawMany();\n return rawResults.length;\n }\n\n hasReadPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.findOne`, `${classify(modelName)}Controller.findMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasWritePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`, `${classify(modelName)}Controller.insertMany`, `${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUpdatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasPublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUnpublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasDeletePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.delete`, `${classify(modelName)}Controller.deleteMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasCreatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasRecoverPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.recover`, `${classify(modelName)}Controller.recoverMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n pagedResponse<T>(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {\n const safeLimit = limit ?? count ?? 0;\n const safeOffset = offset ?? 0;\n const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;\n const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;\n const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;\n return {\n meta: {\n totalRecords: count,\n currentPage,\n nextPage,\n prevPage,\n totalPages,\n perPage: safeLimit ? +safeLimit : 0,\n },\n records: entities,\n };\n }\n\n async executeGroupPipeline<T>(\n filterQb: SelectQueryBuilder<T>,\n basicFilterDto: BasicFilterDto,\n alias: string,\n createQbFn: () => Promise<SelectQueryBuilder<T>>,\n postProcessEntities?: (entities: T[]) => Promise<void>\n ): Promise<{ meta: { totalRecords: number }; groupMeta: any[]; groupRecords: any[] }> {\n const groupByFields = this.normalize(basicFilterDto.groupBy);\n if (!groupByFields.length) throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n\n if (basicFilterDto.populateGroup) {\n const hasRelationGroup = groupByFields.some(f => f.includes('.'));\n if (hasRelationGroup) throw new BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');\n }\n\n const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } =\n this.applyGroupBySelections(filterQb, groupByFields, alias);\n const aggregateAliasMap = this.applyAggregates(filterQb, basicFilterDto.aggregates, alias);\n this.applyGroupSortingAndPagination(filterQb, basicFilterDto.sort, { ...groupAliasMap, ...aggregateAliasMap }, basicFilterDto.limit, basicFilterDto.offset);\n\n const groupByResult = await filterQb.getRawMany();\n const totalGroups = await this.countGroups(filterQb);\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n\n const groupMeta = [];\n const groupRecords = [];\n\n for (const group of groupByResult) {\n groupMeta.push(this.createGroupMeta(group, aggregateAliasSet, groupByFields, groupAliasMap, groupFormatMap));\n\n if (basicFilterDto.populateGroup) {\n let groupQb = await createQbFn();\n const { groupBy: _gb, aggregates: _agg, ...rest } = basicFilterDto;\n const groupFilterDto: BasicFilterDto = {\n ...rest,\n ...basicFilterDto.groupFilter,\n groupBy: undefined,\n aggregates: undefined,\n sort: basicFilterDto.groupFilter?.sort,\n };\n groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias);\n groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);\n const [entities, count] = await groupQb.getManyAndCount();\n if (postProcessEntities) await postProcessEntities(entities);\n const groupData = this.pagedResponse(basicFilterDto.groupFilter?.offset, basicFilterDto.groupFilter?.limit, count, entities);\n groupRecords.push(this.createGroupRecords(group, aggregateAliasSet, groupData, groupByFields, groupAliasMap, groupFormatMap));\n }\n }\n\n return { meta: { totalRecords: totalGroups }, groupMeta, groupRecords };\n }\n\n}\n"]}
1
+ {"version":3,"file":"crud-helper.service.js","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets, EntityMetadata, SelectQueryBuilder, WhereExpressionBuilder } from \"typeorm\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { classify } from '../helpers/string.helper';\nimport { ActiveUserData } from \"src/interfaces/active-user-data.interface\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { BadRequestException, Injectable, Logger } from \"@nestjs/common\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { buildCastToText } from \"src/helpers/typeorm-db-helper\";\nimport { DraftPublishHelperService } from \"./draft-publish-helper.service\";\nimport { InternationalisationHelperService } from \"./internationalisation-helper.service\";\nimport { normalizeObjectKeys } from \"./object.utils\";\n\nexport enum FilterCombinator {\n AND = '$and',\n OR = '$or'\n}\n\nexport enum UserIdFields {\n CREATED_BY = 'createdBy',\n UPDATED_BY = 'updatedBy'\n}\n\n/** Aggregate functions permitted in the `fields` `fn(field)` syntax. */\nconst SUPPORTED_FIELD_FUNCTIONS = ['COUNT', 'SUM', 'AVG', 'MIN', 'MAX'];\n\n/** Date granularities permitted in `groupBy` (`field:granularity`) and filter func-aliases. */\nconst SUPPORTED_GRANULARITIES = ['day', 'week', 'month', 'year'];\n\n/**\n * Outcome of resolving a user-supplied dotted path against real entity metadata.\n * Every string here originates from TypeORM metadata, never from request input.\n */\nexport interface ResolvedFieldPath {\n /** Canonical relation property names for each hop traversed (excludes a column leaf). */\n relationSegments: string[];\n /** Canonical column property name, when the leaf is a column. */\n leafProperty?: string;\n /** True when the leaf itself is a relation (populate / nested-filter join). */\n leafIsRelation: boolean;\n}\n\n@Injectable()\nexport class CrudHelperService {\n private readonly logger = new Logger(CrudHelperService.name);\n\n constructor(\n private readonly draftPublishHelperService: DraftPublishHelperService,\n private readonly internationalisationHelperService: InternationalisationHelperService,\n ) { }\n\n /**\n * Resolve a user-supplied dotted path (e.g. \"customer.name\") against real TypeORM metadata.\n *\n * SECURITY — this is the choke point that makes the filtering vocabulary safe.\n * SQL can bind *values* as parameters but never *identifiers* (column names, aliases,\n * ORDER BY expressions), so a client-chosen field name must be allow-listed instead.\n * The caller's string is used ONLY as a lookup key; every value returned comes from\n * ColumnMetadata/RelationMetadata, so callers build SQL exclusively from strings this\n * codebase produced, never from request input.\n *\n * Throws BadRequestException on any segment that is not a real column/relation.\n */\n resolveFieldPathFromMetadata(\n rootMetadata: EntityMetadata,\n pathParts: string[],\n { allowRelationLeaf = false }: { allowRelationLeaf?: boolean } = {}\n ): ResolvedFieldPath {\n // Fail closed: without metadata we cannot prove the identifier is safe.\n if (!rootMetadata) throw new BadRequestException(`Cannot resolve field '${this.describeInvalidField(pathParts?.join('.'))}'`);\n if (!pathParts?.length || pathParts.some(part => !part)) {\n throw new BadRequestException(`Invalid field path '${this.describeInvalidField(pathParts?.join('.'))}'`);\n }\n\n let metadata = rootMetadata;\n const relationSegments: string[] = [];\n\n for (let i = 0; i < pathParts.length; i++) {\n const isLeaf = i === pathParts.length - 1;\n // `metadata` is the entity currently being walked; it advances one hop per segment.\n // These lookups key on propertyName/propertyPath (NOT database name), so they are\n // naming-strategy agnostic and resolve implicit relation FK columns correctly.\n const relation = metadata.findRelationWithPropertyPath(pathParts[i]);\n const column = metadata.findColumnWithPropertyName(pathParts[i]);\n\n if (!isLeaf) {\n // Interior segments must be relations so we can keep walking.\n if (!relation) {\n throw new BadRequestException(`Invalid relation '${this.describeInvalidField(pathParts[i])}' in '${this.describeInvalidField(pathParts.join('.'))}'`);\n }\n relationSegments.push(relation.propertyName); // canonical, from metadata\n // THE HOP: advance to the entity on the other side so the NEXT iteration validates\n // against that entity rather than the root. Consumed at the top of the next pass —\n // it only looks unused here because `continue` follows immediately.\n // e.g. \"shop.customer.mcc\": NbfTransaction -> CustomerLocation -> Customer.\n // Without this, \"customer\" would be checked on NbfTransaction (wrongly accepted)\n // and \"mcc\" on NbfTransaction (wrongly rejected).\n metadata = relation.inverseEntityMetadata;\n continue;\n }\n\n // Leaf ordering matters: a many-to-one name can match BOTH a relation and its FK column.\n // populate (allowRelationLeaf) must treat it as a relation so it can be joined;\n // sort/filter must treat it as a column so it compares on the FK, as today.\n if (allowRelationLeaf && relation) {\n relationSegments.push(relation.propertyName);\n return { relationSegments, leafIsRelation: true };\n }\n if (column) {\n return { relationSegments, leafProperty: column.propertyName, leafIsRelation: false };\n }\n throw new BadRequestException(`Invalid field '${this.describeInvalidField(pathParts[i])}' in '${this.describeInvalidField(pathParts.join('.'))}'`);\n }\n\n throw new BadRequestException(`Invalid field path '${this.describeInvalidField(pathParts.join('.'))}'`);\n }\n\n /**\n * Query-builder flavoured wrapper around {@link resolveFieldPathFromMetadata}.\n *\n * `startAlias` matters for nested filters: applyFilters recurses into joined relations\n * carrying that relation's alias, so the leaf must resolve against the joined entity\n * rather than always the root.\n */\n resolveFieldPath(\n qb: SelectQueryBuilder<any>,\n pathParts: string[],\n { allowRelationLeaf = false, startAlias }: { allowRelationLeaf?: boolean; startAlias?: string } = {}\n ): ResolvedFieldPath {\n const aliasMetadata = startAlias ? this.findAliasMetadata(qb, startAlias) : undefined;\n const rootMetadata = aliasMetadata ?? qb?.expressionMap?.mainAlias?.metadata;\n return this.resolveFieldPathFromMetadata(rootMetadata, pathParts, { allowRelationLeaf });\n }\n\n private findAliasMetadata(qb: SelectQueryBuilder<any>, alias: string): EntityMetadata | undefined {\n const found = qb?.expressionMap?.aliases?.find(a => a.name === alias);\n return found?.hasMetadata ? found.metadata : undefined;\n }\n\n /**\n * Echo a rejected identifier back in a bounded way.\n *\n * Naming the bad field is what makes a 400 actionable for a legitimate typo, but reflecting an\n * unbounded attacker-supplied string is needless: it hands an attacker a reliable echo channel\n * and bloats logs. 80 characters is ample for a real field name.\n */\n private describeInvalidField(value: string): string {\n const text = String(value ?? '');\n return text.length > 80 ? `${text.slice(0, 80)}...` : text;\n }\n\n private orderOptions(sort: any[] = []) {\n const orderOptions = {};\n sort.forEach((s: string) => {\n const parts = s.split(':');\n let order: string | undefined;\n let field: string;\n if (parts.length > 1) {\n order = parts.pop();\n field = parts.join(':');\n } else {\n field = parts[0];\n }\n const normalizedOrder = order ? order.toUpperCase() : 'ASC';\n if (!['ASC', 'DESC'].includes(normalizedOrder)) {\n throw new Error(`Invalid sort order provided: ${order}`);\n }\n orderOptions[field] = normalizedOrder;\n });\n return orderOptions;\n }\n\n applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {\n const normalizedFilters = normalizeObjectKeys(filters);\n if (normalizedFilters.$and) {\n normalizedFilters.$and.forEach((andFilter: any) => {\n qb.andWhere(\n new Brackets(subQb => {\n this.applyFilters(subQb, andFilter, alias, selectQb);\n })\n );\n });\n } else if (normalizedFilters.$or) {\n normalizedFilters.$or.forEach((orFilter: any) => {\n qb.orWhere(new Brackets(subQb => {\n this.applyFilters(subQb, orFilter, alias, selectQb);\n }));\n });\n } else {\n // For individual conditions\n Object.keys(normalizedFilters).forEach(key => {\n const primaryFilterObj = normalizedFilters[key];\n const normalizedPrimaryFilterObj = normalizeObjectKeys(primaryFilterObj);\n\n const [rawField, funcAlias] = key.split(':');\n\n // Get the operator or field from the key\n const operatorOrField = Object.keys(normalizedPrimaryFilterObj)[0];\n // if the key is an operator, then build the query based on the operator\n if (operatorOrField.startsWith('$')) {\n const operator = operatorOrField;\n // SECURITY: resolve against the CURRENT alias (this method recurses into joined\n // relations), so a nested filter key is checked on the joined entity rather than\n // the root. Resolution is driven off `selectQb` because `qb` is a\n // WhereExpressionBuilder and exposes no expressionMap.\n const { leafProperty } = this.resolveFieldPath(selectQb, [rawField], { startAlias: alias });\n let columnExpression: string | undefined;\n if (funcAlias) {\n try {\n columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${leafProperty}`, funcAlias);\n } catch (error) {\n // Surface the precise granularity message; keep the original fallback\n // for driver-level failures.\n if (error instanceof BadRequestException) throw error;\n throw new BadRequestException(`Unsupported field function '${this.describeInvalidField(funcAlias)}'. Supported functions are: ${SUPPORTED_GRANULARITIES.join(', ')}.`);\n }\n }\n this.buildOperatorQuery(qb, alias, leafProperty, normalizedPrimaryFilterObj, operator, columnExpression);\n return;\n }\n else { // Recursively call the applyFilters method to handle nested conditions\n if (funcAlias) {\n throw new BadRequestException(`Function alias ':${funcAlias}' is not valid on relation field '${rawField}'. It can only be applied to scalar fields.`);\n }\n // SECURITY: the nested key must be a real relation on the current entity.\n const resolvedRelation = this.resolveFieldPath(selectQb, [rawField], { allowRelationLeaf: true, startAlias: alias });\n if (!resolvedRelation.leafIsRelation) {\n throw new BadRequestException(`'${this.describeInvalidField(rawField)}' is not a relation and cannot contain nested filters.`);\n }\n const relationName = resolvedRelation.relationSegments[resolvedRelation.relationSegments.length - 1];\n const joinField = `${alias}.${relationName}`;\n if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, relationName);\n this.applyFilters(qb, primaryFilterObj, relationName, selectQb);\n }\n });\n }\n }\n\n private buildOperatorQuery(qb: any, alias: string, field: string, normalizedPrimaryOperatorObj: any, operator: string, columnExpression?: string) {\n const uniqueFieldAlias = `${alias}_${field}_${Math.floor(Math.random() * 1000)}`;\n const colExpr = columnExpression ?? `${alias}.${field}`;\n switch (operator) {\n case '$eq':\n qb.andWhere(`${colExpr} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });\n break;\n case '$eqi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: String(normalizedPrimaryOperatorObj.$eqi).toLowerCase() });\n break;\n }\n case '$ne':\n qb.andWhere(`${colExpr} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });\n break;\n case '$nei': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: String(normalizedPrimaryOperatorObj.$nei).toLowerCase() });\n break;\n }\n case '$gt':\n qb.andWhere(`${colExpr} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });\n break;\n case '$gte':\n qb.andWhere(`${colExpr} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });\n break;\n case '$lt':\n qb.andWhere(`${colExpr} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });\n break;\n case '$lte':\n qb.andWhere(`${colExpr} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });\n break;\n case '$in':\n qb.andWhere(`${colExpr} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });\n break;\n case '$notIn':\n qb.andWhere(`${colExpr} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });\n break;\n case '$contains':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });\n break;\n case '$notContains':\n qb.andWhere(`${colExpr} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });\n break;\n case '$containsi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${String(normalizedPrimaryOperatorObj.$containsi).toLowerCase()}%` });\n break;\n }\n case '$notContainsi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${String(normalizedPrimaryOperatorObj.$notContainsi).toLowerCase()}%` });\n break;\n }\n case '$null':\n qb.andWhere(`${colExpr} IS NULL`);\n break;\n case '$notNull':\n qb.andWhere(`${colExpr} IS NOT NULL`);\n break;\n case '$between':\n qb.andWhere(`${colExpr} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });\n break;\n case '$startsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });\n break;\n case '$startsWithi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${String(normalizedPrimaryOperatorObj.$startsWithi).toLowerCase()}%` });\n break;\n }\n case '$endsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });\n break;\n case '$endsWithi': {\n const castExpr = buildCastToText(this.getDriver(qb), colExpr);\n qb.andWhere(`LOWER(${castExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${String(normalizedPrimaryOperatorObj.$endsWithi).toLowerCase()}` });\n break;\n }\n default:\n throw new Error(`Operator ${operator} is not supported`);\n }\n }\n\n normalize(value: string | string[]): string[] {\n if (!value) return []; // if the value is nullish, then return an empty array\n return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array\n }\n\n private normalizeAndFilterPopulateAttributes(value: string | string[]): string[] {\n // Normalize and remove the userId fields from the populate filter, since they are handled separately\n const normalized = this.normalize(value);\n return normalized.filter(item => item !== UserIdFields.CREATED_BY && item !== UserIdFields.UPDATED_BY);\n }\n\n extractUserIdFieldsFromPopulate(value: string | string[]): UserIdFields[] {\n const normalized = this.normalize(value);\n return normalized.filter(item => item === UserIdFields.CREATED_BY || item === UserIdFields.UPDATED_BY);\n }\n\n private isRelationJoined(queryBuilder: SelectQueryBuilder<any>, joinProperty: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.entityOrProperty === joinProperty);\n }\n\n private hasJoins(queryBuilder: SelectQueryBuilder<any>): boolean {\n return queryBuilder.expressionMap.joinAttributes.length > 0;\n }\n\n buildFilterQuery(\n qb: SelectQueryBuilder<any>,\n basicFilterDto: BasicFilterDto,\n entityAlias: string,\n internationalisation?: boolean,\n draftPublishWorkflow?: boolean,\n moduleRef?: any,\n filterCombinator: FilterCombinator = FilterCombinator.AND,\n applyPagination: boolean = true,\n applySorting: boolean = true\n ): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any\n let { limit, offset, showSoftDeleted, filters } = basicFilterDto;\n const { fields, sort, populate = [], populateMedia = [], locale } = basicFilterDto;\n\n // Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)\n const normalizedFields = this.normalize(fields);\n const normalizedAndFilteredPopulateAttributes = this.normalizeAndFilterPopulateAttributes(populate);\n const normalizedPopulateMedia = this.normalize(populateMedia);\n\n // if normalizedPopulateMedia, has any nested media paths, then add then to populate excluding the last part\n const additionalPopulate = this.additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia);\n // Add the additional populate relations to the normalizedPopulate, if they are not already present\n normalizedAndFilteredPopulateAttributes.push(...additionalPopulate.filter((relation) => !normalizedAndFilteredPopulateAttributes.includes(relation)));\n\n const normalizedSort = this.normalize(sort);\n\n // Depending upon the populate option, apply the join clause\n if (normalizedAndFilteredPopulateAttributes && normalizedAndFilteredPopulateAttributes.length) {\n this.buildPopulateQuery(normalizedAndFilteredPopulateAttributes, entityAlias, qb);\n }\n\n if (filters) {\n if (filterCombinator === FilterCombinator.AND) {\n qb.andWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n } else if (filterCombinator === FilterCombinator.OR) {\n qb.orWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n }\n }\n\n if (internationalisation) {\n // If locale is not provided in the filter dto, then assume it is the default locale to be used.\n const finalLocale = locale || this.internationalisationHelperService.resolveDefaultLocaleName(moduleRef.get(SolidRegistry, { strict: false }));\n qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });\n }\n\n if (draftPublishWorkflow) {\n this.draftPublishHelperService.applyDraftPublishFilterDefaults(qb, filters, entityAlias);\n }\n // Depending upon the select option, apply the select clause\n if (normalizedFields && normalizedFields.length) {\n qb.select(normalizedFields.map(field => {\n // If the field contains a (, do not prefix the entity alias\n return this.wrapFieldWithAlias(qb, field, entityAlias);\n }));\n }\n\n // Depending upon the order option, apply the order by clause\n if (applySorting && normalizedSort && normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n if (orderOptions) {\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n let hasExplicitIdSort = false;\n orderOptionKeys.forEach((key) => {\n const value = orderOptions[key] as 'ASC' | 'DESC';\n const field = String(key);\n if (field === 'id') {\n hasExplicitIdSort = true;\n }\n if (field.includes('.')) {\n const { alias, property, created } = this.ensureRelationPathJoined(qb, entityAlias, field.split('.'));\n const orderColumn = `${alias}.${property}`;\n qb.addOrderBy(orderColumn, value);\n if (created) qb.addSelect(orderColumn);\n } else {\n // SECURITY: resolve against real metadata and order by the canonical column\n // name, never the raw input (addOrderBy accepts arbitrary SQL text).\n const { leafProperty } = this.resolveFieldPath(qb, [field]);\n qb.addOrderBy(`${entityAlias}.${leafProperty}`, value);\n }\n });\n if (!hasExplicitIdSort) {\n qb.addOrderBy(`${entityAlias}.id`, 'DESC');\n }\n }\n }\n\n if (showSoftDeleted === 'inclusive') {\n qb.withDeleted();\n }\n\n if (showSoftDeleted === 'exclusive') {\n qb.withDeleted();\n // SECURITY: must be andWhere. `where()` REPLACES every previously registered condition,\n // which discarded the user's filters, the locale/status predicates and — critically —\n // the row-level security rules applied by createSecurityRuleAwareQueryBuilder.\n qb.andWhere(`${entityAlias}.deletedAt IS NOT NULL`);\n }\n\n // Apply the pagination options & handle the case when the query has joins\n if (applyPagination) {\n if (limit) this.hasJoins(qb) ? qb.take(limit) : qb.limit(limit);\n if (offset) this.hasJoins(qb) ? qb.skip(offset) : qb.offset(offset);\n }\n return qb;\n }\n\n additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia: string[]) {\n // Populate relations containing the media field\n return normalizedPopulateMedia\n .filter(pm => pm.includes(\".\"))\n .map((pm) => {\n const mediaPathParts = pm.split('.');\n if (mediaPathParts.length <= 1) return pm;\n return mediaPathParts.slice(0, -1).join('.');\n });\n }\n\n private buildPopulateQuery(normalizedPopulate: string[], entityAlias: string, qb: SelectQueryBuilder<any>) {\n normalizedPopulate.forEach((relation) => {\n this.buildJoinQueryForRelation(qb, entityAlias, relation);\n });\n return qb;\n }\n\n private sanitizeAlias(alias: string) {\n return alias.replace(/[^a-zA-Z0-9_]/g, '_');\n }\n\n private isAliasJoined(queryBuilder: SelectQueryBuilder<any>, alias: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.alias?.name === alias);\n }\n\n private getExistingJoinAlias(qb: SelectQueryBuilder<any>, joinProperty: string): string | undefined {\n const existingJoin = qb.expressionMap.joinAttributes.find(join => join.entityOrProperty === joinProperty);\n return existingJoin?.alias?.name;\n }\n\n private ensureRelationPathJoined(qb: SelectQueryBuilder<any>, rootAlias: string, pathParts: string[]) {\n // SECURITY: validate the whole path against real metadata before any segment reaches SQL,\n // and build from the canonical names returned rather than the caller's strings. Covers\n // dotted `sort`, `groupBy` and `aggregates`, which all route through here.\n const resolved = this.resolveFieldPath(qb, pathParts);\n const mainAlias =\n qb.expressionMap?.mainAlias?.name ||\n qb.expressionMap?.aliases?.find(a => a.metadata)?.name ||\n qb.expressionMap?.aliases?.[0]?.name;\n let parentAlias = mainAlias || rootAlias;\n let leafJoinCreated = false;\n for (let i = 0; i < resolved.relationSegments.length; i++) {\n const part = resolved.relationSegments[i];\n const joinProperty = `${parentAlias}.${part}`;\n const existingAlias = this.getExistingJoinAlias(qb, joinProperty);\n const joinAlias = existingAlias ?? this.sanitizeAlias(`${parentAlias}_${part}`);\n if (!existingAlias && !this.isRelationJoined(qb, joinProperty) && !this.isAliasJoined(qb, joinAlias)) {\n qb.leftJoin(joinProperty, joinAlias);\n leafJoinCreated = true;\n } else {\n leafJoinCreated = false;\n }\n parentAlias = joinAlias;\n }\n return { alias: parentAlias, property: resolved.leafProperty, created: leafJoinCreated };\n }\n\n private getDriver(qb: SelectQueryBuilder<any>) {\n return qb.connection.options.type as string;\n }\n\n private buildDateGranularityExpression(driver: string, columnExpr: string, granularity: string) {\n // SECURITY: `granularity` is caller-supplied (groupBy `field:granularity`, or a filter\n // func-alias) and is interpolated into a quoted SQL string literal in the postgres branch\n // below. Validate it for EVERY driver here rather than per-driver: the whitelist used to be\n // duplicated inside the mysql/mssql switches and simply absent for postgres, which is\n // exactly how a quote break-out (`x'||(SELECT version())||'`) slipped through.\n if (!SUPPORTED_GRANULARITIES.includes(granularity)) {\n throw new BadRequestException(\n `Unsupported granularity '${this.describeInvalidField(granularity)}'. Supported granularities are: ${SUPPORTED_GRANULARITIES.join(', ')}.`\n );\n }\n switch (driver) {\n case 'postgres':\n case 'cockroachdb':\n return `DATE_TRUNC('${granularity}', ${columnExpr})`;\n case 'mysql':\n case 'mariadb':\n switch (granularity) {\n case 'day': return `DATE(${columnExpr})`;\n case 'week': return `STR_TO_DATE(DATE_FORMAT(${columnExpr}, '%x-%v-1'), '%x-%v-%w')`;\n case 'month': return `DATE_FORMAT(${columnExpr}, '%Y-%m-01')`;\n case 'year': return `DATE_FORMAT(${columnExpr}, '%Y-01-01')`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n case 'mssql':\n case 'sqlserver':\n switch (granularity) {\n case 'day': return `CONVERT(date, ${columnExpr})`;\n case 'week': return `DATEADD(week, DATEDIFF(week, 0, ${columnExpr}), 0)`;\n case 'month': return `DATEFROMPARTS(YEAR(${columnExpr}), MONTH(${columnExpr}), 1)`;\n case 'year': return `DATEFROMPARTS(YEAR(${columnExpr}), 1, 1)`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n default:\n throw new Error(`Granularity not supported for driver ${driver}`);\n }\n }\n\n private buildGroupByExpression(qb: SelectQueryBuilder<any>, rootAlias: string, field: string) {\n const parts = field.split(':');\n const rawField = parts[0];\n const granularity = parts[1];\n const format = parts[2];\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const groupExpr = granularity ? this.buildDateGranularityExpression(this.getDriver(qb), columnExpr, granularity) : columnExpr;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}${granularity ? '_' + granularity : ''}`);\n return { groupExpr, selectAlias, sourceKey: field, format };\n }\n\n applyGroupBySelections(\n qb: SelectQueryBuilder<any>,\n groupBy: string[],\n entityAlias: string\n ) {\n const aliasMap: Record<string, string> = {};\n const formatMap: Record<string, string | undefined> = {};\n const expressionMap: Record<string, string> = {};\n qb.select([]);\n groupBy.forEach((field) => {\n const { groupExpr, selectAlias, sourceKey, format } = this.buildGroupByExpression(qb, entityAlias, field);\n qb.addSelect(groupExpr, selectAlias);\n qb.addGroupBy(groupExpr);\n aliasMap[sourceKey] = selectAlias;\n formatMap[selectAlias] = format;\n expressionMap[selectAlias] = groupExpr;\n });\n return { aliasMap, formatMap, expressionMap };\n }\n\n private buildAggregateExpression(qb: SelectQueryBuilder<any>, rootAlias: string, aggregate: string) {\n const [rawField, rawFn] = aggregate.split(':');\n const fn = (rawFn || 'count').toLowerCase();\n if ((!rawField || rawField.toLowerCase() === 'count') && fn === 'count') {\n return { expression: 'COUNT(*)', selectAlias: 'count' };\n }\n if (!rawField) throw new Error(`Invalid aggregate specification: ${aggregate}`);\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}_${fn}`);\n let expression = '';\n switch (fn) {\n case 'count': expression = `COUNT(${columnExpr})`; break;\n case 'count_distinct': expression = `COUNT(DISTINCT ${columnExpr})`; break;\n case 'sum': expression = `SUM(${columnExpr})`; break;\n case 'avg': expression = `AVG(${columnExpr})`; break;\n case 'min': expression = `MIN(${columnExpr})`; break;\n case 'max': expression = `MAX(${columnExpr})`; break;\n default: throw new Error(`Unsupported aggregate function ${fn}`);\n }\n return { expression, selectAlias, sourceKey: aggregate };\n }\n\n applyAggregates(\n qb: SelectQueryBuilder<any>,\n aggregates: string[] | undefined,\n entityAlias: string\n ) {\n const aggregateList = this.normalize(aggregates);\n const aggregateAliasMap: Record<string, string> = {};\n if (!aggregateList.length) {\n qb.addSelect('COUNT(*)', 'count');\n aggregateAliasMap['count'] = 'count';\n return aggregateAliasMap;\n }\n aggregateList.forEach((agg) => {\n const { expression, selectAlias, sourceKey } = this.buildAggregateExpression(qb, entityAlias, agg);\n qb.addSelect(expression, selectAlias);\n aggregateAliasMap[sourceKey] = selectAlias;\n });\n return aggregateAliasMap;\n }\n\n applyGroupSortingAndPagination(\n qb: SelectQueryBuilder<any>,\n sort: string[] | undefined,\n aliasMap: Record<string, string>,\n limit?: number,\n offset?: number\n ) {\n const normalizedSort = this.normalize(sort);\n if (normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n orderOptionKeys.forEach((key) => {\n // SECURITY: in a grouped query the only legally sortable names are the declared\n // group/aggregate aliases. Falling back to the raw key spliced it into a quoted\n // identifier, which an embedded double-quote could break out of.\n const resolvedKey = aliasMap[key];\n if (!resolvedKey) {\n throw new BadRequestException(\n `Cannot sort by '${this.describeInvalidField(String(key))}' on a grouped query. Sort only by a groupBy or aggregate field.`\n );\n }\n const value = orderOptions[key] as 'ASC' | 'DESC';\n qb.addOrderBy(`\"${resolvedKey}\"`, value);\n });\n }\n const hasLimit = limit !== undefined && limit !== null;\n const hasOffset = offset !== undefined && offset !== null;\n\n // Use both take/skip and limit/offset to ensure pagination is applied even when joins are present.\n if (hasLimit) {\n qb.take(limit);\n qb.limit(limit);\n }\n if (hasOffset) {\n qb.skip(offset);\n qb.offset(offset);\n }\n }\n\n async countGroups(qb: SelectQueryBuilder<any>) {\n const clone = qb.clone();\n clone.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n const rows = await clone.getRawMany();\n return rows.length;\n }\n\n private buildJoinQueryForRelation(qb: SelectQueryBuilder<any>, entityAlias: string, relation: string) {\n // We split the joinProperty to get the alias of the entity we are joining\n const relationParts = relation.split('.');\n // SECURITY: every segment must be a real relation on the entity being walked. The canonical\n // names returned here are what get spliced below, so no request string reaches the join.\n const { relationSegments, leafIsRelation } = this.resolveFieldPath(qb, relationParts, { allowRelationLeaf: true });\n if (!leafIsRelation) {\n throw new BadRequestException(`'${this.describeInvalidField(relation)}' is not a relation and cannot be populated.`);\n }\n let parentAlias = entityAlias;\n relationSegments.forEach((part, i) => {\n const joinProperty = `${parentAlias}.${part}`;\n // Check if the relation is already joined, if not then join it\n if (!this.isRelationJoined(qb, joinProperty)) {\n const joinAlias = this.sanitizeAlias(relationSegments.slice(0, i + 1).join('_'));\n qb.leftJoinAndSelect(joinProperty, joinAlias);\n }\n else {\n // Since in populate, we are create a unique alias based on the relation path\n //If the join is already present, it is probably because of the relation being passed in the where filter i.e applyFilters method\n qb.addSelect(`${part}`);\n }\n // NOTE: deliberately left as `part` rather than the joinAlias. That is a pre-existing\n // alias-chaining bug which breaks 3+ level populate; fixing it is tracked separately so\n // this security change stays behaviour-preserving for queries that work today.\n parentAlias = part; // Update the parent alias for the next iteration\n });\n return qb;\n }\n\n private wrapFieldWithAlias(qb: SelectQueryBuilder<any>, field: string, entityAlias: string): string {\n // SECURITY: `qb.select()` accepts arbitrary SQL text, so the field name must be resolved\n // against real metadata and the canonical column name spliced instead of the raw input.\n if (!this.isAggregateField(field)) {\n return `${entityAlias}.${this.resolveOwnColumn(qb, field, 'fields')}`;\n }\n // For aggregate fields, extract the field name from the aggregate function & wrap it with the entity alias, if it is not already wrapped\n const fieldParts = field.split('(');\n const aggregateFunction = fieldParts[0].trim().toUpperCase();\n // Whitelist the function name too, mirroring buildAggregateExpression.\n if (!SUPPORTED_FIELD_FUNCTIONS.includes(aggregateFunction)) {\n throw new BadRequestException(\n `Unsupported field function '${this.describeInvalidField(fieldParts[0])}'. Supported functions are: ${SUPPORTED_FIELD_FUNCTIONS.join(', ')}.`\n );\n }\n const fieldName = fieldParts[1].replace(')', '').trim();\n return `${aggregateFunction}(${entityAlias}.${this.resolveOwnColumn(qb, fieldName, 'fields')})`;\n }\n\n /**\n * Resolve a single-segment column on the root entity and return its canonical name.\n *\n * Related (dotted) paths are rejected rather than resolved: the caller emits\n * `<rootAlias>.<column>` and builds no joins, so resolving a dotted path here would splice the\n * leaf against the root alias and silently read the wrong column. Such paths previously\n * produced invalid SQL, so rejecting them is the honest behaviour.\n */\n private resolveOwnColumn(qb: SelectQueryBuilder<any>, field: string, context: string): string {\n const resolved = this.resolveFieldPath(qb, field.split('.'));\n if (resolved.relationSegments.length) {\n throw new BadRequestException(\n `Related field '${this.describeInvalidField(field)}' is not supported in '${context}'. Use 'populate' to fetch related records.`\n );\n }\n return resolved.leafProperty;\n }\n\n isAggregateField(field: string): boolean {\n return field.includes('(');\n }\n\n isAggregateFieldKey(key: string, aggregateAliases: Set<string>): boolean {\n return aggregateAliases.has(key);\n }\n\n getFieldFromQueryFieldKey(queryFieldKey: string, alias: string): string {\n return queryFieldKey.replace(`${alias}_`, '');\n }\n\n buildGroupByRecordsQuery(\n qb: SelectQueryBuilder<any>,\n group: any,\n alias: string,\n groupAliasMap: Record<string, string> = {},\n aggregateAliasMap: Record<string, string> = {},\n groupExpressionMap: Record<string, string> = {}\n ): SelectQueryBuilder<any> {\n const rootAlias = qb.expressionMap?.mainAlias?.name\n ?? qb.expressionMap?.aliases?.find(a => a.metadata)?.name\n ?? qb.expressionMap?.aliases?.[0]?.name\n ?? (qb as any).alias\n ?? alias;\n qb.andWhere(new Brackets(qb => {\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n const reverseGroupAliasMap = Object.entries(groupAliasMap).reduce((acc, [sourceKey, aliasKey]) => {\n acc[aliasKey] = sourceKey;\n return acc;\n }, {} as Record<string, string>);\n for (const key in group) {\n if (group.hasOwnProperty(key) && !this.isAggregateFieldKey(key, aggregateAliasSet)) {\n const value = group[key];\n const sourceField = reverseGroupAliasMap[key] || key;\n const cleanedField = sourceField.split(':')[0];\n const pathParts = cleanedField.split('.');\n const { alias: resolvedAlias, property } = this.ensureRelationPathJoined(qb as any, rootAlias, pathParts);\n const paramKey = this.sanitizeAlias(`${resolvedAlias}_${property}_${key}`);\n const expr = (sourceField.includes(':') && groupExpressionMap[key])\n ? groupExpressionMap[key]\n : `${resolvedAlias}.${property}`;\n qb.andWhere(`${expr} = :${paramKey}`, { [paramKey]: value });\n }\n }\n }));\n return qb;\n }\n\n private formatGroupValue(value: any, format?: string) {\n if (!format) return value;\n if (value === null || value === undefined) return value;\n const dateVal = value instanceof Date ? value : new Date(value);\n if (isNaN(dateVal.getTime())) return value;\n switch (format) {\n case 'MMM':\n return dateVal.toLocaleString('en', { month: 'short' });\n case 'MMMM':\n return dateVal.toLocaleString('en', { month: 'long' });\n case 'YYYY':\n return dateVal.getFullYear();\n case 'YYYY-MM':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}`;\n case 'YYYY-MM-DD':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}-${String(dateVal.getDate()).padStart(2, '0')}`;\n default:\n return value;\n }\n }\n\n private getGroupFieldValues(\n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): Array<{ rawVal: any; alias: string; granularity?: string }> {\n return groupByFields\n .map(field => {\n const parts = field.split(':');\n const granularity = parts[1];\n const alias = groupAliasMap[field] ?? this.sanitizeAlias(field.replace(/\\./g, '_'));\n const rawVal = group[alias] ?? group[field] ?? group[field.replace(/\\./g, '_')];\n return { rawVal, alias, granularity };\n })\n .filter(({ rawVal }) => rawVal !== undefined && rawVal !== null);\n }\n\n private normalizeGroupValue(value: any, granularity?: string): any {\n if (!granularity) return value;\n return this.formatGroupValue(value, 'YYYY-MM-DD');\n }\n\n getGroupName(\n group: any,\n aggregateAliases: Set<string>,\n groupByFields: string[],\n groupAliasMap: Record<string, string>,\n groupFormatMap: Record<string, string | undefined>\n ): string {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n\n if (fieldValues.length === 0) {\n return Object.keys(group)\n .filter(key => !this.isAggregateFieldKey(key, aggregateAliases))\n .map(key => group[key])\n .join('_');\n }\n\n return fieldValues\n .map(({ rawVal, alias }) => this.formatGroupValue(rawVal, groupFormatMap[alias]))\n .join('_');\n }\n\n getGroupValue( \n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): any {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n if (fieldValues.length === 1) return this.normalizeGroupValue(fieldValues[0].rawVal, fieldValues[0].granularity);\n return fieldValues.map(({ rawVal, granularity }) => this.normalizeGroupValue(rawVal, granularity)).join('_');\n }\n\n createGroupRecords(group: any, aggregateAliases: Set<string>, groupData: any, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n return {\n groupName,\n groupData\n }\n }\n createGroupMeta(group: any, aggregateAliases: Set<string>, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n const groupValue = this.getGroupValue(group, groupByFields, groupAliasMap);\n const groupAggregateValues = {}\n for (const key in group) {\n if (group.hasOwnProperty(key) && this.isAggregateFieldKey(key, aggregateAliases)) {\n const value = group[key];\n groupAggregateValues[key] = value;\n }\n }\n return {\n groupName,\n groupValue,\n ...groupAggregateValues\n };\n }\n\n // async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean, moduleRef?: any) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any\n // const { limit, offset, ...rest } = basicFilterDto;\n // const filteredDto = { ...rest, limit: undefined, offset: undefined };\n\n // const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, internationalisation, draftPublishWorkflow, moduleRef, FilterCombinator.AND, false, false);\n\n // const groupByFields = this.normalize(filteredDto.groupBy);\n\n // if (!groupByFields || groupByFields.length === 0) {\n // throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n // }\n\n // this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);\n // this.applyAggregates(filteredQB, ['count'], entityAlias);\n // filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n\n // const rawResults = await filteredQB.getRawMany();\n // return rawResults.length;\n // }\n\n hasReadPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.findOne`, `${classify(modelName)}Controller.findMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasWritePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`, `${classify(modelName)}Controller.insertMany`, `${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUpdatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasPublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUnpublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasDeletePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.delete`, `${classify(modelName)}Controller.deleteMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasCreatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasRecoverPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.recover`, `${classify(modelName)}Controller.recoverMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n pagedResponse<T>(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {\n const safeLimit = limit ?? count ?? 0;\n const safeOffset = offset ?? 0;\n const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;\n const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;\n const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;\n return {\n meta: {\n totalRecords: count,\n currentPage,\n nextPage,\n prevPage,\n totalPages,\n perPage: safeLimit ? +safeLimit : 0,\n },\n records: entities,\n };\n }\n\n async executeGroupPipeline<T>(\n filterQb: SelectQueryBuilder<T>,\n basicFilterDto: BasicFilterDto,\n alias: string,\n createQbFn: () => Promise<SelectQueryBuilder<T>>,\n postProcessEntities?: (entities: T[]) => Promise<void>,\n internationalisation?: boolean,\n draftPublishWorkflow?: boolean,\n moduleRef?: any\n ): Promise<{ meta: { totalRecords: number }; groupMeta: any[]; groupRecords: any[] }> {\n const groupByFields = this.normalize(basicFilterDto.groupBy);\n if (!groupByFields.length) throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n\n if (basicFilterDto.populateGroup) {\n const hasRelationGroup = groupByFields.some(f => f.includes('.'));\n if (hasRelationGroup) throw new BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');\n }\n\n const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } =\n this.applyGroupBySelections(filterQb, groupByFields, alias);\n const aggregateAliasMap = this.applyAggregates(filterQb, basicFilterDto.aggregates, alias);\n this.applyGroupSortingAndPagination(filterQb, basicFilterDto.sort, { ...groupAliasMap, ...aggregateAliasMap }, basicFilterDto.limit, basicFilterDto.offset);\n\n const groupByResult = await filterQb.getRawMany();\n const totalGroups = await this.countGroups(filterQb);\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n\n const groupMeta = [];\n const groupRecords = [];\n\n for (const group of groupByResult) {\n groupMeta.push(this.createGroupMeta(group, aggregateAliasSet, groupByFields, groupAliasMap, groupFormatMap));\n\n if (basicFilterDto.populateGroup) {\n let groupQb = await createQbFn();\n const { groupBy: _gb, aggregates: _agg, ...rest } = basicFilterDto;\n const groupFilterDto: BasicFilterDto = {\n ...rest,\n ...basicFilterDto.groupFilter,\n groupBy: undefined,\n aggregates: undefined,\n sort: basicFilterDto.groupFilter?.sort,\n };\n groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias, internationalisation, draftPublishWorkflow, moduleRef);\n groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);\n const [entities, count] = await groupQb.getManyAndCount();\n if (postProcessEntities) await postProcessEntities(entities);\n const groupData = this.pagedResponse(basicFilterDto.groupFilter?.offset, basicFilterDto.groupFilter?.limit, count, entities);\n groupRecords.push(this.createGroupRecords(group, aggregateAliasSet, groupData, groupByFields, groupAliasMap, groupFormatMap));\n }\n }\n\n return { meta: { totalRecords: totalGroups }, groupMeta, groupRecords };\n }\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"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"}
@@ -378,6 +378,7 @@ class CRUDService {
378
378
  ...commonOptions,
379
379
  mediaMaxSizeKb: fieldMetadata.mediaMaxSizeKb,
380
380
  mediaTypes: fieldMetadata.mediaTypes,
381
+ mediaAllowedExtensions: fieldMetadata.mediaAllowedExtensions,
381
382
  type: fieldMetadata.type
382
383
  };
383
384
  return new MediaFieldCrudManager_1.MediaFieldCrudManager(options);
@@ -485,7 +486,7 @@ class CRUDService {
485
486
  await this.handlePopulateUserIdFields(populateUserIdFields, entities);
486
487
  if (populateMedia?.length)
487
488
  await this.handlePopulateMedia(populateMedia, entities);
488
- });
489
+ }, internationalisation, draftPublishWorkflow, this.moduleRef);
489
490
  }
490
491
  else {
491
492
  qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);