@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
@@ -0,0 +1,89 @@
1
+ # Grouping & Aggregation Enhancements (Code Review Summary)
2
+
3
+ This document explains the recent changes to grouping/aggregation in the CRUD helper/service, why they were made, and how to use them (with examples on `PincodeMaster`).
4
+
5
+ ## What Changed and Why
6
+ - **Dedicated grouping pipeline**: Grouping no longer reuses the record-level query (which had `SELECT entity.*`, pagination, and default order). A separate path builds clean group queries to avoid SQL errors and ensure correct counts.
7
+ - **Multiple group-by fields**: The one-field limit was removed. You can now group on multiple fields (including relations) in the requested order.
8
+ - **Relation-safe grouping**: Group-by fields can traverse many-to-one relations (e.g., `state.name`, `city.name`). The helper reuses existing joins (from filters) or adds the necessary joins and aliases.
9
+ - **Date granularity**: Grouping supports `day`, `week`, `month`, `year` granularities in a DB-aware way (Postgres, MySQL/MariaDB, SQL Server).
10
+ - **Aggregates**: Supports a core, DB-agnostic set: `count`, `count_distinct`, `sum`, `avg`, `min`, `max`. If `aggregates` is omitted, it defaults to `count(*)`.
11
+ - **Group sorting/pagination**: Sorting and pagination are applied to group rows (not entity rows). Record pagination is kept separate for non-grouped queries.
12
+ - **Ordered group names**: Group names follow the order of `groupBy` fields. Relation values and date/grouped values are included in sequence.
13
+ - **Formatted date group labels**: You can add an optional format specifier to a date groupBy field: `field:granularity:format`. Supported formats: `MMM`, `MMMM`, `YYYY`, `YYYY-MM`, `YYYY-MM-DD` (defaults to the raw value if omitted).
14
+ - **Count of groups**: Group counts are computed without pagination interference, so `meta.totalRecords` reflects total groups.
15
+ - **DTO update**: `BasicFilterDto` now includes optional `aggregates?: string[]`.
16
+
17
+ ## Caveats
18
+ - `populateGroup` is **not** supported when grouping on relation fields (e.g., `state.name`, `city.name`). Use it for scalar group-by fields only; otherwise fetch group metadata and then retrieve records in a separate call with the group key.
19
+ - Sorting works for group keys without extra colons (e.g., `state.name`) and for aggregate aliases (e.g., `id_max`). For date bucket group keys with granularity/format (`createdAt:month:YYYY`), the sort parser treats the last segment as the order; results may vary by driver and may not sort as expected in all cases.
20
+
21
+ ## Usage Examples (PincodeMaster)
22
+ Assume `PincodeMaster` has many-to-one `state` and `city` relations and a `createdAt` timestamp.
23
+
24
+ ### 1) Group by State and City
25
+ ```
26
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=state.name&groupBy[1]=city.name
27
+ ```
28
+ Returns groups for every state/city combination with default `count(*)` aggregate.
29
+
30
+ ### 2) Group by Relation + Filter on Relation
31
+ ```
32
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=state.name&filters[state][name][$eq]=Maharashtra
33
+ ```
34
+ Groups by state name but only for rows where state is Maharashtra.
35
+
36
+ ### 3) Multiple Group Fields (Relation + Scalar)
37
+ ```
38
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=state.name&groupBy[1]=city.name&groupBy[2]=pincode
39
+ ```
40
+ Group names are ordered: state → city → pincode.
41
+
42
+ ### 4) Group by Date with Granularity (Month)
43
+ ```
44
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=createdAt:month
45
+ ```
46
+ Groups by month (driver-aware), default group labels are raw date buckets.
47
+
48
+ ### 5) Date Granularity with Formatting
49
+ ```
50
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=createdAt:month:MMM
51
+ ```
52
+ Group labels use short month names (Jan, Feb, …). For full names: `createdAt:month:MMMM`. Other formats: `YYYY`, `YYYY-MM`, `YYYY-MM-DD`.
53
+
54
+ ### 6) Aggregates (Count Distinct)
55
+ ```
56
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=state.name&aggregates[0]=pincode:count_distinct
57
+ ```
58
+ Shows distinct pincodes per state.
59
+
60
+ ### 7) Aggregates (Multiple)
61
+ ```
62
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=state.name&groupBy[1]=city.name&aggregates[0]=id:count&aggregates[1]=id:count_distinct
63
+ ```
64
+ Returns both total rows and distinct IDs per state/city group.
65
+
66
+ ### 8) Date Granularity + Relations + Aggregates
67
+ ```
68
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=createdAt:year&groupBy[1]=state.name&aggregates[0]=pincode:count_distinct
69
+ ```
70
+ Distinct pincodes per state, per year.
71
+
72
+ ### 9) Filters with Grouping (Many-to-One)
73
+ ```
74
+ GET /api/pincode-master?offset=0&limit=200&groupBy[0]=state.name&groupBy[1]=city.name&filters[state][name][$eq]=Nagaland
75
+ ```
76
+ Groups only rows where state.name = Nagaland.
77
+
78
+ ### 10) Group Sorting and Pagination
79
+ - Sorting applies to the group rows. Example:
80
+ ```
81
+ GET /api/pincode-master?offset=0&limit=50&groupBy[0]=state.name&sort[0]=state.name:ASC
82
+ ```
83
+ - Pagination (`offset/limit`) limits the number of groups returned; total group count remains in `meta.totalRecords`.
84
+
85
+ ## Notes and Behavior
86
+ - If `aggregates` is omitted, `COUNT(*)` is added automatically.
87
+ - Group names reflect `groupBy` order and apply formatting when specified.
88
+ - Group queries reuse joins from filters when possible; otherwise, they create necessary joins for relation paths.
89
+ - Non-grouped find behavior remains unchanged.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core",
3
- "version": "1.2.200",
3
+ "version": "1.2.202",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,44 @@
1
+ import { Command, CommandRunner, Option } from 'nest-commander';
2
+ import { FixturesService } from 'src/services/fixtures.service';
3
+
4
+ interface CommandOptions {
5
+ scenario: string;
6
+ module: string;
7
+ }
8
+
9
+ @Command({
10
+ name: 'fixtures setup',
11
+ description: 'Handles setup and tear down of fixtures for the SolidX application',
12
+ })
13
+ export class FixturesSetupCommand extends CommandRunner {
14
+ constructor(
15
+ private readonly fixturesService: FixturesService,
16
+ ) {
17
+ super();
18
+ }
19
+
20
+ async run(_passedParam: string[], options?: CommandOptions): Promise<void> {
21
+ await this.fixturesService.setupFixtures(options.module, options.scenario);
22
+ }
23
+
24
+ // Accept the task name i.e setup/tear-down for the fixtures command
25
+ @Option({
26
+ flags: '-s, --scenario [scenario name]',
27
+ description: 'Setup scenario name for the fixtures command',
28
+ required: true,
29
+ })
30
+ parseScenario(val: string): string {
31
+ return val;
32
+ }
33
+
34
+ // Accept the module name as an argument
35
+ @Option({
36
+ flags: '-m, --module-name [module name]',
37
+ description: 'Module Name from the ss_model_metadata table',
38
+ required: true,
39
+ })
40
+ parseModule(val: string): string {
41
+ return val;
42
+ }
43
+
44
+ }
@@ -0,0 +1,45 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import { Command, CommandRunner, Option } from 'nest-commander';
3
+ import { SolidIntrospectService } from 'src/services/solid-introspect.service';
4
+
5
+ interface CommandOptions {
6
+ scenario: string;
7
+ module: string;
8
+ }
9
+
10
+ @Command({
11
+ name: 'fixtures tear-down',
12
+ description: 'Handles setup and tear down of fixtures for the SolidX application',
13
+ })
14
+ export class FixturesTearDownCommand extends CommandRunner {
15
+ constructor(
16
+ private readonly introspectService: SolidIntrospectService,
17
+ ) {
18
+ super();
19
+ }
20
+ private readonly logger = new Logger(this.constructor.name);
21
+
22
+ async run(_passedParam: string[], options?: CommandOptions): Promise<void> {
23
+ }
24
+
25
+ // Accept the task name i.e setup/tear-down for the fixtures command
26
+ @Option({
27
+ flags: '-s, --scenario [scenario name]',
28
+ description: 'Setup scenario name for the fixtures command',
29
+ required: true,
30
+ })
31
+ parseScenario(val: string): string {
32
+ return val;
33
+ }
34
+
35
+ // Accept the module name as an argument
36
+ @Option({
37
+ flags: '-m, --module [module name]',
38
+ description: 'Module Name from the ss_model_metadata table',
39
+ required: true,
40
+ })
41
+ parseModule(val: string): string {
42
+ return val;
43
+ }
44
+
45
+ }
@@ -1,7 +1,8 @@
1
- import { BadRequestException, Logger } from '@nestjs/common';
1
+ import { BadRequestException, forwardRef, Inject, Logger } from '@nestjs/common';
2
2
  import { Command, CommandRunner, Option } from 'nest-commander';
3
3
  import { ModelMetadataService } from 'src/services/model-metadata.service';
4
4
  import { CommandError } from './helper';
5
+ import { In } from 'typeorm';
5
6
 
6
7
  interface CommandOptions {
7
8
  name?: string;
@@ -17,6 +18,7 @@ interface CommandOptions {
17
18
  })
18
19
  export class RefreshModelCommand extends CommandRunner {
19
20
  constructor(
21
+ @Inject(forwardRef(() => ModelMetadataService))
20
22
  private readonly modelMetadataService: ModelMetadataService,
21
23
  ) {
22
24
  super();
@@ -3,15 +3,19 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
3
3
  import { redisStore } from 'cache-manager-redis-store';
4
4
  import { isRedisConfigured } from 'src/helpers/environment.helper';
5
5
 
6
- export const RedisOptions: CacheModuleAsyncOptions = {
6
+ export const CacheManagerOptions: CacheModuleAsyncOptions = {
7
7
  isGlobal: true,
8
8
  imports: [ConfigModule],
9
9
  useFactory: async (configService: ConfigService) => {
10
+
11
+ // This defaults to in-memory cache
10
12
  if (!isRedisConfigured(configService)) {
11
13
  return {
12
14
  ttl: 0
13
- } // This defaults to in-memory cache
15
+ }
14
16
  }
17
+
18
+ // If redis is configured we use that...
15
19
  const store = await createRedisStore(configService);
16
20
  return {
17
21
  store: () => store,
@@ -28,4 +32,3 @@ async function createRedisStore(configService: ConfigService<Record<string, unkn
28
32
  },
29
33
  });
30
34
  }
31
-
@@ -26,6 +26,7 @@ export const iamConfig = registerAs('iam', () => {
26
26
  iamAutoGeneratedPassword:process.env.IAM_AUTOGENERATED_PASSWORD || true,
27
27
  passwordPepper: process.env.IAM_PASSWORD_PEPPER || '', // Adding a pepper to the password hashing process for extra security,
28
28
  showNameFieldsForRegistration:process.env.IAM_SHOW_NAME_FIELDS_FOR_REGISTRATION === 'true' ? true : false,
29
+ sendWelcomeEmailOnSignup: (process.env.IAM_SEND_WELCOME_EMAIL_ON_SIGNUP ?? 'false').toLowerCase() === 'true',
30
+ sendWelcomeSmsOnSignup: (process.env.IAM_SEND_WELCOME_SMS_ON_SIGNUP ?? 'false').toLowerCase() === 'true',
29
31
  };
30
32
  })
31
-
@@ -84,7 +84,7 @@ export const ERROR_MESSAGES = {
84
84
  FIELD_NOT_FOUND: (id: number | string) => `No field with id #${id} exists`,
85
85
  PROVIDER_NOT_FOUND: (provider: string) => `Field incorrectly configured. No provider with name ${provider} registered in backend.`,
86
86
  FILE_WRITE_FAILED: 'File creation failed, rolling back transaction',
87
-
87
+ FILE_DELETE_FAILED: 'File deletion failed, rolling back transaction',
88
88
  // file service errors
89
89
  FILE_NOT_FOUND: 'File not found',
90
90
  FILE_COPY_ERROR: 'Error copying file',
@@ -123,4 +123,10 @@ export const ERROR_MESSAGES = {
123
123
  UNABLE_TO_RESOLVE_MCP_HANDLER: 'Unable to resolve a mcp tool handler.',
124
124
 
125
125
  DEFAULT_REGEX_PATTERN_NOT_MATCHING_ERROR_MSG: 'Invalid regex pattern.',
126
+
127
+ PERMISSION_MESSAGES: {
128
+ insertMany: (model?: string) =>
129
+ `You do not have permission to import ${model ?? 'these'} records.`,
130
+ } as Record<string, (model?: string) => string>,
131
+
126
132
  };
@@ -5,6 +5,7 @@ import { BasicFilterDto } from '../dtos/basic-filters.dto';
5
5
  import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
6
6
  import { UpdateModelMetaDataDto } from '../dtos/update-model-metadata.dto';
7
7
  import { ModelMetadataService } from '../services/model-metadata.service';
8
+ import { NavigationDto } from 'src/dtos/navigation.dto';
8
9
 
9
10
  @Controller('model-metadata')
10
11
  @ApiTags("Solid Core")
@@ -43,13 +44,31 @@ export class ModelMetadataController {
43
44
  offset: 0,
44
45
  filters: [],
45
46
  groupBy: [],
46
- populate: [],
47
+ populate: [],
47
48
  populateMedia: [],
48
49
  sort: []
49
50
  }
50
51
  return this.modelMetadataService.findMany(basicFilterDto);
51
52
  }
52
53
 
54
+ @ApiBearerAuth("jwt")
55
+ @ApiQuery({ name: 'modelName', required: true, type: String })
56
+ @ApiQuery({ name: 'recordId', required: true, type: Number })
57
+ @ApiQuery({ name: 'limit', required: false, type: Number })
58
+ @ApiQuery({ name: 'offset', required: false, type: Number })
59
+ @ApiQuery({ name: 'fields', required: false, type: Array })
60
+ @ApiQuery({ name: 'sort', required: false, type: Array })
61
+ @ApiQuery({ name: 'groupBy', required: false, type: Array })
62
+ @ApiQuery({ name: 'populate', required: false, type: Array })
63
+ @ApiQuery({ name: 'populateMedia', required: false, type: Array })
64
+ @ApiQuery({ name: 'filters', required: false, type: Array })
65
+ @Get("/navigation")
66
+ async navigation(
67
+ @Query() navigationDto: NavigationDto
68
+ ) {
69
+ return this.modelMetadataService.navigation(navigationDto);
70
+ }
71
+
53
72
  @ApiBearerAuth("jwt")
54
73
  @Get(':id')
55
74
  findOne(@Param('id', ParseIntPipe) id: number, @Query() query: any) {
@@ -94,4 +113,5 @@ export class ModelMetadataController {
94
113
  return this.modelMetadataService.remove(id);
95
114
  }
96
115
 
116
+
97
117
  }
@@ -0,0 +1,93 @@
1
+ import { Controller, Post, Body, Param, UploadedFiles, UseInterceptors, Put, Get, Query, Delete, Patch } from '@nestjs/common';
2
+ import { AnyFilesInterceptor } from "@nestjs/platform-express";
3
+ import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
4
+ import { ModelSequenceService } from '../services/model-sequence.service';
5
+ import { CreateModelSequenceDto } from '../dtos/create-model-sequence.dto';
6
+ import { UpdateModelSequenceDto } from '../dtos/update-model-sequence.dto';
7
+
8
+ enum ShowSoftDeleted {
9
+ INCLUSIVE = "inclusive",
10
+ EXCLUSIVE = "exclusive",
11
+ }
12
+
13
+ @ApiTags('Solid Core')
14
+ @Controller('model-sequence')
15
+ export class ModelSequenceController {
16
+ constructor(private readonly service: ModelSequenceService) {}
17
+
18
+ @ApiBearerAuth("jwt")
19
+ @Post()
20
+ @UseInterceptors(AnyFilesInterceptor())
21
+ create(@Body() createDto: CreateModelSequenceDto, @UploadedFiles() files: Array<Express.Multer.File>) {
22
+ return this.service.create(createDto, files);
23
+ }
24
+
25
+ @ApiBearerAuth("jwt")
26
+ @Post('/bulk')
27
+ @UseInterceptors(AnyFilesInterceptor())
28
+ insertMany(@Body() createDtos: CreateModelSequenceDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = []) {
29
+ return this.service.insertMany(createDtos, filesArray);
30
+ }
31
+
32
+
33
+ @ApiBearerAuth("jwt")
34
+ @Put(':id')
35
+ @UseInterceptors(AnyFilesInterceptor())
36
+ update(@Param('id') id: number, @Body() updateDto: UpdateModelSequenceDto, @UploadedFiles() files: Array<Express.Multer.File>) {
37
+ return this.service.update(id, updateDto, files);
38
+ }
39
+
40
+ @ApiBearerAuth("jwt")
41
+ @Patch(':id')
42
+ @UseInterceptors(AnyFilesInterceptor())
43
+ partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateModelSequenceDto, @UploadedFiles() files: Array<Express.Multer.File>) {
44
+ return this.service.update(id, updateDto, files, true);
45
+ }
46
+
47
+ @ApiBearerAuth("jwt")
48
+ @Post('/bulk-recover')
49
+ async recoverMany(@Body() ids: number[]) {
50
+ return this.service.recoverMany(ids);
51
+ }
52
+
53
+ @ApiBearerAuth("jwt")
54
+ @Get('/recover/:id')
55
+ async recover(@Param('id') id: number) {
56
+ return this.service.recover(id);
57
+ }
58
+
59
+ @ApiBearerAuth("jwt")
60
+ @ApiQuery({ name: 'showSoftDeleted', required: false, enum: ShowSoftDeleted })
61
+ @ApiQuery({ name: 'limit', required: false, type: Number })
62
+ @ApiQuery({ name: 'offset', required: false, type: Number })
63
+ @ApiQuery({ name: 'fields', required: false, type: Array })
64
+ @ApiQuery({ name: 'sort', required: false, type: Array })
65
+ @ApiQuery({ name: 'groupBy', required: false, type: Array })
66
+ @ApiQuery({ name: 'populate', required: false, type: Array })
67
+ @ApiQuery({ name: 'populateMedia', required: false, type: Array })
68
+ @ApiQuery({ name: 'filters', required: false, type: Array })
69
+ @Get()
70
+ async findMany(@Query() query: any) {
71
+ return this.service.find(query);
72
+ }
73
+
74
+ @ApiBearerAuth("jwt")
75
+ @Get(':id')
76
+ async findOne(@Param('id') id: string, @Query() query: any) {
77
+ return this.service.findOne(+id, query);
78
+ }
79
+
80
+ @ApiBearerAuth("jwt")
81
+ @Delete('/bulk')
82
+ async deleteMany(@Body() ids: number[]) {
83
+ return this.service.deleteMany(ids);
84
+ }
85
+
86
+ @ApiBearerAuth("jwt")
87
+ @Delete(':id')
88
+ async delete(@Param('id') id: number) {
89
+ return this.service.delete(id);
90
+ }
91
+
92
+
93
+ }
@@ -8,117 +8,125 @@ import { CreateSettingDto } from '../dtos/create-setting.dto';
8
8
  import { UpdateSettingDto } from '../dtos/update-setting.dto';
9
9
  import { SettingService } from '../services/setting.service';
10
10
 
11
- @ApiTags('Solid Core')
11
+ @ApiTags('Solid Core')
12
12
  @Controller('setting') //FIXME: Change this to the model plural name
13
13
  export class SettingController {
14
- constructor(private readonly service: SettingService) {}
14
+ constructor(private readonly service: SettingService) { }
15
15
 
16
16
  @ApiBearerAuth("jwt")
17
17
  @Post()
18
18
  @UseInterceptors(AnyFilesInterceptor())
19
- create(@Body() createDto: CreateSettingDto, @UploadedFiles() files: Array<Express.Multer.File>,@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
20
- return this.service.create(createDto, files,solidRequestContext);
19
+ create(@Body() createDto: CreateSettingDto, @UploadedFiles() files: Array<Express.Multer.File>, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
20
+ return this.service.create(createDto, files, solidRequestContext);
21
21
  }
22
22
 
23
23
  @ApiBearerAuth("jwt")
24
24
  @Post('/bulk')
25
25
  @UseInterceptors(AnyFilesInterceptor())
26
- insertMany(@Body() createDtos: CreateSettingDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = [],@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
27
- return this.service.insertMany(createDtos, filesArray,solidRequestContext);
26
+ insertMany(@Body() createDtos: CreateSettingDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = [], @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
27
+ return this.service.insertMany(createDtos, filesArray, solidRequestContext);
28
28
  }
29
29
 
30
+ /**
31
+ * Important to keep this method just above the @Put(':id') definition that follows as otherwise it will conflict.
32
+ *
33
+ * @param body
34
+ * @param files
35
+ * @returns
36
+ */
37
+ @ApiBearerAuth("jwt")
38
+ @Put('/bulk')
39
+ @UseInterceptors(AnyFilesInterceptor())
40
+ async updateSettings(@Body() body: any, @UploadedFiles() files: Array<Express.Multer.File>) {
41
+ let settings: CreateSettingDto[] = [];
42
+
43
+ try {
44
+ settings = typeof body.settings === 'string' ? JSON.parse(body.settings) : body.settings;
45
+ } catch (e) {
46
+ throw new BadRequestException('Invalid settings payload');
47
+ }
48
+ return this.service.updateSettings(settings, files);
49
+ }
30
50
 
31
51
  @ApiBearerAuth("jwt")
32
52
  @Put(':id')
33
53
  @UseInterceptors(AnyFilesInterceptor())
34
- update(@Param('id') id: number, @Body() updateDto: UpdateSettingDto, @UploadedFiles() files: Array<Express.Multer.File>,@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
35
- return this.service.update(id, updateDto, files,false,solidRequestContext);
54
+ update(@Param('id') id: number, @Body() updateDto: UpdateSettingDto, @UploadedFiles() files: Array<Express.Multer.File>, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
55
+ return this.service.update(id, updateDto, files, false, solidRequestContext);
36
56
  }
37
57
 
38
58
  @ApiBearerAuth("jwt")
39
59
  @Patch(':id')
40
60
  @UseInterceptors(AnyFilesInterceptor())
41
- partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateSettingDto, @UploadedFiles() files: Array<Express.Multer.File>,@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
42
- return this.service.update(id, updateDto, files, true,solidRequestContext);
61
+ partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateSettingDto, @UploadedFiles() files: Array<Express.Multer.File>, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
62
+ return this.service.update(id, updateDto, files, true, solidRequestContext);
43
63
  }
44
64
 
45
65
  @ApiBearerAuth("jwt")
46
66
  @Get('/wrapped')
47
67
  @Public()
48
68
  async wrapSettings() {
49
- return this.service.wrapSettings();
69
+ return this.service.wrapSettings();
50
70
  }
51
71
 
52
72
  @Get()
53
73
  async getAllSettings() {
54
74
  return this.service.getAllSettings();
55
75
  }
56
-
76
+
77
+ @ApiBearerAuth("jwt")
78
+ @ApiQuery({ name: 'showHeader', required: false, type: String })
79
+ @ApiQuery({ name: 'inListView', required: false, type: String })
80
+ @Get('/get-mcp-url')
81
+ getMcpUrl(@Query() query: any, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
82
+ return this.service.getMcpUrl(query, solidRequestContext);
83
+
84
+ }
85
+
57
86
  @ApiBearerAuth("jwt")
58
87
  @ApiQuery({ name: 'showSoftDeleted', required: false, type: Boolean })
59
88
  @ApiQuery({ name: 'showOnlySoftDeleted', required: false, type: Boolean })
60
89
  @ApiQuery({ name: 'limit', required: false, type: Number })
61
90
  @ApiQuery({ name: 'offset', required: false, type: Number })
62
91
  @ApiQuery({ name: 'fields', required: false, type: Array })
63
- @ApiQuery({ name: 'sort', required: false, type: Array })
92
+ @ApiQuery({ name: 'sort', required: false, type: Array })
64
93
  @ApiQuery({ name: 'groupBy', required: false, type: Array })
65
94
  @ApiQuery({ name: 'populate', required: false, type: Array })
66
95
  @ApiQuery({ name: 'populateMedia', required: false, type: Array })
67
96
  @ApiQuery({ name: 'filters', required: false, type: Array })
68
97
  @Get()
69
- async findMany(@Query() query: any,@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
70
- return this.service.find(query,solidRequestContext);
98
+ async findMany(@Query() query: any, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
99
+ return this.service.find(query, solidRequestContext);
71
100
  }
72
101
 
73
102
  @ApiBearerAuth("jwt")
74
103
  @Get(':id')
75
- async findOne(@Param('id') id: string, @Query() query: any,@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
76
- return this.service.findOne(+id, query,solidRequestContext);
104
+ async findOne(@Param('id') id: string, @Query() query: any, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
105
+ return this.service.findOne(+id, query, solidRequestContext);
77
106
  }
78
107
 
79
108
  @Delete('/bulk')
80
- async deleteMany(@Body() ids: number[],@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
81
- return this.service.deleteMany(ids,solidRequestContext);
109
+ async deleteMany(@Body() ids: number[], @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
110
+ return this.service.deleteMany(ids, solidRequestContext);
82
111
  }
83
112
 
84
113
  @ApiBearerAuth("jwt")
85
114
  @Delete(':id')
86
- async delete(@Param('id') id: number,@SolidRequestContextDecorator() solidRequestContext:SolidRequestContextDto) {
87
- return this.service.delete(id,solidRequestContext);
115
+ async delete(@Param('id') id: number, @SolidRequestContextDecorator() solidRequestContext: SolidRequestContextDto) {
116
+ return this.service.delete(id, solidRequestContext);
88
117
  }
89
118
 
90
- @ApiBearerAuth("jwt")
91
- @Post('/bulk-update')
92
- @UseInterceptors(AnyFilesInterceptor())
93
- async updateSettings(
94
- @Body() body: any,
95
- @UploadedFiles() files: Array<Express.Multer.File>
96
- ) {
97
- let settings: CreateSettingDto[] = [];
119
+ // @ApiBearerAuth("jwt")
120
+ // @Post('/bulk/user')
121
+ // @UseInterceptors(AnyFilesInterceptor())
122
+ // async updateUserSettings(@Body() body: any, @UploadedFiles() files: Array<Express.Multer.File>) {
123
+ // let settings: CreateSettingDto[] = [];
124
+ // try {
125
+ // settings = typeof body.settings === 'string' ? JSON.parse(body.settings) : body.settings;
126
+ // } catch (e) {
127
+ // throw new BadRequestException('Invalid settings payload');
128
+ // }
129
+ // return this.service.updateSettings(settings, files);
130
+ // }
98
131
 
99
- try {
100
- settings = typeof body.settings === 'string' ? JSON.parse(body.settings) : body.settings;
101
- } catch (e) {
102
- throw new BadRequestException('Invalid settings payload');
103
- }
104
- return this.service.updateSettings(settings, files);
105
- }
106
-
107
-
108
- @ApiBearerAuth("jwt")
109
- @Post('/bulk/user')
110
- @UseInterceptors(AnyFilesInterceptor())
111
- async updateUserSettings(
112
- @Body() body: any,
113
- @UploadedFiles() files: Array<Express.Multer.File>
114
- ) {
115
- let settings: CreateSettingDto[] = [];
116
-
117
- try {
118
- settings = typeof body.settings === 'string' ? JSON.parse(body.settings) : body.settings;
119
- } catch (e) {
120
- throw new BadRequestException('Invalid settings payload');
121
- }
122
- return this.service.updateSettings(settings, files);
123
- }
124
132
  }
@@ -0,0 +1,7 @@
1
+ export const IS_SMS_PROVIDER = 'IS_SMS_PROVIDER';
2
+
3
+ export const SmsProvider = () => {
4
+ return (target: Function) => {
5
+ Reflect.defineMetadata(IS_SMS_PROVIDER, true, target);
6
+ };
7
+ };
@@ -3,6 +3,7 @@ import { ApiProperty } from "@nestjs/swagger";
3
3
  import { IsEnum, IsOptional } from "class-validator";
4
4
  import { PaginationQueryDto } from "./pagination-query.dto";
5
5
  import { Timestamp } from "typeorm";
6
+ import { BasicGroupFilterDto } from "./basic-group-filters.dto";
6
7
 
7
8
  export enum SoftDeleteFilter {
8
9
  INCLUSIVE = "inclusive",
@@ -23,6 +24,10 @@ export class BasicFilterDto extends PaginationQueryDto {
23
24
  @ApiProperty({ description: "groupBy" })
24
25
  readonly groupBy?: string[];
25
26
 
27
+ @IsOptional()
28
+ @ApiProperty({ description: "aggregates" })
29
+ readonly aggregates?: string[];
30
+
26
31
 
27
32
  @IsOptional()
28
33
  @ApiProperty({ description: "populate" })
@@ -51,7 +56,7 @@ export class BasicFilterDto extends PaginationQueryDto {
51
56
 
52
57
  @IsOptional()
53
58
  @ApiProperty({ description: "groupFilter" })
54
- groupFilter?: BasicFilterDto
59
+ groupFilter?: BasicGroupFilterDto
55
60
 
56
61
  @IsOptional()
57
62
  @ApiProperty({ description: "locale" })
@@ -0,0 +1,23 @@
1
+ import { Type } from "class-transformer";
2
+ import { IsInt, IsPositive, Min } from "class-validator";
3
+
4
+ import { ApiProperty } from "@nestjs/swagger";
5
+ import { IsOptional } from "class-validator";
6
+
7
+
8
+ export class BasicGroupFilterDto {
9
+ @IsOptional()
10
+ @Type(() => Number)
11
+ @IsPositive()
12
+ limit?: number = 10;
13
+
14
+ @IsOptional()
15
+ @Type(() => Number)
16
+ @IsInt()
17
+ @Min(0)
18
+ offset?: number = 0;
19
+
20
+ @IsOptional()
21
+ @ApiProperty({ description: "sort" })
22
+ sort?: string[];
23
+ }
@@ -385,7 +385,7 @@ export class CreateFieldMetadataDto {
385
385
  @ApiProperty({ description: 'Static values for selection. Only for type=selectionStatic', })
386
386
  @IsArray()
387
387
  @IsString({ each: true })
388
- @Matches(/^[\w\s\d-]+:[\w\s-]+$/, { each: true })
388
+ @Matches(/^[\w\s\d\-\/]+:[\w\s\-\/]+$/, { each: true })
389
389
  @IsOptional()
390
390
  selectionStaticValues: string[];
391
391