@solidxai/core 0.1.4 → 0.1.5-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/dist/constants/error-messages.d.ts +1 -0
  3. package/dist/constants/error-messages.d.ts.map +1 -1
  4. package/dist/constants/error-messages.js +1 -0
  5. package/dist/constants/error-messages.js.map +1 -1
  6. package/dist/constants.d.ts +3 -3
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js +12 -12
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controllers/otp-authentication.controller.d.ts +1 -4
  11. package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
  12. package/dist/controllers/otp-authentication.controller.js +1 -1
  13. package/dist/controllers/role-metadata.controller.d.ts +1 -0
  14. package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
  15. package/dist/controllers/role-metadata.controller.js +15 -0
  16. package/dist/controllers/role-metadata.controller.js.map +1 -1
  17. package/dist/dtos/create-email-template.dto.d.ts.map +1 -1
  18. package/dist/dtos/create-email-template.dto.js.map +1 -1
  19. package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
  20. package/dist/dtos/create-list-of-values.dto.js.map +1 -1
  21. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  22. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  23. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  24. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  25. package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
  26. package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
  27. package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
  28. package/dist/dtos/create-security-rule.dto.js.map +1 -1
  29. package/dist/dtos/create-sms-template.dto.d.ts.map +1 -1
  30. package/dist/dtos/create-sms-template.dto.js.map +1 -1
  31. package/dist/dtos/create-view-metadata.dto.d.ts.map +1 -1
  32. package/dist/dtos/create-view-metadata.dto.js.map +1 -1
  33. package/dist/dtos/otp-sign-in.dto.d.ts +1 -1
  34. package/dist/dtos/otp-sign-in.dto.d.ts.map +1 -1
  35. package/dist/dtos/otp-sign-in.dto.js +2 -2
  36. package/dist/dtos/otp-sign-in.dto.js.map +1 -1
  37. package/dist/dtos/otp-sign-up.dto.d.ts +2 -2
  38. package/dist/dtos/otp-sign-up.dto.d.ts.map +1 -1
  39. package/dist/dtos/otp-sign-up.dto.js +2 -2
  40. package/dist/dtos/otp-sign-up.dto.js.map +1 -1
  41. package/dist/dtos/resolve-s3-url.dto.d.ts +2 -5
  42. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  43. package/dist/dtos/resolve-s3-url.dto.js +1 -13
  44. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  45. package/dist/dtos/sign-up.dto.d.ts.map +1 -1
  46. package/dist/dtos/sign-up.dto.js.map +1 -1
  47. package/dist/dtos/update-email-template.dto.d.ts.map +1 -1
  48. package/dist/dtos/update-email-template.dto.js.map +1 -1
  49. package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
  50. package/dist/dtos/update-list-of-values.dto.js.map +1 -1
  51. package/dist/dtos/update-menu-item-metadata.dto.d.ts.map +1 -1
  52. package/dist/dtos/update-menu-item-metadata.dto.js.map +1 -1
  53. package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
  54. package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
  55. package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
  56. package/dist/dtos/update-security-rule.dto.js.map +1 -1
  57. package/dist/dtos/update-sms-template.dto.d.ts.map +1 -1
  58. package/dist/dtos/update-sms-template.dto.js.map +1 -1
  59. package/dist/dtos/update-view-metadata.dto.d.ts.map +1 -1
  60. package/dist/dtos/update-view-metadata.dto.js.map +1 -1
  61. package/dist/entities/user.entity.d.ts +1 -0
  62. package/dist/entities/user.entity.d.ts.map +1 -1
  63. package/dist/entities/user.entity.js +6 -1
  64. package/dist/entities/user.entity.js.map +1 -1
  65. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +2 -0
  66. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  67. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +33 -23
  68. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  69. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +3 -0
  70. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  71. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +36 -23
  72. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  73. package/dist/helpers/security.helper.js +1 -0
  74. package/dist/helpers/security.helper.js.map +1 -1
  75. package/dist/index.d.ts +0 -4
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +0 -4
  78. package/dist/index.js.map +1 -1
  79. package/dist/repository/solid-base.repository.d.ts +10 -1
  80. package/dist/repository/solid-base.repository.d.ts.map +1 -1
  81. package/dist/repository/solid-base.repository.js +109 -0
  82. package/dist/repository/solid-base.repository.js.map +1 -1
  83. package/dist/seeders/module-metadata-seeder.service.d.ts +2 -0
  84. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  85. package/dist/seeders/module-metadata-seeder.service.js +141 -71
  86. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  87. package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -1
  88. package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
  89. package/dist/seeders/permission-metadata-seeder.service.js +1 -1
  90. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  91. package/dist/seeders/seed-data/solid-core-metadata.json +12 -25
  92. package/dist/services/authentication.service.d.ts +22 -8
  93. package/dist/services/authentication.service.d.ts.map +1 -1
  94. package/dist/services/authentication.service.js +228 -214
  95. package/dist/services/authentication.service.js.map +1 -1
  96. package/dist/services/crud-helper.service.d.ts +4 -0
  97. package/dist/services/crud-helper.service.d.ts.map +1 -1
  98. package/dist/services/crud-helper.service.js +66 -32
  99. package/dist/services/crud-helper.service.js.map +1 -1
  100. package/dist/services/crud.service.d.ts.map +1 -1
  101. package/dist/services/crud.service.js +7 -4
  102. package/dist/services/crud.service.js.map +1 -1
  103. package/dist/services/field-metadata.service.d.ts.map +1 -1
  104. package/dist/services/field-metadata.service.js.map +1 -1
  105. package/dist/services/file/disk-file.service.d.ts +0 -2
  106. package/dist/services/file/disk-file.service.d.ts.map +1 -1
  107. package/dist/services/file/disk-file.service.js +7 -16
  108. package/dist/services/file/disk-file.service.js.map +1 -1
  109. package/dist/services/file/index.d.ts +1 -0
  110. package/dist/services/file/index.d.ts.map +1 -1
  111. package/dist/services/file/index.js +1 -0
  112. package/dist/services/file/index.js.map +1 -1
  113. package/dist/services/file/storage-path-builder.d.ts +17 -0
  114. package/dist/services/file/storage-path-builder.d.ts.map +1 -0
  115. package/dist/{seeders/sms-template-seeder.service.js → services/file/storage-path-builder.js} +45 -35
  116. package/dist/services/file/storage-path-builder.js.map +1 -0
  117. package/dist/services/media.service.d.ts +1 -1
  118. package/dist/services/media.service.d.ts.map +1 -1
  119. package/dist/services/media.service.js +45 -6
  120. package/dist/services/media.service.js.map +1 -1
  121. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  122. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  123. package/dist/services/mediaStorageProviders/file-storage-provider.js +46 -7
  124. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  125. package/dist/services/module-metadata.service.d.ts +4 -6
  126. package/dist/services/module-metadata.service.d.ts.map +1 -1
  127. package/dist/services/module-metadata.service.js +16 -14
  128. package/dist/services/module-metadata.service.js.map +1 -1
  129. package/dist/services/setting.service.d.ts +3 -2
  130. package/dist/services/setting.service.d.ts.map +1 -1
  131. package/dist/services/setting.service.js +7 -4
  132. package/dist/services/setting.service.js.map +1 -1
  133. package/dist/services/settings/default-settings-provider.service.d.ts +24 -2
  134. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  135. package/dist/services/settings/default-settings-provider.service.js +8 -6
  136. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  137. package/dist/solid-core.module.d.ts +3 -1
  138. package/dist/solid-core.module.d.ts.map +1 -1
  139. package/dist/solid-core.module.js +45 -9
  140. package/dist/solid-core.module.js.map +1 -1
  141. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  142. package/dist/testing/adapters/ui/playwright-adapter.js +35 -2
  143. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  144. package/package.json +8 -2
  145. package/src/constants/error-messages.ts +1 -0
  146. package/src/constants.ts +3 -3
  147. package/src/controllers/role-metadata.controller.ts +26 -18
  148. package/src/dtos/create-email-template.dto.ts +7 -0
  149. package/src/dtos/create-list-of-values.dto.ts +7 -0
  150. package/src/dtos/create-menu-item-metadata.dto.ts +12 -1
  151. package/src/dtos/create-role-metadata.dto.ts +9 -0
  152. package/src/dtos/create-scheduled-job.dto.ts +14 -0
  153. package/src/dtos/create-security-rule.dto.ts +6 -0
  154. package/src/dtos/create-sms-template.dto.ts +6 -0
  155. package/src/dtos/create-view-metadata.dto.ts +11 -0
  156. package/src/dtos/otp-sign-in.dto.ts +3 -3
  157. package/src/dtos/otp-sign-up.dto.ts +3 -3
  158. package/src/dtos/resolve-s3-url.dto.ts +2 -12
  159. package/src/dtos/sign-up.dto.ts +0 -2
  160. package/src/dtos/update-email-template.dto.ts +6 -0
  161. package/src/dtos/update-list-of-values.dto.ts +8 -0
  162. package/src/dtos/update-menu-item-metadata.dto.ts +12 -0
  163. package/src/dtos/update-scheduled-job.dto.ts +15 -0
  164. package/src/dtos/update-security-rule.dto.ts +7 -0
  165. package/src/dtos/update-sms-template.dto.ts +32 -32
  166. package/src/dtos/update-view-metadata.dto.ts +12 -0
  167. package/src/entities/user.entity.ts +3 -0
  168. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +43 -32
  169. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +45 -33
  170. package/src/helpers/security.helper.ts +1 -1
  171. package/src/index.ts +0 -4
  172. package/src/repository/solid-base.repository.ts +172 -1
  173. package/src/seeders/module-metadata-seeder.service.ts +188 -126
  174. package/src/seeders/permission-metadata-seeder.service.ts +1 -4
  175. package/src/seeders/seed-data/solid-core-metadata.json +12 -25
  176. package/src/services/authentication.service.ts +268 -266
  177. package/src/services/crud-helper.service.ts +79 -36
  178. package/src/services/crud.service.ts +9 -4
  179. package/src/services/field-metadata.service.ts +0 -71
  180. package/src/services/file/disk-file.service.ts +8 -18
  181. package/src/services/file/index.ts +1 -0
  182. package/src/services/file/storage-path-builder.ts +56 -0
  183. package/src/services/media.service.ts +13 -7
  184. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +1 -1
  185. package/src/services/mediaStorageProviders/file-storage-provider.ts +13 -8
  186. package/src/services/module-metadata.service.ts +18 -15
  187. package/src/services/setting.service.ts +5 -3
  188. package/src/services/settings/default-settings-provider.service.ts +5 -3
  189. package/src/solid-core.module.ts +16 -12
  190. package/src/testing/adapters/ui/playwright-adapter.ts +1 -1
  191. package/dist/passport-strategies/local.strategy.d.ts +0 -15
  192. package/dist/passport-strategies/local.strategy.d.ts.map +0 -1
  193. package/dist/passport-strategies/local.strategy.js +0 -44
  194. package/dist/passport-strategies/local.strategy.js.map +0 -1
  195. package/dist/seeders/email-template-seeder.service.d.ts +0 -10
  196. package/dist/seeders/email-template-seeder.service.d.ts.map +0 -1
  197. package/dist/seeders/email-template-seeder.service.js +0 -84
  198. package/dist/seeders/email-template-seeder.service.js.map +0 -1
  199. package/dist/seeders/sms-template-seeder.service.d.ts +0 -10
  200. package/dist/seeders/sms-template-seeder.service.d.ts.map +0 -1
  201. package/dist/seeders/sms-template-seeder.service.js.map +0 -1
  202. package/dist/seeders/user-seeder.service.d.ts +0 -10
  203. package/dist/seeders/user-seeder.service.d.ts.map +0 -1
  204. package/dist/seeders/user-seeder.service.js +0 -44
  205. package/dist/seeders/user-seeder.service.js.map +0 -1
  206. package/src/passport-strategies/local.strategy.ts +0 -28
  207. package/src/seeders/email-template-seeder.service.ts +0 -49
  208. package/src/seeders/sms-template-seeder.service.ts +0 -50
  209. package/src/seeders/user-seeder.service.ts +0 -33
@@ -101,86 +101,100 @@ class CrudHelperService {
101
101
  Object.keys(normalizedFilters).forEach(key => {
102
102
  const primaryFilterObj = normalizedFilters[key];
103
103
  const normalizedPrimaryFilterObj = this.normalizeObjectKeys(primaryFilterObj);
104
+ const [rawField, funcAlias] = key.split(':');
104
105
  const operatorOrField = Object.keys(normalizedPrimaryFilterObj)[0];
105
106
  if (operatorOrField.startsWith('$')) {
106
107
  const operator = operatorOrField;
107
- this.buildOperatorQuery(qb, alias, key, normalizedPrimaryFilterObj, operator);
108
+ let columnExpression;
109
+ if (funcAlias) {
110
+ try {
111
+ columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${rawField}`, funcAlias);
112
+ }
113
+ catch {
114
+ throw new common_1.BadRequestException(`Unsupported field function '${funcAlias}'. Supported functions are: day, week, month, year.`);
115
+ }
116
+ }
117
+ this.buildOperatorQuery(qb, alias, rawField, normalizedPrimaryFilterObj, operator, columnExpression);
108
118
  return;
109
119
  }
110
120
  else {
111
- const joinField = `${alias}.${key}`;
121
+ if (funcAlias) {
122
+ throw new common_1.BadRequestException(`Function alias ':${funcAlias}' is not valid on relation field '${rawField}'. It can only be applied to scalar fields.`);
123
+ }
124
+ const joinField = `${alias}.${rawField}`;
112
125
  if (!this.isRelationJoined(selectQb, joinField))
113
- selectQb.leftJoin(joinField, key);
114
- this.applyFilters(qb, primaryFilterObj, key, selectQb);
126
+ selectQb.leftJoin(joinField, rawField);
127
+ this.applyFilters(qb, primaryFilterObj, rawField, selectQb);
115
128
  }
116
129
  });
117
130
  }
118
131
  }
119
- buildOperatorQuery(qb, alias, field, normalizedPrimaryOperatorObj, operator) {
132
+ buildOperatorQuery(qb, alias, field, normalizedPrimaryOperatorObj, operator, columnExpression) {
120
133
  const uniqueFieldAlias = `${alias}_${field}_${Math.floor(Math.random() * 1000)}`;
134
+ const colExpr = columnExpression ?? `${alias}.${field}`;
121
135
  switch (operator) {
122
136
  case '$eq':
123
- qb.andWhere(`${alias}.${field} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });
137
+ qb.andWhere(`${colExpr} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });
124
138
  break;
125
139
  case '$eqi':
126
- qb.andWhere(`LOWER(${alias}.${field}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eqi.toLowerCase() });
140
+ qb.andWhere(`LOWER(${colExpr}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eqi.toLowerCase() });
127
141
  break;
128
142
  case '$ne':
129
- qb.andWhere(`${alias}.${field} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });
143
+ qb.andWhere(`${colExpr} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });
130
144
  break;
131
145
  case '$nei':
132
- qb.andWhere(`LOWER(${alias}.${field}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$nei.toLowerCase() });
146
+ qb.andWhere(`LOWER(${colExpr}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$nei.toLowerCase() });
133
147
  break;
134
148
  case '$gt':
135
- qb.andWhere(`${alias}.${field} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });
149
+ qb.andWhere(`${colExpr} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });
136
150
  break;
137
151
  case '$gte':
138
- qb.andWhere(`${alias}.${field} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });
152
+ qb.andWhere(`${colExpr} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });
139
153
  break;
140
154
  case '$lt':
141
- qb.andWhere(`${alias}.${field} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });
155
+ qb.andWhere(`${colExpr} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });
142
156
  break;
143
157
  case '$lte':
144
- qb.andWhere(`${alias}.${field} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });
158
+ qb.andWhere(`${colExpr} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });
145
159
  break;
146
160
  case '$in':
147
- qb.andWhere(`${alias}.${field} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });
161
+ qb.andWhere(`${colExpr} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });
148
162
  break;
149
163
  case '$notIn':
150
- qb.andWhere(`${alias}.${field} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });
164
+ qb.andWhere(`${colExpr} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });
151
165
  break;
152
166
  case '$contains':
153
- qb.andWhere(`${alias}.${field} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });
167
+ qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });
154
168
  break;
155
169
  case '$notContains':
156
- qb.andWhere(`${alias}.${field} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });
170
+ qb.andWhere(`${colExpr} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });
157
171
  break;
158
172
  case '$containsi':
159
- qb.andWhere(`LOWER(${alias}.${field}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$containsi.toLowerCase()}%` });
173
+ qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$containsi.toLowerCase()}%` });
160
174
  break;
161
175
  case '$notContainsi':
162
- qb.andWhere(`LOWER(${alias}.${field}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContainsi.toLowerCase()}%` });
176
+ qb.andWhere(`LOWER(${colExpr}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContainsi.toLowerCase()}%` });
163
177
  break;
164
178
  case '$null':
165
- qb.andWhere(`${alias}.${field} IS NULL`);
179
+ qb.andWhere(`${colExpr} IS NULL`);
166
180
  break;
167
181
  case '$notNull':
168
- qb.andWhere(`${alias}.${field} IS NOT NULL`);
182
+ qb.andWhere(`${colExpr} IS NOT NULL`);
169
183
  break;
170
184
  case '$between':
171
- qb.andWhere(`${alias}.${field} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });
185
+ qb.andWhere(`${colExpr} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });
172
186
  break;
173
187
  case '$startsWith':
174
- qb.andWhere(`${alias}.${field} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });
188
+ qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });
175
189
  break;
176
190
  case '$startsWithi':
177
- qb.andWhere(`LOWER(${alias}.${field}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWithi.toLowerCase()}%` });
191
+ qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWithi.toLowerCase()}%` });
178
192
  break;
179
193
  case '$endsWith':
180
- qb.andWhere(`${alias}.${field} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });
194
+ qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });
181
195
  break;
182
196
  case '$endsWithi':
183
- qb.andWhere(`LOWER(${alias}.${field}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWithi.toLowerCase()}` });
197
+ qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWithi.toLowerCase()}` });
184
198
  break;
185
199
  default:
186
200
  throw new Error(`Operator ${operator} is not supported`);
@@ -552,21 +566,39 @@ class CrudHelperService {
552
566
  return value;
553
567
  }
554
568
  }
555
- getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap) {
556
- const orderedValues = groupByFields
569
+ getGroupFieldValues(group, groupByFields, groupAliasMap) {
570
+ return groupByFields
557
571
  .map(field => {
572
+ const parts = field.split(':');
573
+ const granularity = parts[1];
558
574
  const alias = groupAliasMap[field] ?? this.sanitizeAlias(field.replace(/\./g, '_'));
559
575
  const rawVal = group[alias] ?? group[field] ?? group[field.replace(/\./g, '_')];
560
- return this.formatGroupValue(rawVal, groupFormatMap[alias]);
576
+ return { rawVal, alias, granularity };
561
577
  })
562
- .filter(v => v !== undefined && v !== null);
563
- if (orderedValues.length === 0) {
578
+ .filter(({ rawVal }) => rawVal !== undefined && rawVal !== null);
579
+ }
580
+ normalizeGroupValue(value, granularity) {
581
+ if (!granularity)
582
+ return value;
583
+ return this.formatGroupValue(value, 'YYYY-MM-DD');
584
+ }
585
+ getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap) {
586
+ const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);
587
+ if (fieldValues.length === 0) {
564
588
  return Object.keys(group)
565
589
  .filter(key => !this.isAggregateFieldKey(key, aggregateAliases))
566
590
  .map(key => group[key])
567
591
  .join('_');
568
592
  }
569
- return orderedValues.join('_');
593
+ return fieldValues
594
+ .map(({ rawVal, alias }) => this.formatGroupValue(rawVal, groupFormatMap[alias]))
595
+ .join('_');
596
+ }
597
+ getGroupValue(group, groupByFields, groupAliasMap) {
598
+ const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);
599
+ if (fieldValues.length === 1)
600
+ return this.normalizeGroupValue(fieldValues[0].rawVal, fieldValues[0].granularity);
601
+ return fieldValues.map(({ rawVal, granularity }) => this.normalizeGroupValue(rawVal, granularity)).join('_');
570
602
  }
571
603
  createGroupRecords(group, aggregateAliases, groupData, groupByFields, groupAliasMap, groupFormatMap) {
572
604
  const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);
@@ -577,6 +609,7 @@ class CrudHelperService {
577
609
  }
578
610
  createGroupMeta(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap) {
579
611
  const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);
612
+ const groupValue = this.getGroupValue(group, groupByFields, groupAliasMap);
580
613
  const groupAggregateValues = {};
581
614
  for (const key in group) {
582
615
  if (group.hasOwnProperty(key) && this.isAggregateFieldKey(key, aggregateAliases)) {
@@ -586,6 +619,7 @@ class CrudHelperService {
586
619
  }
587
620
  return {
588
621
  groupName,
622
+ groupValue,
589
623
  ...groupAggregateValues
590
624
  };
591
625
  }
@@ -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, SelectQueryBuilder, WhereExpressionBuilder } from \"typeorm\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { classify } from \"@angular-devkit/core/src/utils/strings\";\nimport { ActiveUserData } from \"src/interfaces/active-user-data.interface\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { Logger } from \"@nestjs/common\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\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\nexport class CrudHelperService {\n constructor(\n ) { }\n private readonly logger = new Logger(CrudHelperService.name);\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 = this.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 = this.normalizeObjectKeys(primaryFilterObj);\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 this.buildOperatorQuery(qb, alias, key, normalizedPrimaryFilterObj, operator);\n return;\n }\n else { // Recursively call the applyFilters method to handle nested conditions\n const joinField = `${alias}.${key}`;\n if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, key);\n this.applyFilters(qb, primaryFilterObj, key, selectQb);\n }\n });\n }\n }\n\n private buildOperatorQuery(qb: any, alias: string, field: string, normalizedPrimaryOperatorObj: any, operator: string) {\n const uniqueFieldAlias = `${alias}_${field}_${Math.floor(Math.random() * 1000)}`;\n switch (operator) {\n case '$eq':\n qb.andWhere(`${alias}.${field} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });\n break;\n case '$eqi':\n qb.andWhere(`LOWER(${alias}.${field}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eqi.toLowerCase() });\n break;\n case '$ne':\n qb.andWhere(`${alias}.${field} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });\n break;\n case '$nei':\n qb.andWhere(`LOWER(${alias}.${field}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$nei.toLowerCase() });\n break;\n case '$gt':\n qb.andWhere(`${alias}.${field} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });\n break;\n case '$gte':\n qb.andWhere(`${alias}.${field} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });\n break;\n case '$lt':\n qb.andWhere(`${alias}.${field} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });\n break;\n case '$lte':\n qb.andWhere(`${alias}.${field} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });\n break;\n case '$in':\n qb.andWhere(`${alias}.${field} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });\n break;\n case '$notIn':\n qb.andWhere(`${alias}.${field} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });\n break;\n case '$contains':\n qb.andWhere(`${alias}.${field} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });\n break;\n case '$notContains':\n qb.andWhere(`${alias}.${field} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });\n break;\n case '$containsi':\n qb.andWhere(`LOWER(${alias}.${field}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$containsi.toLowerCase()}%` });\n break;\n case '$notContainsi':\n qb.andWhere(`LOWER(${alias}.${field}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContainsi.toLowerCase()}%` });\n break;\n case '$null':\n qb.andWhere(`${alias}.${field} IS NULL`);\n break;\n case '$notNull':\n qb.andWhere(`${alias}.${field} IS NOT NULL`);\n break;\n case '$between':\n qb.andWhere(`${alias}.${field} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });\n break;\n case '$startsWith':\n qb.andWhere(`${alias}.${field} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });\n break;\n case '$startsWithi':\n qb.andWhere(`LOWER(${alias}.${field}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWithi.toLowerCase()}%` });\n break;\n case '$endsWith':\n qb.andWhere(`${alias}.${field} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });\n break;\n case '$endsWithi':\n qb.andWhere(`LOWER(${alias}.${field}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWithi.toLowerCase()}` });\n break;\n default:\n throw new Error(`Operator ${operator} is not supported`);\n }\n }\n\n // Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq\n private normalizeObjectKeys(obj: any): any {\n return Object.keys(obj).reduce((acc, key) => {\n // Transform the key by removing surrounding brackets\n const newKey = key.replace(/^\\[(.*)\\]$/, '$1');\n // Assign the value to the transformed key in the accumulator object\n acc[newKey] = obj[key];\n return acc;\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, status } = 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 let finalLocale = locale\n if (internationalisation) {\n // If locale is not provided in the filter dto, then assume it is the default locale to be used. \n if (!finalLocale) {\n //Get default locale from registry\n const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });\n const defaultLocale = solidRegistry.getDefaultLocale();\n if(defaultLocale){\n finalLocale = defaultLocale.locale;\n }else{\n finalLocale = 'en';\n }\n }\n qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });\n }\n\n if (draftPublishWorkflow && status) {\n if (basicFilterDto.status === 'published') {\n qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);\n } else if (basicFilterDto.status === 'draft') {\n qb.andWhere(`${entityAlias}.publishedAt IS NULL`);\n }\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(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 orderOptionKeys.forEach((key) => {\n const value = orderOptions[key] as 'ASC' | 'DESC';\n qb.addOrderBy(`${entityAlias}.${key}`, value);\n });\n }\n }\n\n\n if (showSoftDeleted === 'inclusive') {\n qb.withDeleted();\n }\n\n if (showSoftDeleted === 'exclusive') {\n qb.withDeleted();\n qb.where(`${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 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 for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[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 }\n parentAlias = joinAlias;\n }\n return { alias: parentAlias, property: pathParts[pathParts.length - 1] };\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 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 const resolvedKey = aliasMap[key] || key as string;\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 let parentAlias = entityAlias;\n relationParts.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 = relationParts.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 parentAlias = part; // Update the parent alias for the next iteration\n });\n return qb;\n }\n\n private wrapFieldWithAlias(field: string, entityAlias: string): string {\n if (!this.isAggregateField(field)) return `${entityAlias}.${field}`;\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];\n const fieldName = fieldParts[1].replace(')', '');\n return `${aggregateFunction}(${entityAlias}.${fieldName})`;\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 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 orderedValues = groupByFields\n .map(field => {\n const alias = groupAliasMap[field] ?? this.sanitizeAlias(field.replace(/\\./g, '_'));\n const rawVal = group[alias] ?? group[field] ?? group[field.replace(/\\./g, '_')];\n return this.formatGroupValue(rawVal, groupFormatMap[alias]);\n })\n .filter(v => v !== undefined && v !== null);\n\n if (orderedValues.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 orderedValues.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 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 ...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\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, SelectQueryBuilder, WhereExpressionBuilder } from \"typeorm\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { classify } from \"@angular-devkit/core/src/utils/strings\";\nimport { ActiveUserData } from \"src/interfaces/active-user-data.interface\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { BadRequestException, Logger } from \"@nestjs/common\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\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\nexport class CrudHelperService {\n constructor(\n ) { }\n private readonly logger = new Logger(CrudHelperService.name);\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 = this.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 = this.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 let columnExpression: string | undefined;\n if (funcAlias) {\n try {\n columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${rawField}`, funcAlias);\n } catch {\n throw new BadRequestException(`Unsupported field function '${funcAlias}'. Supported functions are: day, week, month, year.`);\n }\n }\n this.buildOperatorQuery(qb, alias, rawField, 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 const joinField = `${alias}.${rawField}`;\n if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, rawField);\n this.applyFilters(qb, primaryFilterObj, rawField, 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 qb.andWhere(`LOWER(${colExpr}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eqi.toLowerCase() });\n break;\n case '$ne':\n qb.andWhere(`${colExpr} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });\n break;\n case '$nei':\n qb.andWhere(`LOWER(${colExpr}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$nei.toLowerCase() });\n break;\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 qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$containsi.toLowerCase()}%` });\n break;\n case '$notContainsi':\n qb.andWhere(`LOWER(${colExpr}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContainsi.toLowerCase()}%` });\n break;\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 qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWithi.toLowerCase()}%` });\n break;\n case '$endsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });\n break;\n case '$endsWithi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWithi.toLowerCase()}` });\n break;\n default:\n throw new Error(`Operator ${operator} is not supported`);\n }\n }\n\n // Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq\n private normalizeObjectKeys(obj: any): any {\n return Object.keys(obj).reduce((acc, key) => {\n // Transform the key by removing surrounding brackets\n const newKey = key.replace(/^\\[(.*)\\]$/, '$1');\n // Assign the value to the transformed key in the accumulator object\n acc[newKey] = obj[key];\n return acc;\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, status } = 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 let finalLocale = locale\n if (internationalisation) {\n // If locale is not provided in the filter dto, then assume it is the default locale to be used. \n if (!finalLocale) {\n //Get default locale from registry\n const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });\n const defaultLocale = solidRegistry.getDefaultLocale();\n if(defaultLocale){\n finalLocale = defaultLocale.locale;\n }else{\n finalLocale = 'en';\n }\n }\n qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });\n }\n\n if (draftPublishWorkflow && status) {\n if (basicFilterDto.status === 'published') {\n qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);\n } else if (basicFilterDto.status === 'draft') {\n qb.andWhere(`${entityAlias}.publishedAt IS NULL`);\n }\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(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 orderOptionKeys.forEach((key) => {\n const value = orderOptions[key] as 'ASC' | 'DESC';\n qb.addOrderBy(`${entityAlias}.${key}`, value);\n });\n }\n }\n\n\n if (showSoftDeleted === 'inclusive') {\n qb.withDeleted();\n }\n\n if (showSoftDeleted === 'exclusive') {\n qb.withDeleted();\n qb.where(`${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 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 for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[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 }\n parentAlias = joinAlias;\n }\n return { alias: parentAlias, property: pathParts[pathParts.length - 1] };\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 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 const resolvedKey = aliasMap[key] || key as string;\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 let parentAlias = entityAlias;\n relationParts.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 = relationParts.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 parentAlias = part; // Update the parent alias for the next iteration\n });\n return qb;\n }\n\n private wrapFieldWithAlias(field: string, entityAlias: string): string {\n if (!this.isAggregateField(field)) return `${entityAlias}.${field}`;\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];\n const fieldName = fieldParts[1].replace(')', '');\n return `${aggregateFunction}(${entityAlias}.${fieldName})`;\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\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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"}
@@ -98,8 +98,8 @@ class CRUDService {
98
98
  module: true,
99
99
  });
100
100
  }
101
- async validateAndTransformDto(field, dto, files, hasMediaFields, isPartialUpdate = false, isUpdate = false) {
102
- const fieldManager = await this.fieldCrudManager(field, this.entityManager, isPartialUpdate, isUpdate);
101
+ async validateAndTransformDto(field, dto, files, hasMediaFields, isPartialUpdate = false, isUpdate = false, entityId) {
102
+ const fieldManager = await this.fieldCrudManager(field, this.entityManager, isPartialUpdate, isUpdate, entityId);
103
103
  const validationErrors = fieldManager.validate(dto, files);
104
104
  const errors = (validationErrors instanceof Promise) ? await validationErrors : validationErrors;
105
105
  if (errors.length > 0) {
@@ -148,7 +148,7 @@ class CRUDService {
148
148
  let hasMediaFields = false;
149
149
  const fieldsToProcess = [...model.fields];
150
150
  for (const field of fieldsToProcess) {
151
- const transformed = await this.validateAndTransformDto(field, updateDto, files, hasMediaFields, isPartialUpdate, isUpdate);
151
+ const transformed = await this.validateAndTransformDto(field, updateDto, files, hasMediaFields, isPartialUpdate, isUpdate, id);
152
152
  updateDto = transformed.dto;
153
153
  hasMediaFields = transformed.hasMediaFields;
154
154
  }
@@ -209,7 +209,7 @@ class CRUDService {
209
209
  return this.repo.remove(entity);
210
210
  }
211
211
  }
212
- async fieldCrudManager(fieldMetadata, entityManager, isPartialUpdate = false, isUpdate = false) {
212
+ async fieldCrudManager(fieldMetadata, entityManager, isPartialUpdate = false, isUpdate = false, entityId) {
213
213
  const commonOptions = { required: fieldMetadata.required && !isPartialUpdate, fieldName: fieldMetadata.name, isUpdate };
214
214
  switch (fieldMetadata.type) {
215
215
  case create_field_metadata_dto_1.SolidFieldType.shortText: {
@@ -287,6 +287,7 @@ class CRUDService {
287
287
  entityManager,
288
288
  inverseFieldName: fieldMetadata.relationCoModelFieldName,
289
289
  inverseRelationCoModelFieldName: fieldMetadata.name,
290
+ entityId,
290
291
  };
291
292
  return new OneToManyRelationFieldCrudManager_1.OneToManyRelationFieldCrudManager(oneToManyOptions);
292
293
  }
@@ -299,6 +300,7 @@ class CRUDService {
299
300
  isInverseSide: false,
300
301
  entityManager,
301
302
  fieldName: fieldMetadata.name,
303
+ entityId,
302
304
  };
303
305
  return new ManyToManyRelationFieldCrudManager_1.ManyToManyRelationFieldCrudManager(manyToManyOptions);
304
306
  }
@@ -311,6 +313,7 @@ class CRUDService {
311
313
  entityManager,
312
314
  fieldName: fieldMetadata.relationCoModelFieldName,
313
315
  relationCoModelFieldName: fieldMetadata.name,
316
+ entityId,
314
317
  };
315
318
  return new ManyToManyRelationFieldCrudManager_1.ManyToManyRelationFieldCrudManager(inverseManyToManyOptions);
316
319
  }