@solidstarters/solid-core 1.2.200 → 1.2.202

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 (527) hide show
  1. package/dist/commands/fixtures/fixtures-setup.command.d.ts +15 -0
  2. package/dist/commands/fixtures/fixtures-setup.command.d.ts.map +1 -0
  3. package/dist/commands/fixtures/fixtures-setup.command.js +58 -0
  4. package/dist/commands/fixtures/fixtures-setup.command.js.map +1 -0
  5. package/dist/commands/fixtures/fixtures-tear-down.command.d.ts +16 -0
  6. package/dist/commands/fixtures/fixtures-tear-down.command.d.ts.map +1 -0
  7. package/dist/commands/fixtures/fixtures-tear-down.command.js +59 -0
  8. package/dist/commands/fixtures/fixtures-tear-down.command.js.map +1 -0
  9. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  10. package/dist/commands/refresh-model.command.js +4 -0
  11. package/dist/commands/refresh-model.command.js.map +1 -1
  12. package/dist/config/cache.options.d.ts +1 -1
  13. package/dist/config/cache.options.d.ts.map +1 -1
  14. package/dist/config/cache.options.js +2 -2
  15. package/dist/config/cache.options.js.map +1 -1
  16. package/dist/config/iam.config.d.ts +4 -0
  17. package/dist/config/iam.config.d.ts.map +1 -1
  18. package/dist/config/iam.config.js +2 -0
  19. package/dist/config/iam.config.js.map +1 -1
  20. package/dist/constants/error-messages.d.ts +2 -0
  21. package/dist/constants/error-messages.d.ts.map +1 -1
  22. package/dist/constants/error-messages.js +4 -0
  23. package/dist/constants/error-messages.js.map +1 -1
  24. package/dist/controllers/model-metadata.controller.d.ts +25 -0
  25. package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
  26. package/dist/controllers/model-metadata.controller.js +23 -0
  27. package/dist/controllers/model-metadata.controller.js.map +1 -1
  28. package/dist/controllers/model-sequence.controller.d.ts +43 -0
  29. package/dist/controllers/model-sequence.controller.d.ts.map +1 -0
  30. package/dist/controllers/model-sequence.controller.js +179 -0
  31. package/dist/controllers/model-sequence.controller.js.map +1 -0
  32. package/dist/controllers/setting.controller.d.ts +2 -2
  33. package/dist/controllers/setting.controller.d.ts.map +1 -1
  34. package/dist/controllers/setting.controller.js +36 -42
  35. package/dist/controllers/setting.controller.js.map +1 -1
  36. package/dist/decorators/sms-provider.decorator.d.ts +3 -0
  37. package/dist/decorators/sms-provider.decorator.d.ts.map +1 -0
  38. package/dist/decorators/sms-provider.decorator.js +11 -0
  39. package/dist/decorators/sms-provider.decorator.js.map +1 -0
  40. package/dist/dtos/basic-filters.dto.d.ts +3 -1
  41. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  42. package/dist/dtos/basic-filters.dto.js +8 -2
  43. package/dist/dtos/basic-filters.dto.js.map +1 -1
  44. package/dist/dtos/basic-group-filters.dto.d.ts +6 -0
  45. package/dist/dtos/basic-group-filters.dto.d.ts.map +1 -0
  46. package/dist/dtos/basic-group-filters.dto.js +46 -0
  47. package/dist/dtos/basic-group-filters.dto.js.map +1 -0
  48. package/dist/dtos/create-field-metadata.dto.js +2 -2
  49. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  50. package/dist/dtos/create-model-sequence.dto.d.ts +14 -0
  51. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -0
  52. package/dist/dtos/create-model-sequence.dto.js +90 -0
  53. package/dist/dtos/create-model-sequence.dto.js.map +1 -0
  54. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  55. package/dist/dtos/create-role-metadata.dto.js +1 -0
  56. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  57. package/dist/dtos/get-mcp-url.dto.d.ts +5 -0
  58. package/dist/dtos/get-mcp-url.dto.d.ts.map +1 -0
  59. package/dist/dtos/get-mcp-url.dto.js +31 -0
  60. package/dist/dtos/get-mcp-url.dto.js.map +1 -0
  61. package/dist/dtos/navigation.dto.d.ts +6 -0
  62. package/dist/dtos/navigation.dto.d.ts.map +1 -0
  63. package/dist/dtos/navigation.dto.js +33 -0
  64. package/dist/dtos/navigation.dto.js.map +1 -0
  65. package/dist/dtos/resolve-s3-url.dto.d.ts +5 -5
  66. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  67. package/dist/dtos/resolve-s3-url.dto.js +7 -7
  68. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  69. package/dist/dtos/sign-in.dto.js +3 -3
  70. package/dist/dtos/sign-in.dto.js.map +1 -1
  71. package/dist/dtos/update-model-sequence.dto.d.ts +15 -0
  72. package/dist/dtos/update-model-sequence.dto.d.ts.map +1 -0
  73. package/dist/dtos/update-model-sequence.dto.js +94 -0
  74. package/dist/dtos/update-model-sequence.dto.js.map +1 -0
  75. package/dist/entities/common.entity.d.ts.map +1 -1
  76. package/dist/entities/common.entity.js +6 -4
  77. package/dist/entities/common.entity.js.map +1 -1
  78. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  79. package/dist/entities/field-metadata.entity.js +2 -1
  80. package/dist/entities/field-metadata.entity.js.map +1 -1
  81. package/dist/entities/legacy-common.entity.d.ts.map +1 -1
  82. package/dist/entities/legacy-common.entity.js +6 -4
  83. package/dist/entities/legacy-common.entity.js.map +1 -1
  84. package/dist/entities/model-metadata.entity.d.ts.map +1 -1
  85. package/dist/entities/model-metadata.entity.js +5 -1
  86. package/dist/entities/model-metadata.entity.js.map +1 -1
  87. package/dist/entities/model-sequence.entity.d.ts +15 -0
  88. package/dist/entities/model-sequence.entity.d.ts.map +1 -0
  89. package/dist/entities/model-sequence.entity.js +67 -0
  90. package/dist/entities/model-sequence.entity.js.map +1 -0
  91. package/dist/factories/mail.factory.d.ts.map +1 -1
  92. package/dist/factories/mail.factory.js.map +1 -1
  93. package/dist/factories/sms.factory.d.ts +14 -0
  94. package/dist/factories/sms.factory.d.ts.map +1 -0
  95. package/dist/factories/sms.factory.js +53 -0
  96. package/dist/factories/sms.factory.js.map +1 -0
  97. package/dist/helpers/date.helper.d.ts.map +1 -1
  98. package/dist/helpers/date.helper.js +13 -4
  99. package/dist/helpers/date.helper.js.map +1 -1
  100. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.d.ts.map +1 -1
  101. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js +13 -2
  102. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  103. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +0 -1
  104. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  105. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +4 -9
  106. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  107. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts +0 -1
  108. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts.map +1 -1
  109. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js +7 -8
  110. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js.map +1 -1
  111. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +0 -1
  112. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  113. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +4 -9
  114. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  115. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  116. package/dist/helpers/model-metadata-helper.service.js +6 -2
  117. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  118. package/dist/helpers/module-metadata-helper.service.d.ts +1 -0
  119. package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
  120. package/dist/helpers/module-metadata-helper.service.js +9 -0
  121. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  122. package/dist/helpers/module.helper.d.ts +1 -0
  123. package/dist/helpers/module.helper.d.ts.map +1 -1
  124. package/dist/helpers/module.helper.js +29 -3
  125. package/dist/helpers/module.helper.js.map +1 -1
  126. package/dist/helpers/solid-registry.d.ts +14 -0
  127. package/dist/helpers/solid-registry.d.ts.map +1 -1
  128. package/dist/helpers/solid-registry.js +7 -0
  129. package/dist/helpers/solid-registry.js.map +1 -1
  130. package/dist/index.d.ts +12 -7
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +13 -8
  133. package/dist/index.js.map +1 -1
  134. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts +1 -0
  135. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -1
  136. package/dist/jobs/computed-field-evaluation-subscriber.service.js +16 -4
  137. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -1
  138. package/dist/jobs/database/{sms-publisher-database.service.d.ts → msg91-sms-publisher-database.service.d.ts} +2 -2
  139. package/dist/jobs/database/msg91-sms-publisher-database.service.d.ts.map +1 -0
  140. package/dist/jobs/database/{sms-publisher-database.service.js → msg91-sms-publisher-database.service.js} +8 -8
  141. package/dist/jobs/database/msg91-sms-publisher-database.service.js.map +1 -0
  142. package/dist/jobs/database/{sms-queue-database-options.d.ts → msg91-sms-queue-database-options.d.ts} +1 -1
  143. package/dist/jobs/database/msg91-sms-queue-database-options.d.ts.map +1 -0
  144. package/dist/jobs/database/{sms-queue-database-options.js → msg91-sms-queue-database-options.js} +1 -1
  145. package/dist/jobs/database/msg91-sms-queue-database-options.js.map +1 -0
  146. package/dist/jobs/database/{sms-subscriber-database.service.d.ts → msg91-sms-subscriber-database.service.d.ts} +5 -5
  147. package/dist/jobs/database/msg91-sms-subscriber-database.service.d.ts.map +1 -0
  148. package/dist/jobs/database/{sms-subscriber-database.service.js → msg91-sms-subscriber-database.service.js} +14 -12
  149. package/dist/jobs/database/msg91-sms-subscriber-database.service.js.map +1 -0
  150. package/dist/jobs/database/otp-subscriber-database.service.d.ts +4 -4
  151. package/dist/jobs/database/otp-subscriber-database.service.d.ts.map +1 -1
  152. package/dist/jobs/database/otp-subscriber-database.service.js +6 -4
  153. package/dist/jobs/database/otp-subscriber-database.service.js.map +1 -1
  154. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts +3 -3
  155. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts.map +1 -1
  156. package/dist/jobs/database/twilio-sms-subscriber-database.service.js +6 -4
  157. package/dist/jobs/database/twilio-sms-subscriber-database.service.js.map +1 -1
  158. package/dist/jobs/{sms-publisher.service.d.ts → msg91-otp-publisher.service.d.ts} +2 -2
  159. package/dist/jobs/msg91-otp-publisher.service.d.ts.map +1 -0
  160. package/dist/jobs/{sms-publisher.service.js → msg91-otp-publisher.service.js} +8 -8
  161. package/dist/jobs/msg91-otp-publisher.service.js.map +1 -0
  162. package/dist/jobs/{sms-queue-options.d.ts → msg91-otp-queue-options.d.ts} +1 -1
  163. package/dist/jobs/msg91-otp-queue-options.d.ts.map +1 -0
  164. package/dist/jobs/{otp-queue-options.js → msg91-otp-queue-options.js} +1 -1
  165. package/dist/jobs/msg91-otp-queue-options.js.map +1 -0
  166. package/dist/jobs/{sms-subscriber.service.d.ts → msg91-otp-subscriber.service.d.ts} +6 -6
  167. package/dist/jobs/msg91-otp-subscriber.service.d.ts.map +1 -0
  168. package/dist/jobs/{otp-subscriber.service.js → msg91-otp-subscriber.service.js} +14 -12
  169. package/dist/jobs/msg91-otp-subscriber.service.js.map +1 -0
  170. package/dist/jobs/{otp-publisher.service.d.ts → msg91-sms-publisher.service.d.ts} +2 -2
  171. package/dist/jobs/msg91-sms-publisher.service.d.ts.map +1 -0
  172. package/dist/jobs/{otp-publisher.service.js → msg91-sms-publisher.service.js} +8 -8
  173. package/dist/jobs/msg91-sms-publisher.service.js.map +1 -0
  174. package/dist/jobs/{otp-queue-options.d.ts → msg91-sms-queue-options.d.ts} +1 -1
  175. package/dist/jobs/msg91-sms-queue-options.d.ts.map +1 -0
  176. package/dist/jobs/{sms-queue-options.js → msg91-sms-queue-options.js} +1 -1
  177. package/dist/jobs/msg91-sms-queue-options.js.map +1 -0
  178. package/dist/jobs/{otp-subscriber.service.d.ts → msg91-sms-subscriber.service.d.ts} +7 -7
  179. package/dist/jobs/msg91-sms-subscriber.service.d.ts.map +1 -0
  180. package/dist/jobs/{sms-subscriber.service.js → msg91-sms-subscriber.service.js} +14 -12
  181. package/dist/jobs/msg91-sms-subscriber.service.js.map +1 -0
  182. package/dist/jobs/twilio-sms-subscriber.service.d.ts +3 -3
  183. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -1
  184. package/dist/jobs/twilio-sms-subscriber.service.js +6 -4
  185. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -1
  186. package/dist/repository/media.repository.d.ts.map +1 -1
  187. package/dist/repository/media.repository.js +4 -0
  188. package/dist/repository/media.repository.js.map +1 -1
  189. package/dist/repository/model-sequence.repository.d.ts +14 -0
  190. package/dist/repository/model-sequence.repository.d.ts.map +1 -0
  191. package/dist/repository/model-sequence.repository.js +103 -0
  192. package/dist/repository/model-sequence.repository.js.map +1 -0
  193. package/dist/seeders/module-metadata-seeder.service.d.ts +7 -12
  194. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  195. package/dist/seeders/module-metadata-seeder.service.js +87 -27
  196. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  197. package/dist/seeders/seed-data/solid-core-metadata.json +373 -52
  198. package/dist/seeders/system-fields-seeder.service.d.ts +1 -0
  199. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  200. package/dist/seeders/system-fields-seeder.service.js +11 -2
  201. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  202. package/dist/seeders/user-seeder.service.d.ts.map +1 -1
  203. package/dist/seeders/user-seeder.service.js +5 -4
  204. package/dist/seeders/user-seeder.service.js.map +1 -1
  205. package/dist/services/action-metadata.service.d.ts.map +1 -1
  206. package/dist/services/action-metadata.service.js +1 -0
  207. package/dist/services/action-metadata.service.js.map +1 -1
  208. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  209. package/dist/services/ai-interaction.service.js +1 -0
  210. package/dist/services/ai-interaction.service.js.map +1 -1
  211. package/dist/services/authentication.service.d.ts +6 -3
  212. package/dist/services/authentication.service.d.ts.map +1 -1
  213. package/dist/services/authentication.service.js +70 -27
  214. package/dist/services/authentication.service.js.map +1 -1
  215. package/dist/services/chatter-message-details.service.d.ts.map +1 -1
  216. package/dist/services/chatter-message-details.service.js +1 -0
  217. package/dist/services/chatter-message-details.service.js.map +1 -1
  218. package/dist/services/chatter-message.service.d.ts.map +1 -1
  219. package/dist/services/chatter-message.service.js +7 -3
  220. package/dist/services/chatter-message.service.js.map +1 -1
  221. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
  222. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  223. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +15 -0
  224. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -0
  225. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +72 -0
  226. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -0
  227. package/dist/services/crud-helper.service.d.ts +23 -6
  228. package/dist/services/crud-helper.service.d.ts.map +1 -1
  229. package/dist/services/crud-helper.service.js +257 -45
  230. package/dist/services/crud-helper.service.js.map +1 -1
  231. package/dist/services/crud.service.d.ts +4 -3
  232. package/dist/services/crud.service.d.ts.map +1 -1
  233. package/dist/services/crud.service.js +53 -24
  234. package/dist/services/crud.service.js.map +1 -1
  235. package/dist/services/database/database-bootstrap.service.d.ts +12 -0
  236. package/dist/services/database/database-bootstrap.service.d.ts.map +1 -0
  237. package/dist/services/database/database-bootstrap.service.js +115 -0
  238. package/dist/services/database/database-bootstrap.service.js.map +1 -0
  239. package/dist/services/email-template.service.d.ts +7 -7
  240. package/dist/services/email-template.service.d.ts.map +1 -1
  241. package/dist/services/email-template.service.js +8 -7
  242. package/dist/services/email-template.service.js.map +1 -1
  243. package/dist/services/excel.service.d.ts +11 -0
  244. package/dist/services/excel.service.d.ts.map +1 -1
  245. package/dist/services/excel.service.js +104 -0
  246. package/dist/services/excel.service.js.map +1 -1
  247. package/dist/services/field-metadata.service.d.ts +4 -1
  248. package/dist/services/field-metadata.service.d.ts.map +1 -1
  249. package/dist/services/field-metadata.service.js +35 -30
  250. package/dist/services/field-metadata.service.js.map +1 -1
  251. package/dist/services/file.service.d.ts +1 -0
  252. package/dist/services/file.service.d.ts.map +1 -1
  253. package/dist/services/file.service.js +9 -0
  254. package/dist/services/file.service.js.map +1 -1
  255. package/dist/services/fixtures.service.d.ts +13 -0
  256. package/dist/services/fixtures.service.d.ts.map +1 -0
  257. package/dist/services/fixtures.service.js +95 -0
  258. package/dist/services/fixtures.service.js.map +1 -0
  259. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  260. package/dist/services/genai/ingest-metadata.service.js +1 -1
  261. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  262. package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
  263. package/dist/services/import-transaction-error-log.service.js +1 -0
  264. package/dist/services/import-transaction-error-log.service.js.map +1 -1
  265. package/dist/services/import-transaction.service.d.ts.map +1 -1
  266. package/dist/services/import-transaction.service.js +7 -1
  267. package/dist/services/import-transaction.service.js.map +1 -1
  268. package/dist/services/list-of-values.service.d.ts +2 -2
  269. package/dist/services/list-of-values.service.d.ts.map +1 -1
  270. package/dist/services/list-of-values.service.js +2 -1
  271. package/dist/services/list-of-values.service.js.map +1 -1
  272. package/dist/services/locale.service.d.ts.map +1 -1
  273. package/dist/services/locale.service.js +1 -0
  274. package/dist/services/locale.service.js.map +1 -1
  275. package/dist/services/mail/smtp-email.service.js +0 -1
  276. package/dist/services/mail/smtp-email.service.js.map +1 -1
  277. package/dist/services/media.service.d.ts +3 -3
  278. package/dist/services/media.service.d.ts.map +1 -1
  279. package/dist/services/media.service.js +6 -4
  280. package/dist/services/media.service.js.map +1 -1
  281. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  282. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +17 -6
  283. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  284. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  285. package/dist/services/mediaStorageProviders/file-storage-provider.js +0 -13
  286. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  287. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  288. package/dist/services/menu-item-metadata.service.js +4 -0
  289. package/dist/services/menu-item-metadata.service.js.map +1 -1
  290. package/dist/services/model-metadata.service.d.ts +28 -1
  291. package/dist/services/model-metadata.service.d.ts.map +1 -1
  292. package/dist/services/model-metadata.service.js +111 -44
  293. package/dist/services/model-metadata.service.js.map +1 -1
  294. package/dist/services/model-sequence.service.d.ts +23 -0
  295. package/dist/services/model-sequence.service.d.ts.map +1 -0
  296. package/dist/services/model-sequence.service.js +55 -0
  297. package/dist/services/model-sequence.service.js.map +1 -0
  298. package/dist/services/module-metadata.service.d.ts +1 -0
  299. package/dist/services/module-metadata.service.d.ts.map +1 -1
  300. package/dist/services/module-metadata.service.js +35 -1
  301. package/dist/services/module-metadata.service.js.map +1 -1
  302. package/dist/services/permission-metadata.service.d.ts +5 -5
  303. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  304. package/dist/services/permission-metadata.service.js +6 -5
  305. package/dist/services/permission-metadata.service.js.map +1 -1
  306. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  307. package/dist/services/queues/database-subscriber.service.js +2 -1
  308. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  309. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  310. package/dist/services/queues/rabbitmq-subscriber.service.js +2 -2
  311. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  312. package/dist/services/role-metadata.service.d.ts.map +1 -1
  313. package/dist/services/role-metadata.service.js +1 -0
  314. package/dist/services/role-metadata.service.js.map +1 -1
  315. package/dist/services/scheduled-job.service.d.ts +6 -6
  316. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  317. package/dist/services/scheduled-job.service.js +8 -8
  318. package/dist/services/scheduled-job.service.js.map +1 -1
  319. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  320. package/dist/services/scheduled-jobs/scheduler.service.js +4 -0
  321. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  322. package/dist/services/security-rule.service.d.ts.map +1 -1
  323. package/dist/services/security-rule.service.js +1 -0
  324. package/dist/services/security-rule.service.js.map +1 -1
  325. package/dist/services/selection-providers/list-of-models-selection-provider.service.d.ts.map +1 -1
  326. package/dist/services/selection-providers/list-of-models-selection-provider.service.js +4 -0
  327. package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
  328. package/dist/services/setting.service.d.ts +7 -5
  329. package/dist/services/setting.service.d.ts.map +1 -1
  330. package/dist/services/setting.service.js +28 -48
  331. package/dist/services/setting.service.js.map +1 -1
  332. package/dist/services/sms/Msg91BaseSMSService.js +6 -6
  333. package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
  334. package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
  335. package/dist/services/sms/Msg91OTPService.js +3 -1
  336. package/dist/services/sms/Msg91OTPService.js.map +1 -1
  337. package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
  338. package/dist/services/sms/Msg91SMSService.js +3 -1
  339. package/dist/services/sms/Msg91SMSService.js.map +1 -1
  340. package/dist/services/sms/TwilioSMSService.d.ts.map +1 -1
  341. package/dist/services/sms/TwilioSMSService.js +2 -0
  342. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  343. package/dist/services/sms-template.service.d.ts +7 -7
  344. package/dist/services/sms-template.service.d.ts.map +1 -1
  345. package/dist/services/sms-template.service.js +8 -7
  346. package/dist/services/sms-template.service.js.map +1 -1
  347. package/dist/services/solid-introspect.service.d.ts +5 -13
  348. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  349. package/dist/services/solid-introspect.service.js +18 -22
  350. package/dist/services/solid-introspect.service.js.map +1 -1
  351. package/dist/services/solid-ts-morph.service.js +2 -2
  352. package/dist/services/solid-ts-morph.service.js.map +1 -1
  353. package/dist/services/user-activity-history.service.d.ts.map +1 -1
  354. package/dist/services/user-activity-history.service.js +1 -0
  355. package/dist/services/user-activity-history.service.js.map +1 -1
  356. package/dist/services/user-view-metadata.service.d.ts.map +1 -1
  357. package/dist/services/user-view-metadata.service.js +3 -2
  358. package/dist/services/user-view-metadata.service.js.map +1 -1
  359. package/dist/services/user.service.d.ts.map +1 -1
  360. package/dist/services/user.service.js +1 -0
  361. package/dist/services/user.service.js.map +1 -1
  362. package/dist/services/view-metadata.service.d.ts +1 -1
  363. package/dist/services/view-metadata.service.d.ts.map +1 -1
  364. package/dist/services/view-metadata.service.js +3 -1
  365. package/dist/services/view-metadata.service.js.map +1 -1
  366. package/dist/solid-core-cli-db.module.d.ts.map +1 -1
  367. package/dist/solid-core-cli-db.module.js +5 -2
  368. package/dist/solid-core-cli-db.module.js.map +1 -1
  369. package/dist/solid-core-cli.module.js +1 -1
  370. package/dist/solid-core-cli.module.js.map +1 -1
  371. package/dist/solid-core.module.d.ts.map +1 -1
  372. package/dist/solid-core.module.js +40 -13
  373. package/dist/solid-core.module.js.map +1 -1
  374. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  375. package/dist/subscribers/audit.subscriber.js +5 -1
  376. package/dist/subscribers/audit.subscriber.js.map +1 -1
  377. package/dist/subscribers/computed-entity-field.subscriber.d.ts +4 -2
  378. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  379. package/dist/subscribers/computed-entity-field.subscriber.js +53 -12
  380. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  381. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  382. package/dist/subscribers/scheduled-job.subscriber.js +1 -1
  383. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  384. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +5 -0
  385. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -0
  386. package/dist/transformers/typeorm/local-date-time-transformer.js +48 -0
  387. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -0
  388. package/dist/tsconfig.tsbuildinfo +1 -1
  389. package/docs/grouping-enhancements.md +89 -0
  390. package/package.json +1 -1
  391. package/src/commands/fixtures/fixtures-setup.command.ts +44 -0
  392. package/src/commands/fixtures/fixtures-tear-down.command.ts +45 -0
  393. package/src/commands/refresh-model.command.ts +3 -1
  394. package/src/config/cache.options.ts +6 -3
  395. package/src/config/iam.config.ts +2 -1
  396. package/src/constants/error-messages.ts +7 -1
  397. package/src/controllers/model-metadata.controller.ts +21 -1
  398. package/src/controllers/model-sequence.controller.ts +93 -0
  399. package/src/controllers/setting.controller.ts +62 -54
  400. package/src/decorators/sms-provider.decorator.ts +7 -0
  401. package/src/dtos/basic-filters.dto.ts +6 -1
  402. package/src/dtos/basic-group-filters.dto.ts +23 -0
  403. package/src/dtos/create-field-metadata.dto.ts +1 -1
  404. package/src/dtos/create-model-sequence.dto.ts +51 -0
  405. package/src/dtos/create-role-metadata.dto.ts +16 -3
  406. package/src/dtos/get-mcp-url.dto.ts +13 -0
  407. package/src/dtos/navigation.dto.ts +14 -0
  408. package/src/dtos/resolve-s3-url.dto.ts +9 -11
  409. package/src/dtos/sign-in.dto.ts +3 -3
  410. package/src/dtos/update-model-sequence.dto.ts +53 -0
  411. package/src/entities/common.entity.ts +8 -8
  412. package/src/entities/field-metadata.entity.ts +1 -1
  413. package/src/entities/legacy-common.entity.ts +8 -6
  414. package/src/entities/model-metadata.entity.ts +1 -1
  415. package/src/entities/model-sequence.entity.ts +32 -0
  416. package/src/factories/mail.factory.ts +0 -1
  417. package/src/factories/sms.factory.ts +43 -0
  418. package/src/helpers/date.helper.ts +38 -9
  419. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +18 -5
  420. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +9 -9
  421. package/src/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.ts +16 -8
  422. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +9 -9
  423. package/src/helpers/model-metadata-helper.service.ts +6 -4
  424. package/src/helpers/module-metadata-helper.service.ts +18 -1
  425. package/src/helpers/module.helper.ts +40 -5
  426. package/src/helpers/solid-registry.ts +23 -0
  427. package/src/index.ts +12 -7
  428. package/src/jobs/computed-field-evaluation-subscriber.service.ts +15 -4
  429. package/src/jobs/database/{sms-publisher-database.service.ts → msg91-sms-publisher-database.service.ts} +2 -2
  430. package/src/jobs/database/{sms-subscriber-database.service.ts → msg91-sms-subscriber-database.service.ts} +9 -4
  431. package/src/jobs/database/otp-subscriber-database.service.ts +8 -2
  432. package/src/jobs/database/twilio-sms-subscriber-database.service.ts +5 -2
  433. package/src/jobs/{otp-publisher.service.ts → msg91-otp-publisher.service.ts} +2 -2
  434. package/src/jobs/{otp-subscriber.service.ts → msg91-otp-subscriber.service.ts} +10 -4
  435. package/src/jobs/{sms-publisher.service.ts → msg91-sms-publisher.service.ts} +2 -2
  436. package/src/jobs/{sms-subscriber.service.ts → msg91-sms-subscriber.service.ts} +9 -4
  437. package/src/jobs/twilio-sms-subscriber.service.ts +6 -2
  438. package/src/repository/media.repository.ts +3 -2
  439. package/src/repository/model-sequence.repository.ts +97 -0
  440. package/src/seeders/module-metadata-seeder.service.ts +133 -34
  441. package/src/seeders/seed-data/email-templates/email-on-signup.handlebars.html +155 -0
  442. package/src/seeders/seed-data/sms-templates/text-on-signup.handlebars.txt +10 -0
  443. package/src/seeders/seed-data/solid-core-metadata.json +374 -53
  444. package/src/seeders/system-fields-seeder.service.ts +6 -2
  445. package/src/seeders/user-seeder.service.ts +5 -4
  446. package/src/services/action-metadata.service.ts +3 -2
  447. package/src/services/ai-interaction.service.ts +2 -1
  448. package/src/services/authentication.service.ts +119 -24
  449. package/src/services/chatter-message-details.service.ts +2 -1
  450. package/src/services/chatter-message.service.ts +10 -4
  451. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +9 -9
  452. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +86 -0
  453. package/src/services/crud-helper.service.ts +287 -49
  454. package/src/services/crud.service.ts +95 -45
  455. package/src/services/database/database-bootstrap.service.ts +91 -0
  456. package/src/services/email-template.service.ts +11 -13
  457. package/src/services/excel.service.ts +152 -3
  458. package/src/services/field-metadata.service.ts +102 -55
  459. package/src/services/file.service.ts +9 -0
  460. package/src/services/fixtures.service.ts +108 -0
  461. package/src/services/genai/ingest-metadata.service.ts +4 -3
  462. package/src/services/import-transaction-error-log.service.ts +2 -1
  463. package/src/services/import-transaction.service.ts +8 -4
  464. package/src/services/list-of-values.service.ts +4 -4
  465. package/src/services/locale.service.ts +2 -1
  466. package/src/services/mail/smtp-email.service.ts +1 -1
  467. package/src/services/media.service.ts +10 -11
  468. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +22 -7
  469. package/src/services/mediaStorageProviders/file-storage-provider.ts +18 -13
  470. package/src/services/menu-item-metadata.service.ts +6 -2
  471. package/src/services/model-metadata.service.ts +201 -44
  472. package/src/services/model-sequence.service.ts +33 -0
  473. package/src/services/module-metadata.service.ts +49 -2
  474. package/src/services/permission-metadata.service.ts +8 -9
  475. package/src/services/queues/database-subscriber.service.ts +3 -1
  476. package/src/services/queues/rabbitmq-subscriber.service.ts +4 -2
  477. package/src/services/role-metadata.service.ts +1 -0
  478. package/src/services/scheduled-job.service.ts +9 -9
  479. package/src/services/scheduled-jobs/scheduler.service.ts +5 -0
  480. package/src/services/security-rule.service.ts +1 -0
  481. package/src/services/selection-providers/list-of-models-selection-provider.service.ts +5 -2
  482. package/src/services/setting.service.ts +42 -55
  483. package/src/services/sms/Msg91BaseSMSService.ts +6 -6
  484. package/src/services/sms/Msg91OTPService.ts +3 -2
  485. package/src/services/sms/Msg91SMSService.ts +3 -1
  486. package/src/services/sms/TwilioSMSService.ts +3 -3
  487. package/src/services/sms-template.service.ts +11 -13
  488. package/src/services/solid-introspect.service.ts +28 -19
  489. package/src/services/solid-ts-morph.service.ts +2 -2
  490. package/src/services/user-activity-history.service.ts +3 -2
  491. package/src/services/user-view-metadata.service.ts +4 -3
  492. package/src/services/user.service.ts +2 -1
  493. package/src/services/view-metadata.service.ts +5 -4
  494. package/src/solid-core-cli-db.module.ts +5 -4
  495. package/src/solid-core-cli.module.ts +2 -2
  496. package/src/solid-core.module.ts +42 -13
  497. package/src/subscribers/audit.subscriber.ts +3 -2
  498. package/src/subscribers/computed-entity-field.subscriber.ts +60 -17
  499. package/src/subscribers/scheduled-job.subscriber.ts +9 -2
  500. package/src/transformers/typeorm/local-date-time-transformer.ts +55 -0
  501. package/dist/jobs/database/sms-publisher-database.service.d.ts.map +0 -1
  502. package/dist/jobs/database/sms-publisher-database.service.js.map +0 -1
  503. package/dist/jobs/database/sms-queue-database-options.d.ts.map +0 -1
  504. package/dist/jobs/database/sms-queue-database-options.js.map +0 -1
  505. package/dist/jobs/database/sms-subscriber-database.service.d.ts.map +0 -1
  506. package/dist/jobs/database/sms-subscriber-database.service.js.map +0 -1
  507. package/dist/jobs/otp-publisher.service.d.ts.map +0 -1
  508. package/dist/jobs/otp-publisher.service.js.map +0 -1
  509. package/dist/jobs/otp-queue-options.d.ts.map +0 -1
  510. package/dist/jobs/otp-queue-options.js.map +0 -1
  511. package/dist/jobs/otp-subscriber.service.d.ts.map +0 -1
  512. package/dist/jobs/otp-subscriber.service.js.map +0 -1
  513. package/dist/jobs/sms-publisher.service.d.ts.map +0 -1
  514. package/dist/jobs/sms-publisher.service.js.map +0 -1
  515. package/dist/jobs/sms-queue-options.d.ts.map +0 -1
  516. package/dist/jobs/sms-queue-options.js.map +0 -1
  517. package/dist/jobs/sms-subscriber.service.d.ts.map +0 -1
  518. package/dist/jobs/sms-subscriber.service.js.map +0 -1
  519. /package/sql/{mssql → default/mssql}/proc_CleanupModelMetadata.sql +0 -0
  520. /package/sql/{mssql → default/mssql}/proc_CleanupModuleMetadata.sql +0 -0
  521. /package/sql/{mssql/scratchpad.sql → default/mssql/scratchpad.sql.txt} +0 -0
  522. /package/sql/{postgres → default/postgres}/proc_CleanupModelMetadata.sql +0 -0
  523. /package/sql/{postgres → default/postgres}/proc_CleanupModuleMetadata.sql +0 -0
  524. /package/sql/{postgres/scratchpad.sql → default/postgres/scratchpad.sql.txt} +0 -0
  525. /package/src/jobs/database/{sms-queue-database-options.ts → msg91-sms-queue-database-options.ts} +0 -0
  526. /package/src/jobs/{otp-queue-options.ts → msg91-otp-queue-options.ts} +0 -0
  527. /package/src/jobs/{sms-queue-options.ts → msg91-sms-queue-options.ts} +0 -0
@@ -2,7 +2,7 @@ import { BadRequestException, NotFoundException } from "@nestjs/common";
2
2
  import { ConfigService } from "@nestjs/config";
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { isArray } from "class-validator";
5
- import { CommonEntity, SolidBaseRepository, User } from "src";
5
+ import { CommonEntity, FileService, SolidBaseRepository, User } from "src";
6
6
  import { ERROR_MESSAGES } from "src/constants/error-messages";
7
7
  import { SUCCESS_MESSAGES } from "src/constants/success-messages";
8
8
  import { EntityManager, FindOptionsWhere, In, IsNull, Not, QueryFailedError, SelectQueryBuilder } from "typeorm";
@@ -33,28 +33,30 @@ import { SelectionStaticFieldCrudManager } from "../helpers/field-crud-managers/
33
33
  import { ShortTextFieldCrudManager } from "../helpers/field-crud-managers/ShortTextFieldCrudManager";
34
34
  import { UUIDFieldCrudManager } from "../helpers/field-crud-managers/UUIDFieldCrudManager";
35
35
  import { FieldCrudManager, MediaWithFullUrl } from "../interfaces";
36
- import { CrudHelperService, UserIdFields } from "./crud-helper.service";
37
- import { FileService } from "./file.service";
36
+ import { CrudHelperService, FilterCombinator, UserIdFields } from "./crud-helper.service";
38
37
  import { HashingService } from "./hashing.service";
39
38
  import { getMediaStorageProvider } from "./mediaStorageProviders";
40
39
  import { ModelMetadataService } from "./model-metadata.service";
41
40
  import { ModuleMetadataService } from "./module-metadata.service";
42
41
  import { RequestContextService } from "./request-context.service";
42
+ import { BasicGroupFilterDto } from "src/dtos/basic-group-filters.dto";
43
43
 
44
44
  export class CRUDService<T extends CommonEntity> { // Add two generic value i.e Person,CreatePersonDto, so we get the proper types in our service
45
45
 
46
46
  constructor(
47
- readonly modelMetadataService: ModelMetadataService,
48
- readonly moduleMetadataService: ModuleMetadataService,
49
- readonly configService: ConfigService,
50
- readonly fileService: FileService,
51
- readonly discoveryService: DiscoveryService,
52
- readonly crudHelperService: CrudHelperService,
47
+ readonly modelMetadataService: ModelMetadataService, // go away
48
+ readonly moduleMetadataService: ModuleMetadataService, // go away
49
+ readonly configService: ConfigService, // we don't use it - go away
50
+ readonly fileService: FileService, // we don't use it - go away
51
+ readonly discoveryService: DiscoveryService, // go away
52
+ readonly crudHelperService: CrudHelperService, // go away
53
53
  readonly entityManager: EntityManager,
54
54
  readonly repo: SolidBaseRepository<T>,
55
55
  readonly modelName: string,
56
56
  readonly moduleName: string,
57
57
  readonly moduleRef: ModuleRef,
58
+ readonly defaultEntityManager?: EntityManager
59
+
58
60
  //We can just have the Model Entity here
59
61
  ) { }
60
62
 
@@ -182,7 +184,12 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
182
184
  throw new BadRequestException(`Cannot update a published record for model ${this.modelName}. Unpublish it first.`
183
185
  );
184
186
  }
185
- updateDto.id = id;
187
+
188
+ // // In some instances for legacy tables sometimes id is mapped as a bigint.
189
+ // // in these cases the update method ends up attempting to insert records due to some type orm type mismatch issue.
190
+ // const idFieldMetadata = model.fields.find(f => f.name === 'id');
191
+ // updateDto.id = idFieldMetadata?.type === 'bigint' ? BigInt(id) : id;
192
+
186
193
  // This class will be extended by the generated service class i.e PersonService
187
194
  // The data required to identify the model and module name will be passed from the generate CrudService subclass
188
195
  //TODO: Algorithm to create the entity
@@ -427,11 +434,11 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
427
434
  }
428
435
 
429
436
  private isSkipComputation(isPartialUpdate: boolean, computedFieldMetadata: FieldMetadata) {
430
- if (isPartialUpdate) return true; // If it is a partial update, then skip computation
431
- if (computedFieldMetadata.computedFieldTriggerConfig && computedFieldMetadata.computedFieldTriggerConfig.length > 0) {
432
- return true; // computedFieldTriggerConfig is a new field introduced as part of the IEntityComputedFieldProvider new interface, so this computation will be skiipped in crud service & will be called in the subscriber instead
433
- }
434
- return false; // If it is not a partial update, then do not skip computation
437
+ if (isPartialUpdate) return true; // If it is a partial update, then skip computation
438
+ if (computedFieldMetadata.computedFieldTriggerConfig && computedFieldMetadata.computedFieldTriggerConfig.length > 0) {
439
+ return true; // computedFieldTriggerConfig is a new field introduced as part of the IEntityComputedFieldProvider new interface, so this computation will be skiipped in crud service & will be called in the subscriber instead
440
+ }
441
+ return false; // If it is not a partial update, then do not skip computation
435
442
  }
436
443
 
437
444
  async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {
@@ -455,19 +462,34 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
455
462
 
456
463
  // Create above query on pincode table using query builder
457
464
  var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)
458
- // qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
459
- if (internationalisation && draftPublishWorkflow) {
460
- qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);
461
- }
462
- else {
463
- qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
464
- }
465
465
 
466
466
  if (basicFilterDto.groupBy) {
467
- // Get the records and the count
468
- const { groupMeta, groupRecords } = await this.handleGroupFind(qb, groupFilter, populateGroup, alias, populateUserIdFields, populateMedia);
469
- const totalGroups = await this.crudHelperService.countGroupedRecords(qb, basicFilterDto, alias);
470
- // qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
467
+ const groupFilterQb = (internationalisation && draftPublishWorkflow)
468
+ ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false)
469
+ : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, FilterCombinator.AND, false, false);
470
+
471
+ const groupByFields = this.crudHelperService.normalize(basicFilterDto.groupBy);
472
+ if (!groupByFields.length) {
473
+ throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
474
+ }
475
+
476
+ if (basicFilterDto.populateGroup) {
477
+ const hasRelationGroup = groupByFields.some(field => field.includes('.'));
478
+ if (hasRelationGroup) {
479
+ throw new BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');
480
+ }
481
+ }
482
+
483
+ const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } = this.crudHelperService.applyGroupBySelections(groupFilterQb, groupByFields, alias);
484
+ const aggregateAliasMap = this.crudHelperService.applyAggregates(groupFilterQb, basicFilterDto.aggregates, alias);
485
+ const sortAliasMap = { ...groupAliasMap, ...aggregateAliasMap };
486
+ this.crudHelperService.applyGroupSortingAndPagination(groupFilterQb, basicFilterDto.sort, sortAliasMap, limit, offset);
487
+
488
+ const groupByResult = await groupFilterQb.getRawMany();
489
+ const totalGroups = await this.crudHelperService.countGroups(groupFilterQb);
490
+
491
+ const groupByFieldsOrdered = this.crudHelperService.normalize(basicFilterDto.groupBy || []);
492
+ const { groupMeta, groupRecords } = await this.handleGroupFind(groupByResult, groupFilter, populateGroup, alias, populateUserIdFields, populateMedia, basicFilterDto, groupAliasMap, aggregateAliasMap, groupByFieldsOrdered, groupFormatMap, groupExpressionMap);
471
493
 
472
494
  return {
473
495
  meta: {
@@ -478,7 +500,9 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
478
500
  }
479
501
  }
480
502
  else {
481
- // Get the records and the count
503
+ qb = (internationalisation && draftPublishWorkflow)
504
+ ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)
505
+ : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
482
506
  const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);
483
507
  return {
484
508
  meta,
@@ -503,17 +527,38 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
503
527
  return this.wrapFindResponse(offset, limit, count, entities);
504
528
  }
505
529
 
506
- private async handleGroupFind(qb: SelectQueryBuilder<T>, groupFilter: BasicFilterDto, populateGroup: boolean, alias: string, populateUserIdFields: UserIdFields[], populateMedia: string[]) {
507
- const groupByResult = await qb.getRawMany();
508
-
530
+ private async handleGroupFind(
531
+ groupByResult: any[],
532
+ groupFilter: BasicGroupFilterDto | undefined,
533
+ populateGroup: boolean,
534
+ alias: string,
535
+ populateUserIdFields: UserIdFields[],
536
+ populateMedia: string[],
537
+ baseFilterDto: BasicFilterDto,
538
+ groupAliasMap: Record<string, string>,
539
+ aggregateAliasMap: Record<string, string>,
540
+ groupByFieldsOrdered: string[],
541
+ groupFormatMap: Record<string, string | undefined>,
542
+ groupExpressionMap: Record<string, string>
543
+ ) {
509
544
  const groupMeta = [];
510
545
  const groupRecords = [];
546
+ const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));
511
547
  // For each group, get the records and the count
512
548
  for (const group of groupByResult) {
513
549
  if (populateGroup) {
514
550
  let groupByQb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias);
515
- groupByQb = this.crudHelperService.buildFilterQuery(groupByQb, groupFilter, alias);
516
- groupByQb = this.crudHelperService.buildGroupByRecordsQuery(groupByQb, group, alias);
551
+ const groupFilterDto: BasicFilterDto = {
552
+ ...baseFilterDto,
553
+ ...groupFilter,
554
+ groupBy: undefined,
555
+ aggregates: undefined,
556
+ // Only use explicit groupFilter.sort for record ordering; group-level sorts can contain
557
+ // group expressions (e.g. createdAt:day) that are invalid on record queries.
558
+ sort: groupFilter?.sort,
559
+ };
560
+ groupByQb = this.crudHelperService.buildFilterQuery(groupByQb, groupFilterDto, alias);
561
+ groupByQb = this.crudHelperService.buildGroupByRecordsQuery(groupByQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
517
562
  const [entities, count] = await groupByQb.getManyAndCount();
518
563
 
519
564
  // Populate the entity with the userId fields
@@ -525,20 +570,22 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
525
570
  if (populateMedia && populateMedia.length > 0) {
526
571
  await this.handlePopulateMedia(populateMedia, entities);
527
572
  }
528
- const groupData = this.wrapFindResponse(groupFilter.offset, groupFilter.limit, count, entities);
529
- groupRecords.push(this.crudHelperService.createGroupRecords(group, alias, groupData));
573
+ const groupData = this.wrapFindResponse(groupFilter?.offset, groupFilter?.limit, count, entities);
574
+ groupRecords.push(this.crudHelperService.createGroupRecords(group, aggregateAliasSet, groupData, groupByFieldsOrdered, groupAliasMap, groupFormatMap));
530
575
  }
531
- groupMeta.push(this.crudHelperService.createGroupMeta(group, alias));
576
+ groupMeta.push(this.crudHelperService.createGroupMeta(group, aggregateAliasSet, groupByFieldsOrdered, groupAliasMap, groupFormatMap));
532
577
  }
533
578
  return { groupMeta, groupRecords };
534
579
  }
535
580
 
536
- private wrapFindResponse(offset: number, limit: number, count: number, entities: T[]) {
537
- const currentPage = Math.floor(offset / limit) + 1;
538
- const totalPages = Math.ceil(count / limit);
581
+ private wrapFindResponse(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {
582
+ const safeLimit = limit ?? count ?? 0;
583
+ const safeOffset = offset ?? 0;
584
+ const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;
585
+ const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;
539
586
 
540
- const nextPage = currentPage < totalPages ? currentPage + 1 : null;
541
- const prevPage = currentPage > 1 ? currentPage - 1 : null;
587
+ const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;
588
+ const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;
542
589
 
543
590
  const r = {
544
591
  meta: {
@@ -547,7 +594,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
547
594
  nextPage: nextPage,
548
595
  prevPage: prevPage,
549
596
  totalPages: totalPages,
550
- perPage: +limit,
597
+ perPage: safeLimit ? +safeLimit : 0,
551
598
  },
552
599
  records: entities
553
600
  };
@@ -574,7 +621,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
574
621
  }
575
622
 
576
623
  private async handlePopulateMedia(populateMedia: string[], entities: T[]) {
577
- const model = await this.entityManager.getRepository(ModelMetadata).findOne({
624
+ const model = await this.getDefaultEntityManager().getRepository(ModelMetadata).findOne({
578
625
  where: {
579
626
  singularName: this.modelName,
580
627
  },
@@ -657,7 +704,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
657
704
  return mediaDetails as MediaWithFullUrl[];
658
705
  }
659
706
 
660
- async findOne(id: number, query: any={}, solidRequestContext: any = {}) {
707
+ async findOne(id: number, query: any = {}, solidRequestContext: any = {}) {
661
708
  const { populate = [], fields = [], populateMedia = [] } = query;
662
709
 
663
710
  // const normalizedFields = this.crudHelperService.normalize(fields);
@@ -913,7 +960,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
913
960
  throw new BadRequestException(`Field ${field.name} does not define a relationCoModelSingularName`);
914
961
  }
915
962
 
916
- const relationCoModel = await this.entityManager.getRepository(ModelMetadata).findOne({
963
+ const relationCoModel = await this.getDefaultEntityManager().getRepository(ModelMetadata).findOne({
917
964
  where: { singularName: field.relationCoModelSingularName },
918
965
  relations: ['fields', 'fields.mediaStorageProvider', 'fields.model'],
919
966
  });
@@ -1016,5 +1063,8 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
1016
1063
 
1017
1064
  return updatedEntity
1018
1065
  }
1019
- }
1020
1066
 
1067
+ private getDefaultEntityManager() {
1068
+ return this.defaultEntityManager ?? this.entityManager;
1069
+ }
1070
+ }
@@ -0,0 +1,91 @@
1
+ import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
2
+ import { DataSource } from 'typeorm';
3
+ import { readdir, readFile } from 'fs/promises';
4
+ import * as path from 'path';
5
+ import { InjectDataSource } from '@nestjs/typeorm';
6
+
7
+ @Injectable()
8
+ export class DatabaseBootstrapService implements OnModuleInit {
9
+ private readonly logger = new Logger(DatabaseBootstrapService.name);
10
+
11
+ constructor(
12
+ @InjectDataSource()
13
+ private readonly dataSource: DataSource,
14
+ ) { }
15
+
16
+ async onModuleInit() {
17
+ if (!this.dataSource.isInitialized) {
18
+ this.logger.warn(`[${this.dataSource.name}] DataSource not initialized. Skipping SQL bootstrap.`);
19
+ return;
20
+ }
21
+
22
+ this.logger.debug(`[${this.dataSource.name}] Bootstrapping stored procedures...`);
23
+
24
+ await this.applyAllSqlFiles();
25
+
26
+ this.logger.debug(`[${this.dataSource.name}] SQL bootstrap completed`);
27
+ }
28
+
29
+ private resolveSqlDirectory(): string {
30
+ const datasourceName = this.dataSource.name || 'default';
31
+ const dbType = this.dataSource.options.type;
32
+
33
+ const sqlFilePath = path.resolve(__dirname, `../../../sql/${datasourceName}/${dbType}`);
34
+
35
+ return sqlFilePath
36
+ }
37
+
38
+ private async applyAllSqlFiles() {
39
+ const sqlDir = this.resolveSqlDirectory();
40
+
41
+ this.logger.debug(`[${this.dataSource.name}] SQL directory: ${sqlDir}`);
42
+
43
+ let files: string[];
44
+ try {
45
+ files = await readdir(sqlDir);
46
+ } catch {
47
+ this.logger.warn(
48
+ `[${this.dataSource.name}] No SQL directory found. Skipping.`,
49
+ );
50
+ return;
51
+ }
52
+
53
+ const sqlFiles = files
54
+ .filter(file => file.endsWith('.sql'))
55
+ .sort();
56
+
57
+ if (!sqlFiles.length) {
58
+ this.logger.warn(
59
+ `[${this.dataSource.name}] No SQL files found`,
60
+ );
61
+ return;
62
+ }
63
+
64
+ for (const file of sqlFiles) {
65
+ await this.applySqlFileSafely(
66
+ path.join(sqlDir, file),
67
+ file,
68
+ );
69
+ }
70
+ }
71
+
72
+ private async applySqlFileSafely(
73
+ filePath: string,
74
+ fileName: string,
75
+ ) {
76
+ this.logger.debug(`[${this.dataSource.name}] Applying ${fileName}`);
77
+
78
+ try {
79
+ const sql = await readFile(filePath, 'utf8');
80
+ await this.dataSource.query(sql);
81
+
82
+ this.logger.debug(`[${this.dataSource.name}] Applied ${fileName}`);
83
+ } catch (error) {
84
+ // DO NOT THROW — continue with next file
85
+ this.logger.error(
86
+ `[${this.dataSource.name}] Failed ${fileName}`,
87
+ error instanceof Error ? error.stack : String(error),
88
+ );
89
+ }
90
+ }
91
+ }
@@ -1,25 +1,23 @@
1
- import { Injectable, NotFoundException } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
 
3
- import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
4
- import { EntityManager, Repository } from 'typeorm';
5
- import { PaginationQueryDto } from 'src/dtos/pagination-query.dto';
3
+ import { ConfigService } from '@nestjs/config';
4
+ import { DiscoveryService, ModuleRef } from '@nestjs/core';
5
+ import { InjectEntityManager } from '@nestjs/typeorm';
6
+ import { EmailTemplateRepository } from 'src/repository/email-template.repository';
7
+ import { EntityManager } from 'typeorm';
6
8
  import { EmailTemplate } from '../entities/email-template.entity';
7
- import { CreateEmailTemplateDto } from '../dtos/create-email-template.dto';
8
- import { UpdateEmailTemplateDto } from '../dtos/update-email-template.dto';
9
+ import { CrudHelperService } from './crud-helper.service';
9
10
  import { CRUDService } from './crud.service';
10
- import { ModelMetadataService } from './model-metadata.service';
11
- import { ModuleMetadataService } from './module-metadata.service';
12
- import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
13
- import { ConfigService } from '@nestjs/config';
14
11
  import { FileService } from './file.service';
12
+ import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
15
13
  import { MediaService } from './media.service';
16
- import { DiscoveryService, ModuleRef } from '@nestjs/core';
17
- import { CrudHelperService } from './crud-helper.service';
18
- import { EmailTemplateRepository } from 'src/repository/email-template.repository';
14
+ import { ModelMetadataService } from './model-metadata.service';
15
+ import { ModuleMetadataService } from './module-metadata.service';
19
16
 
20
17
  @Injectable()
21
18
  export class EmailTemplateService extends CRUDService<EmailTemplate>{
22
19
  constructor(
20
+ @Inject(forwardRef(() => ModelMetadataService))
23
21
  readonly modelMetadataService: ModelMetadataService,
24
22
  readonly moduleMetadataService: ModuleMetadataService,
25
23
  readonly mediaStorageProviderService: MediaStorageProviderMetadataService,
@@ -1,9 +1,9 @@
1
1
  import { Injectable, Logger } from '@nestjs/common';
2
2
  import * as ExcelJS from 'exceljs';
3
3
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
4
+ import { parseFlexibleDate } from 'src/helpers/date.helper';
4
5
  import { PassThrough, Readable } from 'stream';
5
6
 
6
-
7
7
  export interface ExcelReadOptions {
8
8
  pageSize?: number; // Number of records per page
9
9
  hasHeaderRow?: boolean; // Whether the first row contains headers
@@ -17,6 +17,11 @@ export interface ExcelReadResult {
17
17
  data: Record<string, any>[]; // Data records in the current page
18
18
  }
19
19
 
20
+ export interface ExcelReadAllResult {
21
+ headers: string[];
22
+ rows: Record<string, any>[];
23
+ }
24
+
20
25
  @Injectable()
21
26
  export class ExcelService {
22
27
  private logger = new Logger(ExcelService.name);
@@ -59,7 +64,7 @@ export class ExcelService {
59
64
  // headers.reduce((acc, header) => ({ ...acc, [header]: '' }), {})
60
65
  // ).commit(); // Write a dummy record with headers
61
66
 
62
- workbook.commit();
67
+ workbook.commit();
63
68
  return passThrough;
64
69
  }
65
70
 
@@ -86,7 +91,7 @@ export class ExcelService {
86
91
  this.logger.debug(`✅ Chunk ${chunkIndex} written to Excel`);
87
92
  }
88
93
 
89
- workbook.commit();
94
+ workbook.commit();
90
95
  // passThrough.end(); // ✅ Properly close the stream
91
96
  } catch (error) {
92
97
  this.logger.error(`❌ Error writing Excel: ${error.message}`);
@@ -159,4 +164,148 @@ export class ExcelService {
159
164
  }
160
165
  }
161
166
 
167
+ private cleanString(value: any): string {
168
+ return (value === null || value === undefined ? '' : String(value))
169
+ .replace(/\uFEFF/g, '') // BOM
170
+ .replace(/\u00A0/g, ' ') // NBSP
171
+ .replace(/\s+/g, ' ')
172
+ .trim();
173
+ }
174
+
175
+ private normalizeCellValue(value: any, sharedStrings?: any[]): any {
176
+ if (value === undefined || value === null) return null;
177
+
178
+ // ExcelJS streaming shared string ref: { sharedString: number }
179
+ if (typeof value === 'object' && value && 'sharedString' in value) {
180
+ const idx = (value as any).sharedString;
181
+ const resolved = sharedStrings?.[idx];
182
+ // sharedStrings may store objects or plain strings depending on ExcelJS internals
183
+ if (resolved === undefined || resolved === null) return null;
184
+ if (typeof resolved === 'string') return resolved;
185
+ if (typeof resolved === 'object') {
186
+ if ('text' in resolved && typeof (resolved as any).text === 'string') return (resolved as any).text;
187
+ if ('richText' in resolved && Array.isArray((resolved as any).richText)) {
188
+ return (resolved as any).richText.map((item: any) => item?.text ?? '').join('');
189
+ }
190
+ if ('value' in resolved) return (resolved as any).value;
191
+ }
192
+ return resolved;
193
+ }
194
+
195
+ // ExcelJS can return rich objects for styled cells; unwrap to plain text/primitive
196
+ if (typeof value === 'object' && value) {
197
+ // Plain rich cell: { text: '...' }
198
+ if ('text' in value && typeof (value as any).text === 'string') return (value as any).text;
199
+
200
+ // Rich text: { richText: [{text:'a'}, ...] }
201
+ if ('richText' in value && Array.isArray((value as any).richText)) {
202
+ return (value as any).richText.map((item: any) => item?.text ?? '').join('');
203
+ }
204
+
205
+ // Formula cells: { formula: '...', result: ... }
206
+ if ('result' in value) return (value as any).result;
207
+ if ('formula' in value) return (value as any).formula;
208
+
209
+ // Hyperlinks: { text: '...', hyperlink: '...' }
210
+ if ('hyperlink' in value && typeof (value as any).hyperlink === 'string') {
211
+ return (value as any).text ?? (value as any).hyperlink;
212
+ }
213
+
214
+ // Sometimes primitive nested under .value
215
+ if ('value' in value) return this.normalizeCellValue((value as any).value, sharedStrings);
216
+ }
217
+
218
+ return value;
219
+ }
220
+
221
+ public async readExcelFromStreamNonStreaming(
222
+ stream: Readable,
223
+ options?: ExcelReadOptions & { worksheetIndex?: number; maxRows?: number }
224
+ ): Promise<ExcelReadAllResult> {
225
+ const {
226
+ hasHeaderRow = true,
227
+ providedHeaders = [],
228
+ worksheetIndex = 0, // 0-based
229
+ maxRows,
230
+ } = options || {};
231
+
232
+ // 1) Read entire stream into a Buffer
233
+ const chunks: Buffer[] = [];
234
+ for await (const chunk of stream) {
235
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
236
+ }
237
+ const buffer = Buffer.concat(chunks);
238
+
239
+ // 2) Load workbook (non-streaming)
240
+ const workbook = new ExcelJS.Workbook();
241
+ // @ts-ignore
242
+ await workbook.xlsx.load(buffer);
243
+
244
+ const worksheet = workbook.worksheets?.[worksheetIndex];
245
+ if (!worksheet) {
246
+ return { headers: [], rows: [] };
247
+ }
248
+
249
+ // 3) Determine headers
250
+ let headers: string[] = [];
251
+
252
+ const firstRow = worksheet.getRow(1);
253
+ const firstRowValues = Array.isArray(firstRow.values) ? (firstRow.values as any[]).slice(1) : [];
254
+
255
+ const normalizeNonStreamingCell = (v: any) => {
256
+ // In non-streaming ExcelJS, cell.value can be:
257
+ // - string/number/boolean/date
258
+ // - {richText}, {text}, {hyperlink}, {formula,result}, etc.
259
+ // We'll reuse your normalizeCellValue but without sharedStrings
260
+ return this.normalizeCellValue(v);
261
+ };
262
+
263
+ if (hasHeaderRow) {
264
+ headers = firstRowValues.map((v) => this.cleanString(normalizeNonStreamingCell(v)));
265
+ } else if (providedHeaders.length) {
266
+ headers = providedHeaders.map((h) => this.cleanString(h));
267
+ } else {
268
+ headers = firstRowValues.map((_, idx) => `${idx}`);
269
+ }
270
+
271
+ // If headers are all blank and hasHeaderRow=true, treat as no headers (avoid mapping everything to "")
272
+ if (hasHeaderRow && headers.length > 0 && headers.every((h) => !h)) {
273
+ this.logger.warn(`ExcelService.readExcelFromStreamNonStreaming: header row appears blank`);
274
+ }
275
+
276
+ // 4) Read rows
277
+ const rows: Record<string, any>[] = [];
278
+
279
+ const startRowNumber = hasHeaderRow ? 2 : 1;
280
+ const lastRowNumber = worksheet.rowCount || 0;
281
+
282
+ for (let r = startRowNumber; r <= lastRowNumber; r++) {
283
+ if (maxRows && rows.length >= maxRows) break;
284
+
285
+ const row = worksheet.getRow(r);
286
+ const rawValues = Array.isArray(row.values) ? (row.values as any[]).slice(1) : [];
287
+ const values = rawValues.map((v) => normalizeNonStreamingCell(v));
288
+
289
+ // Align row width to header width
290
+ while (values.length < headers.length) values.push(null);
291
+ if (values.length > headers.length) values.length = headers.length;
292
+
293
+ const record = headers.reduce((acc, key, i) => {
294
+ acc[key] = values[i] ?? null;
295
+ return acc;
296
+ }, {} as Record<string, any>);
297
+
298
+ // Skip fully empty rows
299
+ if (Object.values(record).every((v) => v === null || this.cleanString(v) === '')) continue;
300
+
301
+ rows.push(record);
302
+ }
303
+
304
+ return { headers, rows };
305
+ }
306
+
307
+ public parseAndValidateDate(value: string): Date | null {
308
+ return parseFlexibleDate(value);
309
+ }
310
+
162
311
  }