@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
@@ -22,9 +22,10 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
22
22
  ) { }
23
23
 
24
24
  async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
25
- if (!(entity instanceof CommonEntity)) {
26
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
27
- }
25
+ // if (!(entity instanceof CommonEntity)) {
26
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
27
+ // }
28
+ //@ts-ignore
28
29
  const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
29
30
  // Add the full URL to the media
30
31
  media.forEach(m => {
@@ -34,9 +35,9 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
34
35
  }
35
36
 
36
37
  async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
37
- if (!(entity instanceof CommonEntity)) {
38
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
39
- }
38
+ // if (!(entity instanceof CommonEntity)) {
39
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
40
+ // }
40
41
  const result: Media[] = [];
41
42
  for (const file of files) {
42
43
  // Store the file in the configured file storage directory
@@ -46,7 +47,8 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
46
47
 
47
48
  // Create an entry in the media table
48
49
  const mediaEntity = await this.mediaRepository.createMedia({
49
- entityId: entity.id,
50
+ //@ts-ignore
51
+ entityId: entity.id,
50
52
  modelMetadataId: mediaFieldMetadata.model.id,
51
53
  relativeUri: this.getFileName(file),
52
54
  mimeType: file.mimetype,
@@ -62,15 +64,16 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
62
64
  }
63
65
 
64
66
  async storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
65
- if (!(entity instanceof CommonEntity)) {
66
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
67
- }
67
+ // if (!(entity instanceof CommonEntity)) {
68
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
69
+ // }
68
70
  const result: Media[] = [];
69
71
  for (const pair of streamPairs) {
70
72
  const stream = pair[0];
71
73
  const fileName = pair[1];
72
74
  this.fileService.writeStreamToFile(stream, this.getFullFilePath(fileName));
73
75
  const mediaEntity = await this.mediaRepository.createMedia({
76
+ //@ts-ignore
74
77
  entityId: entity.id,
75
78
  modelMetadataId: mediaFieldMetadata.model.id,
76
79
  relativeUri: fileName,
@@ -83,10 +86,12 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
83
86
  }
84
87
 
85
88
  async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {
86
- if (!(entity instanceof CommonEntity)) {
87
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
88
- }
89
+ // if (!(entity instanceof CommonEntity)) {
90
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
91
+ // }
92
+ //@ts-ignore
89
93
  const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
94
+ //@ts-ignore
90
95
  this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
91
96
  existingMedia.forEach(media => {
92
97
  this.fileService.deleteFile(this.getFullFilePath(media.relativeUri));
@@ -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
  import { CRUDService } from 'src/services/crud.service';
6
6
  import { ModelMetadataService } from 'src/services/model-metadata.service';
7
7
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
@@ -21,6 +21,7 @@ import { SavedFiltersRepository } from 'src/repository/saved-filters.repository'
21
21
  @Injectable()
22
22
  export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
23
23
  constructor(
24
+ @Inject(forwardRef(() => ModelMetadataService))
24
25
  readonly modelMetadataService: ModelMetadataService,
25
26
  readonly moduleMetadataService: ModuleMetadataService,
26
27
  readonly configService: ConfigService,
@@ -165,6 +166,9 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
165
166
  if (!i.parentMenuItem) {
166
167
  return true
167
168
  } else {
169
+ if(i.action.type === 'custom'){
170
+ return true;
171
+ }
168
172
  return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)
169
173
  }
170
174
  });
@@ -1,4 +1,4 @@
1
- import { BadRequestException, Injectable, Logger, NotFoundException } from '@nestjs/common';
1
+ import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
2
2
  import { InjectDataSource } from '@nestjs/typeorm';
3
3
  import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
4
4
  import { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';
@@ -39,6 +39,7 @@ export class ModelMetadataService {
39
39
  // private readonly modelMetadataRepo: Repository<ModelMetadata>,
40
40
  // @InjectRepository(FieldMetadata)
41
41
  // private readonly fieldMetadataRepo: Repository<FieldMetadata>,
42
+ @Inject(forwardRef(() => ModelMetadataRepository))
42
43
  private readonly modelMetadataRepo: ModelMetadataRepository,
43
44
  private readonly fieldMetadataRepo: FieldMetadataRepository,
44
45
  private readonly schematicService: SchematicService,
@@ -610,57 +611,62 @@ export class ModelMetadataService {
610
611
  }
611
612
  }
612
613
 
614
+ await this.dataSource.query(
615
+ `CALL cleanup_model_metadata($1, $2)`,
616
+ [modelEntity.singularName, true],
617
+ );
618
+
613
619
  // Delete the permissions, menu, actions & views related to this model.
614
- const controllerName = `${classify(modelEntity.singularName)}Controller`;
615
- const permissionNames = [
616
- `${controllerName}.delete`,
617
- `${controllerName}.deleteMany`,
618
- `${controllerName}.findOne`,
619
- `${controllerName}.findMany`,
620
- `${controllerName}.recover`,
621
- `${controllerName}.recoverMany`,
622
- `${controllerName}.partialUpdate`,
623
- `${controllerName}.update`,
624
- `${controllerName}.insertMany`,
625
- `${controllerName}.create`,
626
- ];
627
- const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);
628
- const permissionsToDelete = await permissionsRepo.find({
629
- where: { name: In(permissionNames) },
630
- relations: ['roles'],
631
- });
620
+ // const controllerName = `${classify(modelEntity.singularName)}Controller`;
621
+ // const permissionNames = [
622
+ // `${controllerName}.delete`,
623
+ // `${controllerName}.deleteMany`,
624
+ // `${controllerName}.findOne`,
625
+ // `${controllerName}.findMany`,
626
+ // `${controllerName}.recover`,
627
+ // `${controllerName}.recoverMany`,
628
+ // `${controllerName}.partialUpdate`,
629
+ // `${controllerName}.update`,
630
+ // `${controllerName}.insertMany`,
631
+ // `${controllerName}.create`,
632
+ // ];
633
+ // const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);
634
+ // const permissionsToDelete = await permissionsRepo.find({
635
+ // where: { name: In(permissionNames) },
636
+ // relations: ['roles'],
637
+ // });
632
638
 
633
639
  // Remove role associations first
634
- for (const permission of permissionsToDelete) {
635
- if (permission.roles?.length) {
636
- await this.dataSource
637
- .createQueryBuilder()
638
- .relation(PermissionMetadata, 'roles')
639
- .of(permission) // permission instance or its ID
640
- .remove(permission.roles); // remove all linked roles
641
- }
642
- }
640
+ // for (const permission of permissionsToDelete) {
641
+ // if (permission.roles?.length) {
642
+ // await this.dataSource
643
+ // .createQueryBuilder()
644
+ // .relation(PermissionMetadata, 'roles')
645
+ // .of(permission) // permission instance or its ID
646
+ // .remove(permission.roles); // remove all linked roles
647
+ // }
648
+ // }
643
649
 
644
- await permissionsRepo.remove(permissionsToDelete);
650
+ // await permissionsRepo.remove(permissionsToDelete);
645
651
 
646
652
  // Delete actions
647
- const actionRepo = this.dataSource.getRepository(ActionMetadata);
648
- const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });
649
- await actionRepo.delete({ model: { id: modelEntity.id } });
650
-
651
- // Delete menu items
652
- const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);
653
- if (action) {
654
- const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });
655
- for (let i = 0; i < menuItems.length; i++) {
656
- const menuItem = menuItems[i];
657
- await menuItemRepo.remove(menuItem);
658
- }
659
- }
653
+ // const actionRepo = this.dataSource.getRepository(ActionMetadata);
654
+ // const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });
655
+ // await actionRepo.delete({ model: { id: modelEntity.id } });
656
+
657
+ // // Delete menu items
658
+ // const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);
659
+ // if (action) {
660
+ // const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });
661
+ // for (let i = 0; i < menuItems.length; i++) {
662
+ // const menuItem = menuItems[i];
663
+ // await menuItemRepo.remove(menuItem);
664
+ // }
665
+ // }
660
666
 
661
667
  // Delete view
662
- const viewRepo = this.dataSource.getRepository(ViewMetadata);
663
- await viewRepo.delete({ model: { id: modelEntity.id } })
668
+ // const viewRepo = this.dataSource.getRepository(ViewMetadata);
669
+ // await viewRepo.delete({ model: { id: modelEntity.id } })
664
670
 
665
671
  // <moduleName>-metadata.json | Remove references to this model in the model metadata, menu, action & view sections. | Automatic
666
672
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module?.name);
@@ -0,0 +1,33 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
3
+ import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
+ import { EntityManager, Repository } from 'typeorm';
5
+
6
+ import { CRUDService } from 'src/services/crud.service';
7
+ import { ModelMetadataService } from 'src/services/model-metadata.service';
8
+ import { ModuleMetadataService } from 'src/services/module-metadata.service';
9
+ import { ConfigService } from '@nestjs/config';
10
+ import { FileService } from 'src/services/file.service';
11
+ import { CrudHelperService } from 'src/services/crud-helper.service';
12
+
13
+ import { ModelSequence } from '../entities/model-sequence.entity';
14
+ import { ModelSequenceRepository } from '../repository/model-sequence.repository';
15
+
16
+ @Injectable()
17
+ export class ModelSequenceService extends CRUDService<ModelSequence>{
18
+ constructor(
19
+ readonly modelMetadataService: ModelMetadataService,
20
+ readonly moduleMetadataService: ModuleMetadataService,
21
+ readonly configService: ConfigService,
22
+ readonly fileService: FileService,
23
+ readonly discoveryService: DiscoveryService,
24
+ readonly crudHelperService: CrudHelperService,
25
+ @InjectEntityManager()
26
+ readonly entityManager: EntityManager,
27
+ readonly repo: ModelSequenceRepository,
28
+ readonly moduleRef: ModuleRef
29
+
30
+ ) {
31
+ super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService,entityManager, repo, 'modelSequence', 'solid-core', moduleRef);
32
+ }
33
+ }
@@ -4,7 +4,7 @@ import { DataSource, EntityManager, Repository, SelectQueryBuilder } from 'typeo
4
4
  import { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';
5
5
  import { ModuleMetadata } from '../entities/module-metadata.entity';
6
6
 
7
- import { classify } from '@angular-devkit/core/src/utils/strings';
7
+ import { classify, dasherize } from '@angular-devkit/core/src/utils/strings';
8
8
  import { ConfigService } from '@nestjs/config';
9
9
  import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
10
10
  import * as path from 'path'; // To handle file paths
@@ -320,7 +320,54 @@ export class ModuleMetadataService {
320
320
 
321
321
  async remove(id: number) {
322
322
  const entity = await this.findOne(id);
323
- return this.moduleMetadataRepo.remove(entity);
323
+ await this.cleanupOnDelete(entity.id);
324
+ const r = await this.moduleMetadataRepo.remove(entity);
325
+ return r
326
+
327
+ }
328
+
329
+
330
+ async cleanupOnDelete(moduleEntityId: number) {
331
+ const moduleEntity = await this.moduleMetadataRepo.findOne({
332
+ where: {
333
+ // @ts-ignore
334
+ id: moduleEntityId,
335
+ }
336
+ });
337
+
338
+ if (!moduleEntity) {
339
+ this.logger.log(`Invalid moduleEntityId: ${moduleEntityId} unable to resolve model metadata`);
340
+ return;
341
+ }
342
+ if (moduleEntity.id !== moduleEntityId) {
343
+ this.logger.log(`Invalid moduleEntityId: ${moduleEntityId} unable to resolve model metadata id ${moduleEntity.id} not matching with the one passed as argument ${moduleEntityId}`);
344
+ return;
345
+ }
346
+
347
+ this.logger.log(`Cleaning up for module: ${moduleEntity.name}.`);
348
+
349
+ const modulePath = await this.moduleMetadataHelperService.getModulePath(moduleEntity.name);
350
+ if (modulePath) {
351
+
352
+ this.logger.log(`Module path: ${modulePath}`);
353
+
354
+ // Metadata file to be deleted
355
+ const moduleMetadataPAth = await this.moduleMetadataHelperService.getModuleMetadataFolderPath(moduleEntity.name)
356
+ this.logger.log(`About to delete module metadata path: ${moduleMetadataPAth}`);
357
+
358
+ try {
359
+ await fs.rm(modulePath, { recursive: true, force: true });
360
+ await fs.rm(moduleMetadataPAth, { recursive: true, force: true });
361
+ this.logger.log(`Deleted file: ${moduleMetadataPAth}`);
362
+ } catch (error) {
363
+ this.logger.error(`Error deleting file: ${moduleMetadataPAth}`, error);
364
+ throw new Error(ERROR_MESSAGES.FILE_DELETE_FAILED); // Trigger rollback
365
+ }
366
+ }
367
+ await this.dataSource.query(
368
+ `CALL cleanup_module_metadata($1, $2)`,
369
+ [moduleEntity.name, true],
370
+ );
324
371
  }
325
372
 
326
373
  async deleteMany(ids: number[]): Promise<any> {
@@ -1,23 +1,22 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
+ import { ConfigService } from '@nestjs/config';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
- import { EntityManager, In, Repository } from 'typeorm';
4
+ import { InjectEntityManager } from '@nestjs/typeorm';
5
+ import { CrudHelperService } from "src/services/crud-helper.service";
5
6
  import { CRUDService } from 'src/services/crud.service';
7
+ import { FileService } from "src/services/file.service";
6
8
  import { ModelMetadataService } from 'src/services/model-metadata.service';
7
9
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
8
- import { ConfigService } from '@nestjs/config';
9
- import { FileService } from "src/services/file.service";
10
- import { CrudHelperService } from "src/services/crud-helper.service";
10
+ import { EntityManager, In } from 'typeorm';
11
11
 
12
12
 
13
- import { PermissionMetadata } from '../entities/permission-metadata.entity';
14
- import { ActiveUserData } from '../interfaces/active-user-data.interface';
15
- import { classify } from '@angular-devkit/core/src/utils/strings';
16
13
  import { PermissionMetadataRepository } from 'src/repository/permission-metadata.repository';
14
+ import { PermissionMetadata } from '../entities/permission-metadata.entity';
17
15
 
18
16
  @Injectable()
19
17
  export class PermissionMetadataService extends CRUDService<PermissionMetadata> {
20
18
  constructor(
19
+ @Inject(forwardRef(() => ModelMetadataService))
21
20
  readonly modelMetadataService: ModelMetadataService,
22
21
  readonly moduleMetadataService: ModuleMetadataService,
23
22
  readonly configService: ConfigService,
@@ -99,8 +99,10 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
99
99
 
100
100
  async onModuleInit(): Promise<void> {
101
101
  const defaultBroker = process.env.QUEUES_DEFAULT_BROKER || 'database';
102
+ const solidCliRunning = process.env.SOLID_CLI_RUNNING || "false";
103
+
102
104
  // we will start subscriber only if the current service role is subscriber.
103
- if (['both', 'subscriber'].includes(this.serviceRole) && defaultBroker === 'database') {
105
+ if (['both', 'subscriber'].includes(this.serviceRole) && defaultBroker === 'database' && solidCliRunning === "false") {
104
106
 
105
107
  const options = this.options();
106
108
 
@@ -52,8 +52,10 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
52
52
  }
53
53
 
54
54
  async onModuleInit(): Promise<void> {
55
+ const solidCliRunning = process.env.SOLID_CLI_RUNNING || "false";
56
+
55
57
  // we will start subscriber only if the current service role is subscriber.
56
- if (this.url && ['both', 'subscriber'].includes(this.serviceRole)) {
58
+ if (this.url && ['both', 'subscriber'].includes(this.serviceRole) && solidCliRunning === "false") {
57
59
 
58
60
  // this.logger.debug(`RabbitMqSubscriber instance created with options: ${JSON.stringify(this.options())} and url: ${this.url}`);
59
61
  // const connection = await amqp.connect(this.url);
@@ -92,7 +94,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
92
94
  async (rawMessage) => {
93
95
  if (rawMessage) {
94
96
  const messageContentString = rawMessage.content.toString();
95
- this.logger.debug(`RabbitMqSubscriber Received raw message: ${messageContentString}`);
97
+ // this.logger.debug(`RabbitMqSubscriber Received raw message: ${messageContentString}`);
96
98
 
97
99
  let message: QueueMessage<T> = null;
98
100
 
@@ -23,6 +23,7 @@ export class RoleMetadataService extends CRUDService<RoleMetadata> {
23
23
  constructor(
24
24
  @Inject(forwardRef(() => ModelMetadataService))
25
25
  readonly modelMetadataService: ModelMetadataService,
26
+ @Inject(forwardRef(() => ModuleMetadataService))
26
27
  readonly moduleMetadataService: ModuleMetadataService,
27
28
  readonly configService: ConfigService,
28
29
  readonly fileService: FileService,
@@ -1,22 +1,22 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
1
+ import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
+ import { ConfigService } from '@nestjs/config';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
- import { EntityManager, Repository } from 'typeorm';
4
+ import { InjectEntityManager } from '@nestjs/typeorm';
5
5
  import { ScheduledJob } from 'src/entities/scheduled-job.entity';
6
- import { ModelMetadataService } from './model-metadata.service';
7
- import { ModuleMetadataService } from './module-metadata.service';
8
- import { ConfigService } from '@nestjs/config';
9
- import { FileService } from './file.service';
6
+ import { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';
7
+ import { EntityManager } from 'typeorm';
10
8
  import { CrudHelperService } from './crud-helper.service';
11
9
  import { CRUDService } from './crud.service';
12
- import { Logger } from '@nestjs/common';
13
- import { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';
10
+ import { FileService } from './file.service';
11
+ import { ModelMetadataService } from './model-metadata.service';
12
+ import { ModuleMetadataService } from './module-metadata.service';
14
13
 
15
14
  @Injectable()
16
15
  export class ScheduledJobService extends CRUDService<ScheduledJob> {
17
16
  private readonly logger = new Logger(ScheduledJobService.name);
18
17
 
19
18
  constructor(
19
+ @Inject(forwardRef(() => ModelMetadataService))
20
20
  readonly modelMetadataService: ModelMetadataService,
21
21
  readonly moduleMetadataService: ModuleMetadataService,
22
22
  readonly configService: ConfigService,
@@ -20,6 +20,11 @@ export class SchedulerServiceImpl implements ISchedulerService {
20
20
 
21
21
  @Cron(CronExpression.EVERY_MINUTE)
22
22
  async runScheduledJobs(): Promise<void> {
23
+ const solidCliRunning = process.env.SOLID_CLI_RUNNING || "false";
24
+ if (solidCliRunning === "true") {
25
+ return;
26
+ }
27
+
23
28
  const now = new Date();
24
29
 
25
30
  // this.logger.log(`[${now.getTime()}]: scheduler service started run...`);
@@ -18,6 +18,7 @@ import { SecurityRuleRepository } from 'src';
18
18
  @Injectable()
19
19
  export class SecurityRuleService extends CRUDService<SecurityRule> implements OnApplicationBootstrap {
20
20
  constructor(
21
+ @Inject(forwardRef(() => ModelMetadataService))
21
22
  readonly modelMetadataService: ModelMetadataService,
22
23
  readonly moduleMetadataService: ModuleMetadataService,
23
24
  readonly configService: ConfigService,
@@ -1,4 +1,4 @@
1
- import { Injectable } from "@nestjs/common";
1
+ import { forwardRef, Inject, Injectable } from "@nestjs/common";
2
2
  import { ModelMetadataService } from "src/services/model-metadata.service";
3
3
  import { SelectionProvider } from "src/decorators/selection-provider.decorator";
4
4
  import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
@@ -8,7 +8,10 @@ import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues
8
8
  @Injectable()
9
9
  export class ListOfModelsSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {
10
10
  private readonly modelMetadataService: ModelMetadataService;
11
- constructor(modelMetadataService: ModelMetadataService) {
11
+ constructor(
12
+ @Inject(forwardRef(() => ModelMetadataService))
13
+ modelMetadataService: ModelMetadataService
14
+ ) {
12
15
  this.modelMetadataService = modelMetadataService;
13
16
  }
14
17
  help(): string {
@@ -1,25 +1,28 @@
1
- import { Inject, Injectable } from '@nestjs/common';
1
+ import { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
3
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
4
4
  import { EntityManager, Repository } from 'typeorm';
5
5
 
6
6
  import { ConfigService, ConfigType } from '@nestjs/config';
7
+ import commonConfig from 'src/config/common.config';
8
+ import { iamConfig } from 'src/config/iam.config';
9
+ import { ERROR_MESSAGES } from 'src/constants/error-messages';
10
+ import { CreateSettingDto } from 'src/dtos/create-setting.dto';
11
+ import { GetMcpUrlDto } from 'src/dtos/get-mcp-url.dto';
12
+ import { User } from 'src/entities/user.entity';
13
+ import { SettingRepository } from 'src/repository/setting.repository';
7
14
  import { CrudHelperService } from 'src/services/crud-helper.service';
8
15
  import { CRUDService } from 'src/services/crud.service';
9
16
  import { FileService } from 'src/services/file.service';
10
17
  import { ModelMetadataService } from 'src/services/model-metadata.service';
11
18
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
12
- import commonConfig from 'src/config/common.config';
13
- import { iamConfig } from 'src/config/iam.config';
14
19
  import { Setting } from '../entities/setting.entity';
15
20
  import { RequestContextService } from './request-context.service';
16
- import { User } from 'src/entities/user.entity';
17
- import { CreateSettingDto } from 'src/dtos/create-setting.dto';
18
- import { SettingRepository } from 'src/repository/setting.repository';
19
21
 
20
22
  @Injectable()
21
23
  export class SettingService extends CRUDService<Setting> {
22
24
  constructor(
25
+ @Inject(forwardRef(() => ModelMetadataService))
23
26
  readonly modelMetadataService: ModelMetadataService,
24
27
  readonly moduleMetadataService: ModuleMetadataService,
25
28
  readonly configService: ConfigService,
@@ -44,6 +47,7 @@ export class SettingService extends CRUDService<Setting> {
44
47
 
45
48
  async seedDefaultSettings(): Promise<void> {
46
49
  const settingsSeederData = {
50
+ passwordlessRegistrationValidateWhat: this.iamConfiguration.passwordlessRegistrationValidateWhat,
47
51
  allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,
48
52
  passwordBasedAuth: this.iamConfiguration.passwordBasedAuth,
49
53
  passwordLessAuth: this.iamConfiguration.passwordLessAuth,
@@ -163,6 +167,7 @@ export class SettingService extends CRUDService<Setting> {
163
167
 
164
168
  private getDefaultSettings(): Record<string, any> {
165
169
  return {
170
+ passwordlessRegistrationValidateWhat: this.iamConfiguration.passwordlessRegistrationValidateWhat,
166
171
  allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,
167
172
  passwordBasedAuth: this.iamConfiguration.passwordBasedAuth,
168
173
  passwordLessAuth: this.iamConfiguration.passwordLessAuth,
@@ -372,4 +377,26 @@ export class SettingService extends CRUDService<Setting> {
372
377
  return { system, user };
373
378
  }
374
379
 
380
+ async getMcpUrl(getMcpUrlDto: GetMcpUrlDto, solidRequestContext: any = {}): Promise<any> {
381
+
382
+ const { showHeader, inListView } = getMcpUrlDto;
383
+
384
+ if(process.env.MCP_ENABLED === 'false') {
385
+ throw new ForbiddenException(ERROR_MESSAGES.FORBIDDEN);
386
+ }
387
+
388
+ if (solidRequestContext.activeUser) {
389
+ const permissionNames = ["SettingController.getMcpUrl"];
390
+ const matchingPermssions = solidRequestContext.activeUser.permissions.filter((p: any) => permissionNames.includes(p));
391
+ const hasPermission = matchingPermssions.length > 0;
392
+ if (!hasPermission) {
393
+ throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);
394
+ }
395
+ }
396
+ const apiKey = process.env.MCP_API_KEY;
397
+ const userId = solidRequestContext.activeUser.sub;
398
+ const mcpServerUrl = process.env.MCP_SERVER_URL;
399
+ return { mcpUrl: `${mcpServerUrl}/static/frontend.html?solidx-mcp-api-key=${apiKey}&solidx-user-id=${userId}&solidx-show-header=${showHeader}&solidx-in-list-view=${inListView}` };
400
+ }
401
+
375
402
  }
@@ -1,25 +1,23 @@
1
- import { Injectable, NotFoundException } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
 
3
- import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
4
- import { EntityManager, Repository } from 'typeorm';
5
- import { PaginationQueryDto } from 'src/dtos/pagination-query.dto';
3
+ import { ConfigService } from '@nestjs/config';
4
+ import { DiscoveryService, ModuleRef } from '@nestjs/core';
5
+ import { InjectEntityManager } from '@nestjs/typeorm';
6
+ import { SmsTemplateRepository } from 'src/repository/sms-template.repository';
7
+ import { EntityManager } from 'typeorm';
6
8
  import { SmsTemplate } from '../entities/sms-template.entity';
7
- import { CreateSmsTemplateDto } from '../dtos/create-sms-template.dto';
8
- import { UpdateSmsTemplateDto } from '../dtos/update-sms-template.dto';
9
+ import { CrudHelperService } from './crud-helper.service';
9
10
  import { CRUDService } from './crud.service';
10
- import { ModelMetadataService } from './model-metadata.service';
11
- import { ModuleMetadataService } from './module-metadata.service';
12
- import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
13
- import { ConfigService } from '@nestjs/config';
14
11
  import { FileService } from './file.service';
12
+ import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
15
13
  import { MediaService } from './media.service';
16
- import { DiscoveryService, ModuleRef } from '@nestjs/core';
17
- import { CrudHelperService } from './crud-helper.service';
18
- import { SmsTemplateRepository } from 'src/repository/sms-template.repository';
14
+ import { ModelMetadataService } from './model-metadata.service';
15
+ import { ModuleMetadataService } from './module-metadata.service';
19
16
 
20
17
  @Injectable()
21
18
  export class SmsTemplateService extends CRUDService<SmsTemplate>{
22
19
  constructor(
20
+ @Inject(forwardRef(() => ModelMetadataService))
23
21
  readonly modelMetadataService: ModelMetadataService,
24
22
  readonly moduleMetadataService: ModuleMetadataService,
25
23
  readonly mediaStorageProviderService: MediaStorageProviderMetadataService,
@@ -1,5 +1,5 @@
1
1
  import { classify } from '@angular-devkit/core/src/utils/strings';
2
- import { forwardRef, Inject, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
2
+ import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
3
3
  import { DiscoveryService, MetadataScanner, ModuleRef, Reflector } from '@nestjs/core';
4
4
  import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
5
5
  import { getDataSourceToken } from '@nestjs/typeorm';
@@ -14,16 +14,12 @@ import { IS_SELECTION_PROVIDER } from 'src/decorators/selection-provider.decorat
14
14
  import { IS_SOLID_DATABASE_MODULE } from 'src/decorators/solid-database-module.decorator';
15
15
  import { IS_WA_PROVIDER } from 'src/decorators/whatsapp-provider.decorator';
16
16
  import { SolidRegistry } from 'src/helpers/solid-registry';
17
- import { DataSource } from 'typeorm';
18
- import { CRUDService } from './crud.service';
19
- import { RequestContextService } from './request-context.service';
20
- import { CreatedByUpdatedBySubscriber } from 'src/subscribers/created-by-updated-by.subscriber';
21
17
  import { AuditSubscriber } from 'src/subscribers/audit.subscriber';
22
- import { ComputedEntityFieldSubscriber, ComputedFieldEvaluationPayload } from 'src/subscribers/computed-entity-field.subscriber';
18
+ import { ComputedEntityFieldSubscriber } from 'src/subscribers/computed-entity-field.subscriber';
19
+ import { CreatedByUpdatedBySubscriber } from 'src/subscribers/created-by-updated-by.subscriber';
23
20
  import { SoftDeleteAwareEventSubscriber } from 'src/subscribers/soft-delete-aware-event.subscriber';
24
- import { ChatterMessageService } from './chatter-message.service';
25
- import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
26
- import { ModelMetadataHelperService, PublisherFactory } from 'src';
21
+ import { DataSource } from 'typeorm';
22
+ import { CRUDService } from './crud.service';
27
23
 
28
24
  export const coreSubscriberClasses = [
29
25
  AuditSubscriber,
@@ -40,20 +36,11 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
40
36
  private readonly metadataScanner: MetadataScanner,
41
37
  private readonly solidRegistry: SolidRegistry,
42
38
  private readonly moduleRef: ModuleRef,
43
- private readonly requestContextService: RequestContextService,
44
- // AuditSubscribe related dependencies
45
- private readonly chatterMessageService: ChatterMessageService,
46
- private readonly modelMetadataHelperService: ModelMetadataHelperService,
47
- private readonly modelMetadataRepo: ModelMetadataRepository,
48
- // ComputedEntityFieldSubscriber related dependencies
49
- @Inject(forwardRef(() => PublisherFactory))
50
- private readonly publisherFactory: PublisherFactory<any>,
51
-
52
39
  ) { }
53
40
 
54
41
  private readonly logger = new Logger(SolidIntrospectService.name);
55
42
  async onApplicationBootstrap() {
56
- this.logger.log('Introspecting the application for Solid metadata');
43
+ this.logger.debug('Introspecting the application for Solid metadata');
57
44
 
58
45
  // Register all seeders
59
46
  const seeders = this.discoveryService