@solidstarters/solid-core 1.2.200 → 1.2.201

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 (371) 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/constants/error-messages.d.ts +2 -0
  13. package/dist/constants/error-messages.d.ts.map +1 -1
  14. package/dist/constants/error-messages.js +4 -0
  15. package/dist/constants/error-messages.js.map +1 -1
  16. package/dist/controllers/model-sequence.controller.d.ts +43 -0
  17. package/dist/controllers/model-sequence.controller.d.ts.map +1 -0
  18. package/dist/controllers/model-sequence.controller.js +179 -0
  19. package/dist/controllers/model-sequence.controller.js.map +1 -0
  20. package/dist/controllers/setting.controller.d.ts +1 -0
  21. package/dist/controllers/setting.controller.d.ts.map +1 -1
  22. package/dist/controllers/setting.controller.js +15 -0
  23. package/dist/controllers/setting.controller.js.map +1 -1
  24. package/dist/dtos/basic-filters.dto.d.ts +3 -1
  25. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  26. package/dist/dtos/basic-filters.dto.js +8 -2
  27. package/dist/dtos/basic-filters.dto.js.map +1 -1
  28. package/dist/dtos/basic-group-filters.dto.d.ts +6 -0
  29. package/dist/dtos/basic-group-filters.dto.d.ts.map +1 -0
  30. package/dist/dtos/basic-group-filters.dto.js +46 -0
  31. package/dist/dtos/basic-group-filters.dto.js.map +1 -0
  32. package/dist/dtos/create-field-metadata.dto.js +2 -2
  33. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  34. package/dist/dtos/create-model-sequence.dto.d.ts +14 -0
  35. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -0
  36. package/dist/dtos/create-model-sequence.dto.js +90 -0
  37. package/dist/dtos/create-model-sequence.dto.js.map +1 -0
  38. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  39. package/dist/dtos/create-role-metadata.dto.js +1 -0
  40. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  41. package/dist/dtos/get-mcp-url.dto.d.ts +5 -0
  42. package/dist/dtos/get-mcp-url.dto.d.ts.map +1 -0
  43. package/dist/dtos/get-mcp-url.dto.js +31 -0
  44. package/dist/dtos/get-mcp-url.dto.js.map +1 -0
  45. package/dist/dtos/resolve-s3-url.dto.d.ts +5 -5
  46. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  47. package/dist/dtos/resolve-s3-url.dto.js +7 -7
  48. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  49. package/dist/dtos/update-model-sequence.dto.d.ts +15 -0
  50. package/dist/dtos/update-model-sequence.dto.d.ts.map +1 -0
  51. package/dist/dtos/update-model-sequence.dto.js +94 -0
  52. package/dist/dtos/update-model-sequence.dto.js.map +1 -0
  53. package/dist/entities/common.entity.d.ts.map +1 -1
  54. package/dist/entities/common.entity.js +1 -0
  55. package/dist/entities/common.entity.js.map +1 -1
  56. package/dist/entities/legacy-common.entity.d.ts.map +1 -1
  57. package/dist/entities/legacy-common.entity.js +1 -0
  58. package/dist/entities/legacy-common.entity.js.map +1 -1
  59. package/dist/entities/model-sequence.entity.d.ts +15 -0
  60. package/dist/entities/model-sequence.entity.d.ts.map +1 -0
  61. package/dist/entities/model-sequence.entity.js +67 -0
  62. package/dist/entities/model-sequence.entity.js.map +1 -0
  63. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.d.ts.map +1 -1
  64. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js +13 -2
  65. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  66. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +0 -1
  67. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  68. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +4 -9
  69. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  70. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts +0 -1
  71. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts.map +1 -1
  72. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js +7 -8
  73. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js.map +1 -1
  74. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +0 -1
  75. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  76. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +4 -9
  77. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  78. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  79. package/dist/helpers/model-metadata-helper.service.js +6 -2
  80. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  81. package/dist/helpers/module-metadata-helper.service.d.ts +1 -0
  82. package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
  83. package/dist/helpers/module-metadata-helper.service.js +9 -0
  84. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  85. package/dist/helpers/module.helper.d.ts +1 -0
  86. package/dist/helpers/module.helper.d.ts.map +1 -1
  87. package/dist/helpers/module.helper.js +29 -3
  88. package/dist/helpers/module.helper.js.map +1 -1
  89. package/dist/helpers/solid-registry.d.ts +11 -0
  90. package/dist/helpers/solid-registry.d.ts.map +1 -1
  91. package/dist/helpers/solid-registry.js.map +1 -1
  92. package/dist/index.d.ts +3 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +4 -2
  95. package/dist/index.js.map +1 -1
  96. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts +1 -0
  97. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -1
  98. package/dist/jobs/computed-field-evaluation-subscriber.service.js +16 -4
  99. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -1
  100. package/dist/repository/media.repository.d.ts.map +1 -1
  101. package/dist/repository/media.repository.js +4 -0
  102. package/dist/repository/media.repository.js.map +1 -1
  103. package/dist/repository/model-sequence.repository.d.ts +14 -0
  104. package/dist/repository/model-sequence.repository.d.ts.map +1 -0
  105. package/dist/repository/model-sequence.repository.js +103 -0
  106. package/dist/repository/model-sequence.repository.js.map +1 -0
  107. package/dist/seeders/module-metadata-seeder.service.d.ts +7 -12
  108. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  109. package/dist/seeders/module-metadata-seeder.service.js +64 -26
  110. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  111. package/dist/seeders/seed-data/solid-core-metadata.json +343 -27
  112. package/dist/seeders/system-fields-seeder.service.d.ts +1 -0
  113. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  114. package/dist/seeders/system-fields-seeder.service.js +11 -2
  115. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  116. package/dist/services/action-metadata.service.d.ts.map +1 -1
  117. package/dist/services/action-metadata.service.js +1 -0
  118. package/dist/services/action-metadata.service.js.map +1 -1
  119. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  120. package/dist/services/ai-interaction.service.js +1 -0
  121. package/dist/services/ai-interaction.service.js.map +1 -1
  122. package/dist/services/authentication.service.d.ts.map +1 -1
  123. package/dist/services/authentication.service.js +22 -14
  124. package/dist/services/authentication.service.js.map +1 -1
  125. package/dist/services/chatter-message-details.service.d.ts.map +1 -1
  126. package/dist/services/chatter-message-details.service.js +1 -0
  127. package/dist/services/chatter-message-details.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts.map +1 -1
  129. package/dist/services/chatter-message.service.js +7 -3
  130. package/dist/services/chatter-message.service.js.map +1 -1
  131. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  132. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
  133. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  134. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +15 -0
  135. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -0
  136. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +72 -0
  137. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -0
  138. package/dist/services/crud-helper.service.d.ts +23 -6
  139. package/dist/services/crud-helper.service.d.ts.map +1 -1
  140. package/dist/services/crud-helper.service.js +257 -45
  141. package/dist/services/crud-helper.service.js.map +1 -1
  142. package/dist/services/crud.service.d.ts +3 -1
  143. package/dist/services/crud.service.d.ts.map +1 -1
  144. package/dist/services/crud.service.js +53 -24
  145. package/dist/services/crud.service.js.map +1 -1
  146. package/dist/services/database/database-bootstrap.service.d.ts +12 -0
  147. package/dist/services/database/database-bootstrap.service.d.ts.map +1 -0
  148. package/dist/services/database/database-bootstrap.service.js +115 -0
  149. package/dist/services/database/database-bootstrap.service.js.map +1 -0
  150. package/dist/services/email-template.service.d.ts +7 -7
  151. package/dist/services/email-template.service.d.ts.map +1 -1
  152. package/dist/services/email-template.service.js +8 -7
  153. package/dist/services/email-template.service.js.map +1 -1
  154. package/dist/services/excel.service.d.ts +10 -0
  155. package/dist/services/excel.service.d.ts.map +1 -1
  156. package/dist/services/excel.service.js +100 -0
  157. package/dist/services/excel.service.js.map +1 -1
  158. package/dist/services/field-metadata.service.d.ts +4 -1
  159. package/dist/services/field-metadata.service.d.ts.map +1 -1
  160. package/dist/services/field-metadata.service.js +35 -30
  161. package/dist/services/field-metadata.service.js.map +1 -1
  162. package/dist/services/file.service.d.ts +1 -0
  163. package/dist/services/file.service.d.ts.map +1 -1
  164. package/dist/services/file.service.js +9 -0
  165. package/dist/services/file.service.js.map +1 -1
  166. package/dist/services/fixtures.service.d.ts +13 -0
  167. package/dist/services/fixtures.service.d.ts.map +1 -0
  168. package/dist/services/fixtures.service.js +95 -0
  169. package/dist/services/fixtures.service.js.map +1 -0
  170. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  171. package/dist/services/genai/ingest-metadata.service.js +1 -1
  172. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  173. package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
  174. package/dist/services/import-transaction-error-log.service.js +1 -0
  175. package/dist/services/import-transaction-error-log.service.js.map +1 -1
  176. package/dist/services/import-transaction.service.d.ts.map +1 -1
  177. package/dist/services/import-transaction.service.js +7 -1
  178. package/dist/services/import-transaction.service.js.map +1 -1
  179. package/dist/services/list-of-values.service.d.ts +2 -2
  180. package/dist/services/list-of-values.service.d.ts.map +1 -1
  181. package/dist/services/list-of-values.service.js +2 -1
  182. package/dist/services/list-of-values.service.js.map +1 -1
  183. package/dist/services/locale.service.d.ts.map +1 -1
  184. package/dist/services/locale.service.js +1 -0
  185. package/dist/services/locale.service.js.map +1 -1
  186. package/dist/services/mail/smtp-email.service.js +0 -1
  187. package/dist/services/mail/smtp-email.service.js.map +1 -1
  188. package/dist/services/media.service.d.ts +3 -3
  189. package/dist/services/media.service.d.ts.map +1 -1
  190. package/dist/services/media.service.js +6 -4
  191. package/dist/services/media.service.js.map +1 -1
  192. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  193. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +17 -6
  194. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  195. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  196. package/dist/services/mediaStorageProviders/file-storage-provider.js +0 -13
  197. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  198. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  199. package/dist/services/menu-item-metadata.service.js +4 -0
  200. package/dist/services/menu-item-metadata.service.js.map +1 -1
  201. package/dist/services/model-metadata.service.d.ts.map +1 -1
  202. package/dist/services/model-metadata.service.js +2 -42
  203. package/dist/services/model-metadata.service.js.map +1 -1
  204. package/dist/services/model-sequence.service.d.ts +23 -0
  205. package/dist/services/model-sequence.service.d.ts.map +1 -0
  206. package/dist/services/model-sequence.service.js +55 -0
  207. package/dist/services/model-sequence.service.js.map +1 -0
  208. package/dist/services/module-metadata.service.d.ts +1 -0
  209. package/dist/services/module-metadata.service.d.ts.map +1 -1
  210. package/dist/services/module-metadata.service.js +35 -1
  211. package/dist/services/module-metadata.service.js.map +1 -1
  212. package/dist/services/permission-metadata.service.d.ts +5 -5
  213. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  214. package/dist/services/permission-metadata.service.js +6 -5
  215. package/dist/services/permission-metadata.service.js.map +1 -1
  216. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  217. package/dist/services/queues/database-subscriber.service.js +2 -1
  218. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  219. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  220. package/dist/services/queues/rabbitmq-subscriber.service.js +2 -2
  221. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  222. package/dist/services/role-metadata.service.d.ts.map +1 -1
  223. package/dist/services/role-metadata.service.js +1 -0
  224. package/dist/services/role-metadata.service.js.map +1 -1
  225. package/dist/services/scheduled-job.service.d.ts +6 -6
  226. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  227. package/dist/services/scheduled-job.service.js +8 -8
  228. package/dist/services/scheduled-job.service.js.map +1 -1
  229. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  230. package/dist/services/scheduled-jobs/scheduler.service.js +4 -0
  231. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  232. package/dist/services/security-rule.service.d.ts.map +1 -1
  233. package/dist/services/security-rule.service.js +1 -0
  234. package/dist/services/security-rule.service.js.map +1 -1
  235. package/dist/services/selection-providers/list-of-models-selection-provider.service.d.ts.map +1 -1
  236. package/dist/services/selection-providers/list-of-models-selection-provider.service.js +4 -0
  237. package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
  238. package/dist/services/setting.service.d.ts +7 -5
  239. package/dist/services/setting.service.d.ts.map +1 -1
  240. package/dist/services/setting.service.js +26 -4
  241. package/dist/services/setting.service.js.map +1 -1
  242. package/dist/services/sms-template.service.d.ts +7 -7
  243. package/dist/services/sms-template.service.d.ts.map +1 -1
  244. package/dist/services/sms-template.service.js +8 -7
  245. package/dist/services/sms-template.service.js.map +1 -1
  246. package/dist/services/solid-introspect.service.d.ts +4 -13
  247. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  248. package/dist/services/solid-introspect.service.js +4 -22
  249. package/dist/services/solid-introspect.service.js.map +1 -1
  250. package/dist/services/solid-ts-morph.service.js +2 -2
  251. package/dist/services/solid-ts-morph.service.js.map +1 -1
  252. package/dist/services/user-activity-history.service.d.ts.map +1 -1
  253. package/dist/services/user-activity-history.service.js +1 -0
  254. package/dist/services/user-activity-history.service.js.map +1 -1
  255. package/dist/services/user-view-metadata.service.d.ts.map +1 -1
  256. package/dist/services/user-view-metadata.service.js +3 -2
  257. package/dist/services/user-view-metadata.service.js.map +1 -1
  258. package/dist/services/user.service.d.ts.map +1 -1
  259. package/dist/services/user.service.js +1 -0
  260. package/dist/services/user.service.js.map +1 -1
  261. package/dist/services/view-metadata.service.d.ts +1 -1
  262. package/dist/services/view-metadata.service.d.ts.map +1 -1
  263. package/dist/services/view-metadata.service.js +3 -1
  264. package/dist/services/view-metadata.service.js.map +1 -1
  265. package/dist/solid-core-cli-db.module.d.ts.map +1 -1
  266. package/dist/solid-core-cli-db.module.js +5 -2
  267. package/dist/solid-core-cli-db.module.js.map +1 -1
  268. package/dist/solid-core.module.d.ts.map +1 -1
  269. package/dist/solid-core.module.js +18 -0
  270. package/dist/solid-core.module.js.map +1 -1
  271. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  272. package/dist/subscribers/audit.subscriber.js +5 -1
  273. package/dist/subscribers/audit.subscriber.js.map +1 -1
  274. package/dist/subscribers/computed-entity-field.subscriber.d.ts +4 -2
  275. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  276. package/dist/subscribers/computed-entity-field.subscriber.js +53 -12
  277. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  278. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +5 -0
  279. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -0
  280. package/dist/transformers/typeorm/local-date-time-transformer.js +26 -0
  281. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -0
  282. package/dist/tsconfig.tsbuildinfo +1 -1
  283. package/docs/grouping-enhancements.md +89 -0
  284. package/package.json +1 -1
  285. package/src/commands/fixtures/fixtures-setup.command.ts +44 -0
  286. package/src/commands/fixtures/fixtures-tear-down.command.ts +45 -0
  287. package/src/commands/refresh-model.command.ts +3 -1
  288. package/src/constants/error-messages.ts +7 -1
  289. package/src/controllers/model-sequence.controller.ts +93 -0
  290. package/src/controllers/setting.controller.ts +33 -21
  291. package/src/dtos/basic-filters.dto.ts +6 -1
  292. package/src/dtos/basic-group-filters.dto.ts +23 -0
  293. package/src/dtos/create-field-metadata.dto.ts +1 -1
  294. package/src/dtos/create-model-sequence.dto.ts +51 -0
  295. package/src/dtos/create-role-metadata.dto.ts +16 -3
  296. package/src/dtos/get-mcp-url.dto.ts +13 -0
  297. package/src/dtos/resolve-s3-url.dto.ts +9 -11
  298. package/src/dtos/update-model-sequence.dto.ts +53 -0
  299. package/src/entities/common.entity.ts +2 -2
  300. package/src/entities/legacy-common.entity.ts +2 -1
  301. package/src/entities/model-sequence.entity.ts +32 -0
  302. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +18 -5
  303. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +9 -9
  304. package/src/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.ts +16 -8
  305. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +9 -9
  306. package/src/helpers/model-metadata-helper.service.ts +6 -4
  307. package/src/helpers/module-metadata-helper.service.ts +18 -1
  308. package/src/helpers/module.helper.ts +40 -5
  309. package/src/helpers/solid-registry.ts +14 -0
  310. package/src/index.ts +3 -1
  311. package/src/jobs/computed-field-evaluation-subscriber.service.ts +15 -4
  312. package/src/repository/media.repository.ts +3 -2
  313. package/src/repository/model-sequence.repository.ts +97 -0
  314. package/src/seeders/module-metadata-seeder.service.ts +103 -29
  315. package/src/seeders/seed-data/solid-core-metadata.json +343 -27
  316. package/src/seeders/system-fields-seeder.service.ts +6 -2
  317. package/src/services/action-metadata.service.ts +3 -2
  318. package/src/services/ai-interaction.service.ts +2 -1
  319. package/src/services/authentication.service.ts +46 -14
  320. package/src/services/chatter-message-details.service.ts +2 -1
  321. package/src/services/chatter-message.service.ts +10 -4
  322. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +8 -7
  323. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +86 -0
  324. package/src/services/crud-helper.service.ts +287 -49
  325. package/src/services/crud.service.ts +83 -32
  326. package/src/services/database/database-bootstrap.service.ts +91 -0
  327. package/src/services/email-template.service.ts +11 -13
  328. package/src/services/excel.service.ts +146 -3
  329. package/src/services/field-metadata.service.ts +102 -55
  330. package/src/services/file.service.ts +9 -0
  331. package/src/services/fixtures.service.ts +108 -0
  332. package/src/services/genai/ingest-metadata.service.ts +4 -3
  333. package/src/services/import-transaction-error-log.service.ts +2 -1
  334. package/src/services/import-transaction.service.ts +8 -4
  335. package/src/services/list-of-values.service.ts +4 -4
  336. package/src/services/locale.service.ts +2 -1
  337. package/src/services/mail/smtp-email.service.ts +1 -1
  338. package/src/services/media.service.ts +10 -11
  339. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +22 -7
  340. package/src/services/mediaStorageProviders/file-storage-provider.ts +18 -13
  341. package/src/services/menu-item-metadata.service.ts +6 -2
  342. package/src/services/model-metadata.service.ts +50 -44
  343. package/src/services/model-sequence.service.ts +33 -0
  344. package/src/services/module-metadata.service.ts +49 -2
  345. package/src/services/permission-metadata.service.ts +8 -9
  346. package/src/services/queues/database-subscriber.service.ts +3 -1
  347. package/src/services/queues/rabbitmq-subscriber.service.ts +4 -2
  348. package/src/services/role-metadata.service.ts +1 -0
  349. package/src/services/scheduled-job.service.ts +9 -9
  350. package/src/services/scheduled-jobs/scheduler.service.ts +5 -0
  351. package/src/services/security-rule.service.ts +1 -0
  352. package/src/services/selection-providers/list-of-models-selection-provider.service.ts +5 -2
  353. package/src/services/setting.service.ts +33 -6
  354. package/src/services/sms-template.service.ts +11 -13
  355. package/src/services/solid-introspect.service.ts +6 -19
  356. package/src/services/solid-ts-morph.service.ts +2 -2
  357. package/src/services/user-activity-history.service.ts +3 -2
  358. package/src/services/user-view-metadata.service.ts +4 -3
  359. package/src/services/user.service.ts +2 -1
  360. package/src/services/view-metadata.service.ts +5 -4
  361. package/src/solid-core-cli-db.module.ts +5 -4
  362. package/src/solid-core.module.ts +18 -0
  363. package/src/subscribers/audit.subscriber.ts +3 -2
  364. package/src/subscribers/computed-entity-field.subscriber.ts +60 -17
  365. package/src/transformers/typeorm/local-date-time-transformer.ts +30 -0
  366. /package/sql/{mssql → default/mssql}/proc_CleanupModelMetadata.sql +0 -0
  367. /package/sql/{mssql → default/mssql}/proc_CleanupModuleMetadata.sql +0 -0
  368. /package/sql/{mssql/scratchpad.sql → default/mssql/scratchpad.sql.txt} +0 -0
  369. /package/sql/{postgres → default/postgres}/proc_CleanupModelMetadata.sql +0 -0
  370. /package/sql/{postgres → default/postgres}/proc_CleanupModuleMetadata.sql +0 -0
  371. /package/sql/{postgres/scratchpad.sql → default/postgres/scratchpad.sql.txt} +0 -0
@@ -47,8 +47,8 @@ export class SolidTsMorphService {
47
47
  },
48
48
  });
49
49
 
50
- this.logger.log(`SolidTsMorphService repoRoot = ${this.repoRoot}`);
51
- Object.entries(this.workspaceMap).forEach(([k, v]) => this.logger.log(`workspace '${k}' => ${v}`));
50
+ this.logger.debug(`SolidTsMorphService repoRoot = ${this.repoRoot}`);
51
+ Object.entries(this.workspaceMap).forEach(([k, v]) => this.logger.debug(`workspace '${k}' => ${v}`));
52
52
  }
53
53
 
54
54
  // ---- repo-root discovery ----
@@ -1,7 +1,7 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
- import { EntityManager, Repository } from 'typeorm';
4
+ import { EntityManager, In, Repository } from 'typeorm';
5
5
 
6
6
  import { CRUDService } from 'src/services/crud.service';
7
7
  import { ModelMetadataService } from 'src/services/model-metadata.service';
@@ -19,6 +19,7 @@ import { UserActivityHistoryRepository } from 'src/repository/user-activity-hist
19
19
  @Injectable()
20
20
  export class UserActivityHistoryService extends CRUDService<UserActivityHistory> {
21
21
  constructor(
22
+ @Inject(forwardRef(() => ModelMetadataService))
22
23
  readonly modelMetadataService: ModelMetadataService,
23
24
  readonly moduleMetadataService: ModuleMetadataService,
24
25
  readonly configService: ConfigService,
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { EntityManager, Repository } from 'typeorm';
@@ -19,6 +19,7 @@ import { UserViewMetadataRepository } from 'src/repository/user-view-metadata.re
19
19
  @Injectable()
20
20
  export class UserViewMetadataService extends CRUDService<UserViewMetadata> {
21
21
  constructor(
22
+ @Inject(forwardRef(() => ModelMetadataService))
22
23
  readonly modelMetadataService: ModelMetadataService,
23
24
  readonly moduleMetadataService: ModuleMetadataService,
24
25
  readonly configService: ConfigService,
@@ -42,13 +43,13 @@ export class UserViewMetadataService extends CRUDService<UserViewMetadata> {
42
43
  });
43
44
 
44
45
  if (existing) {
45
- existing.layout = JSON.parse(query.layout);
46
+ existing.layout = query.layout;
46
47
  return await this.repo.save(existing);
47
48
  } else {
48
49
  const newEntry = this.repo.create({
49
50
  user: { id: activeUser?.sub },
50
51
  viewMetadata: { id: query.viewMetadataId },
51
- layout: JSON.parse(query.layout)
52
+ layout: query.layout
52
53
  });
53
54
  return await this.repo.save(newEntry);
54
55
  }
@@ -1,4 +1,4 @@
1
- import { BadRequestException, Inject, Injectable } from '@nestjs/common';
1
+ import { BadRequestException, forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
  import { ConfigService, ConfigType } from '@nestjs/config';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
@@ -22,6 +22,7 @@ import { RoleMetadataRepository } from 'src/repository/role-metadata.repository'
22
22
  @Injectable()
23
23
  export class UserService extends CRUDService<User> {
24
24
  constructor(
25
+ @Inject(forwardRef(() => ModelMetadataService))
25
26
  readonly modelMetadataService: ModelMetadataService,
26
27
  readonly moduleMetadataService: ModuleMetadataService,
27
28
  readonly configService: ConfigService,
@@ -1,4 +1,4 @@
1
- import { BadRequestException, Injectable, Logger } from '@nestjs/common';
1
+ import { BadRequestException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
2
  import { ConfigService } from '@nestjs/config';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { InjectEntityManager } from '@nestjs/typeorm';
@@ -7,27 +7,27 @@ import { CRUDService } from 'src/services/crud.service';
7
7
  import { FileService } from "src/services/file.service";
8
8
  import { ModelMetadataService } from 'src/services/model-metadata.service';
9
9
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
10
- import { EntityManager } from 'typeorm';
10
+ import { EntityManager, In } from 'typeorm';
11
11
 
12
12
 
13
13
  import { classify } from '@angular-devkit/core/src/utils/strings';
14
14
  import { Locale } from 'src/entities/locale.entity';
15
15
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
16
16
  import { SolidRegistry } from 'src/helpers/solid-registry';
17
- import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
18
17
  import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
19
18
  import { ViewMetadataRepository } from 'src/repository/view-metadata.repository';
20
19
  import { UpdateViewMetadataDto } from '../dtos/update-view-metadata.dto';
21
20
  import { FieldMetadata } from '../entities/field-metadata.entity';
22
21
  import { ViewMetadata } from '../entities/view-metadata.entity';
23
22
  import { ActionMetadataService } from './action-metadata.service';
23
+ import { MenuItemMetadataService } from './menu-item-metadata.service';
24
24
  import { SolidIntrospectService } from './solid-introspect.service';
25
25
  import { UserViewMetadataService } from './user-view-metadata.service';
26
- import { MenuItemMetadataService } from './menu-item-metadata.service';
27
26
 
28
27
  @Injectable()
29
28
  export class ViewMetadataService extends CRUDService<ViewMetadata> {
30
29
  constructor(
30
+ @Inject(forwardRef(() => ModelMetadataService))
31
31
  readonly modelMetadataService: ModelMetadataService,
32
32
  readonly moduleMetadataService: ModuleMetadataService,
33
33
  readonly configService: ConfigService,
@@ -46,6 +46,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
46
46
  // private readonly fieldMetadataRepo: Repository<FieldMetadata>,
47
47
  // @InjectRepository(ModelMetadata)
48
48
  // private readonly modelMetadataRepo: Repository<ModelMetadata>,
49
+ @Inject(forwardRef(() => ModelMetadataRepository))
49
50
  private readonly modelMetadataRepo: ModelMetadataRepository,
50
51
  private readonly modelMetadataHelperService: ModelMetadataHelperService,
51
52
  readonly moduleRef: ModuleRef
@@ -4,7 +4,8 @@ import { join } from 'path';
4
4
  import { SnakeNamingStrategy } from 'typeorm-naming-strategies';
5
5
  import { WinstonTypeORMLogger } from './winston.logger';
6
6
  import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
7
-
7
+ import { parseBooleanEnv } from './helpers/environment.helper';
8
+ import { Logger } from 'winston';
8
9
  @Module({
9
10
  imports: [
10
11
  TypeOrmModule.forRootAsync({
@@ -47,9 +48,9 @@ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
47
48
  // autoLoadEntities: true,
48
49
  entities: entities,
49
50
  // your entities will be synced with the database (recommended: disable in prod)
50
- synchronize: Boolean(process.env.DEFAULT_DATABASE_SYNCHRONIZE),
51
- logging: Boolean(process.env.DEFAULT_DATABASE_LOGGING),
52
- // logger: new WinstonTypeORMLogger(logger), // Pass in the custom WinstonLogger
51
+ synchronize: parseBooleanEnv('DEFAULT_DATABASE_SYNCHRONIZE'),
52
+ logging: parseBooleanEnv('DEFAULT_DATABASE_LOGGING'),
53
+ logger: parseBooleanEnv('DEFAULT_DATABASE_LOGGING') ? new WinstonTypeORMLogger(logger) : undefined, // Pass in the custom WinstonLogger
53
54
  namingStrategy: new SnakeNamingStrategy(),
54
55
  // subscribers: subscribers
55
56
  }
@@ -328,6 +328,15 @@ import { SecurityRuleSubscriber } from './subscribers/security-rule.subscriber';
328
328
  import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
329
329
  import { MediaStorageProviderMetadataRepository } from './repository/media-storage-provider-metadata.repository';
330
330
  import { McpCommand } from './commands/mcp.command';
331
+ import { FixturesService } from './services/fixtures.service';
332
+ import { FixturesSetupCommand } from './commands/fixtures/fixtures-setup.command';
333
+ import { FixturesTearDownCommand } from './commands/fixtures/fixtures-tear-down.command';
334
+ import { DatabaseBootstrapService } from './services/database/database-bootstrap.service';
335
+ import { SequenceNumComputedFieldProvider } from './services/computed-fields/entity/sequence-num-computed-field-provider';
336
+ import { ModelSequence } from './entities/model-sequence.entity';
337
+ import { ModelSequenceService } from './services/model-sequence.service';
338
+ import { ModelSequenceController } from './controllers/model-sequence.controller';
339
+ import { ModelSequenceRepository } from './repository/model-sequence.repository';
331
340
 
332
341
 
333
342
  @Global()
@@ -369,6 +378,7 @@ import { McpCommand } from './commands/mcp.command';
369
378
  UserActivityHistory,
370
379
  UserViewMetadata,
371
380
  ViewMetadata,
381
+ ModelSequence,
372
382
  ]),
373
383
  ConfigModule.forFeature(appBuilderConfig),
374
384
  ConfigModule.forFeature(commonConfig),
@@ -443,6 +453,7 @@ import { McpCommand } from './commands/mcp.command';
443
453
  UserController,
444
454
  UserViewMetadataController,
445
455
  ViewMetadataController,
456
+ ModelSequenceController,
446
457
  ],
447
458
  providers: [
448
459
  {
@@ -702,6 +713,13 @@ import { McpCommand } from './commands/mcp.command';
702
713
  ModuleMetadataRepository,
703
714
  ActionMetadataRepository,
704
715
  MediaStorageProviderMetadataRepository,
716
+ FixturesService,
717
+ FixturesSetupCommand,
718
+ FixturesTearDownCommand,
719
+ DatabaseBootstrapService,
720
+ SequenceNumComputedFieldProvider,
721
+ ModelSequenceService,
722
+ ModelSequenceRepository,
705
723
  ],
706
724
  exports: [
707
725
  AiInteractionService,
@@ -1,4 +1,4 @@
1
- import { Injectable, Scope } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable, Scope } from '@nestjs/common';
2
2
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
3
3
  import { lowerFirst } from 'src/helpers/string.helper';
4
4
  import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
@@ -21,6 +21,7 @@ export class AuditSubscriber implements EntitySubscriberInterface {
21
21
  private readonly chatterMessageService: ChatterMessageService,
22
22
  // @InjectRepository(ModelMetadata)
23
23
  // private readonly modelMetadataRepo: Repository<ModelMetadata>,
24
+ @Inject(forwardRef(() => ModelMetadataRepository))
24
25
  private readonly modelMetadataRepo: ModelMetadataRepository,
25
26
  private readonly modelMetadataHelperService: ModelMetadataHelperService,
26
27
  ) {
@@ -61,7 +62,7 @@ export class AuditSubscriber implements EntitySubscriberInterface {
61
62
 
62
63
  const auditFields = modelFields.filter(field =>
63
64
  field.enableAuditTracking &&
64
- !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&
65
+ !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&
65
66
  !(field.type === 'relation' && field.relationType === 'one-to-many')
66
67
  );
67
68
 
@@ -1,17 +1,18 @@
1
1
  import { camelize } from "@angular-devkit/core/src/utils/strings";
2
2
  import { forwardRef, Inject, Injectable, InternalServerErrorException, Logger, Scope } from "@nestjs/common";
3
+ import { model } from "mongoose";
3
4
  import { ComputedFieldTriggerOperation } from "src/dtos/create-field-metadata.dto";
4
- import { ComputedFieldMetadata, SolidRegistry } from "src/helpers/solid-registry";
5
+ import { ComputedFieldMetadata, SolidRegistry, TypeOrmEventContext } from "src/helpers/solid-registry";
5
6
  import { IEntityPreComputeFieldProvider } from "src/interfaces";
6
7
  import { PublisherFactory } from "src/services/queues/publisher-factory.service";
7
- import { DataSource, EntitySubscriberInterface, InsertEvent, UpdateEvent } from "typeorm";
8
+ import { DataSource, EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from "typeorm";
8
9
 
9
10
  // Create an interface i.e ComputedFieldEvaluationPayload which has same fields as the ComputedFieldMetadata and an additional field for the database entity
10
11
  export interface ComputedFieldEvaluationPayload extends ComputedFieldMetadata {
11
12
  databaseEntity: any;
12
13
  }
13
14
 
14
- @Injectable({scope: Scope.TRANSIENT})
15
+ @Injectable({ scope: Scope.TRANSIENT })
15
16
  // @EventSubscriber()
16
17
  export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface {
17
18
  private readonly logger = new Logger(this.constructor.name);
@@ -33,54 +34,66 @@ export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface
33
34
  }
34
35
 
35
36
  async beforeInsert(event: InsertEvent<any>): Promise<any> {
36
- await this.handleComputedFieldEvaluation(event.entity, ComputedFieldTriggerOperation.beforeInsert);
37
+ const modelName = camelize(event.metadata?.name ?? event.entity?.constructor?.name ?? '');
38
+ const eventContext = this.sanitizeEventContext(event, 'beforeInsert');
39
+ await this.handleComputedFieldEvaluation(event.entity, ComputedFieldTriggerOperation.beforeInsert, modelName, eventContext);
37
40
  }
38
41
 
39
42
  async beforeUpdate(event: UpdateEvent<any>): Promise<any> {
40
- await this.handleComputedFieldEvaluation(event.databaseEntity, ComputedFieldTriggerOperation.beforeUpdate);
43
+ const modelName = camelize(event.metadata?.name ?? event.entity?.constructor?.name ?? '');
44
+ const eventContext = this.sanitizeEventContext(event, 'beforeUpdate');
45
+ // await this.handleComputedFieldEvaluation(event.databaseEntity, ComputedFieldTriggerOperation.beforeUpdate, modelName, eventContext);
46
+ await this.handleComputedFieldEvaluation(event.entity, ComputedFieldTriggerOperation.beforeUpdate, modelName, eventContext);
41
47
  }
42
48
 
43
49
  afterInsert(event: InsertEvent<any>) {
44
- this.handleComputedFieldEvaluationJob(event.entity, ComputedFieldTriggerOperation.afterInsert);
50
+ const modelName = camelize(event.metadata?.name ?? event.entity?.constructor?.name ?? '');
51
+ const eventContext = this.sanitizeEventContext(event, 'afterInsert');
52
+ this.handleComputedFieldEvaluationJob(event.entity, ComputedFieldTriggerOperation.afterInsert, modelName, eventContext);
45
53
  }
46
54
 
47
55
  afterUpdate(event: UpdateEvent<any>) {
48
- this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterUpdate);
56
+ const modelName = camelize(event.metadata?.name ?? event.entity?.constructor?.name ?? event.databaseEntity?.constructor?.name ?? '');
57
+ const eventContext = this.sanitizeEventContext(event, 'afterUpdate');
58
+ // this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterUpdate, modelName, eventContext);
59
+ this.handleComputedFieldEvaluationJob(event.entity, ComputedFieldTriggerOperation.afterUpdate, modelName, eventContext);
49
60
  }
50
61
 
51
- afterRemove(event: any) {
52
- this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterRemove);
62
+ afterRemove(event: RemoveEvent<any>) {
63
+ const modelName = camelize(event.metadata?.name ?? event.entity?.constructor?.name ?? event.databaseEntity?.constructor?.name ?? '');
64
+ const eventContext = this.sanitizeEventContext(event, 'afterRemove');
65
+ this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterRemove, modelName, eventContext);
53
66
  }
54
67
 
55
68
  //FIXME: Need to add support for beforeRemove, beforeSoftRemove, afterSoftRemove, beforeRecover, afterRecover
56
69
 
57
- private async handleComputedFieldEvaluation(entity: any, currentOperation: ComputedFieldTriggerOperation): Promise<void> {
70
+ private async handleComputedFieldEvaluation(entity: any, currentOperation: ComputedFieldTriggerOperation, modelName: string, eventContext?: TypeOrmEventContext): Promise<void> {
58
71
  if (!entity) {
59
72
  return;
60
73
  }
61
74
  const computedFieldsTobeEvaluated = this.getComputedFieldsForEvaluation(
62
75
  this.solidRegistry.getComputedFieldMetadata(),
63
76
  currentOperation,
64
- camelize(entity.constructor.name)
77
+ modelName
65
78
  );
66
79
  //TODO: We can add a feature i.e dependsOn, where we can check if the computed field depends on other computed fields and evaluate them first
67
80
  await Promise.all(
68
- computedFieldsTobeEvaluated.map(c => this.evaluateComputedField(c, entity))
81
+ computedFieldsTobeEvaluated.map(c => this.evaluateComputedField(this.attachContext(c, eventContext), entity))
69
82
  )
70
83
  }
71
84
 
72
- private handleComputedFieldEvaluationJob(entity: any, currentOperation: ComputedFieldTriggerOperation) {
85
+ private handleComputedFieldEvaluationJob(entity: any, currentOperation: ComputedFieldTriggerOperation, modelName: string, eventContext?: TypeOrmEventContext) {
73
86
  if (!entity) {
74
87
  return;
75
88
  }
76
89
  const computedFieldsTobeEvaluated = this.getComputedFieldsForEvaluation(
77
90
  this.solidRegistry.getComputedFieldMetadata(),
78
91
  currentOperation,
79
- camelize(entity.constructor.name)
92
+ modelName
80
93
  );
81
94
  //TODO: We can add a feature i.e dependsOn, where we can check if the computed field depends on other computed fields and evaluate them first
82
95
  for (const computedField of computedFieldsTobeEvaluated) {
83
- this.enqueueComputedFieldEvaluationJob(computedField, entity);
96
+ this.enqueueComputedFieldEvaluationJob(this.attachContext(computedField, eventContext), entity, eventContext);
84
97
  }
85
98
  }
86
99
 
@@ -114,15 +127,45 @@ export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface
114
127
  }
115
128
  }
116
129
 
117
- private enqueueComputedFieldEvaluationJob(computedField: ComputedFieldMetadata<any>, databaseEntity: any) {
130
+ private enqueueComputedFieldEvaluationJob(computedField: ComputedFieldMetadata<any>, databaseEntity: any, eventContext?: any) {
118
131
  const payload = {
119
132
  ...computedField,
120
133
  databaseEntity,
134
+ // eventContext,
121
135
  };
122
- this.publisherFactory.publish({payload}, 'ComputedFieldEvaluationPublisher')
136
+ this.publisherFactory.publish({ payload }, 'ComputedFieldEvaluationPublisher')
123
137
  // this.computedFieldPublisher.publish({
124
138
  // payload
125
139
  // });
126
140
  }
127
141
 
142
+ private attachContext<T extends ComputedFieldMetadata<any>>(computedField: T, eventContext?: any): T {
143
+ if (!eventContext) return computedField;
144
+ return {
145
+ ...computedField,
146
+ computedFieldValueProviderCtxt: {
147
+ ...(computedField.computedFieldValueProviderCtxt || {}),
148
+ },
149
+ eventContext,
150
+ };
151
+ }
152
+
153
+ private sanitizeEventContext(event: any, eventType: string): TypeOrmEventContext {
154
+ if (!event) return undefined;
155
+ const base: TypeOrmEventContext = {
156
+ metadataName: event.metadata?.name,
157
+ entityId: event.entityId ?? event.entity?.id ?? event.databaseEntity?.id,
158
+ eventType: eventType,
159
+ };
160
+ if (event.updatedColumns) {
161
+ base.updatedColumns = event.updatedColumns.map((c: any) => c.propertyName);
162
+ }
163
+ if (event.updatedRelations) {
164
+ base.updatedRelations = event.updatedRelations.map((r: any) => r.propertyName);
165
+ }
166
+ if (event.entity) base.entity = event.entity;
167
+ if (event.databaseEntity) base.databaseEntity = event.databaseEntity;
168
+ return base;
169
+ }
170
+
128
171
  }
@@ -0,0 +1,30 @@
1
+ import dayjs from "dayjs";
2
+ import utc from "dayjs/plugin/utc";
3
+ import timezone from "dayjs/plugin/timezone";
4
+
5
+ dayjs.extend(utc);
6
+ dayjs.extend(timezone);
7
+
8
+ const SOLIDX_TZ = process.env.SOLIDX_TIMEZONE || "Asia/Kolkata";
9
+
10
+ export const LocalDateTimeTransformer = {
11
+ // DB → Entity
12
+ from(value: Date | string | null): Date | null {
13
+ if (!value) return null;
14
+
15
+ // SQL Server driver may give Date or string
16
+ const d = dayjs(value);
17
+
18
+ // Interpret DB value as SOLIDX_TZ wall time,
19
+ // then convert to a real UTC instant
20
+ return d.tz(SOLIDX_TZ, true).utc().toDate();
21
+ },
22
+
23
+ // Entity → DB
24
+ to(value: Date | null): Date | null {
25
+ if (!value) return null;
26
+
27
+ // Convert the instant back into SOLIDX_TZ wall time
28
+ return dayjs(value).tz(SOLIDX_TZ).toDate();
29
+ },
30
+ };