@solidstarters/solid-core 1.2.204 → 1.2.206

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 (500) hide show
  1. package/dist/commands/info.command.d.ts +19 -0
  2. package/dist/commands/info.command.d.ts.map +1 -0
  3. package/dist/commands/info.command.js +98 -0
  4. package/dist/commands/info.command.js.map +1 -0
  5. package/dist/commands/mcp.command.d.ts.map +1 -1
  6. package/dist/commands/mcp.command.js +2 -10
  7. package/dist/commands/mcp.command.js.map +1 -1
  8. package/dist/commands/seed.command.d.ts.map +1 -1
  9. package/dist/commands/seed.command.js +2 -11
  10. package/dist/commands/seed.command.js.map +1 -1
  11. package/dist/controllers/email-template.controller.d.ts +3 -1
  12. package/dist/controllers/email-template.controller.d.ts.map +1 -1
  13. package/dist/controllers/email-template.controller.js +7 -4
  14. package/dist/controllers/email-template.controller.js.map +1 -1
  15. package/dist/controllers/google-authentication.controller.d.ts +4 -5
  16. package/dist/controllers/google-authentication.controller.d.ts.map +1 -1
  17. package/dist/controllers/google-authentication.controller.js +21 -14
  18. package/dist/controllers/google-authentication.controller.js.map +1 -1
  19. package/dist/controllers/otp-authentication.controller.d.ts +10 -0
  20. package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
  21. package/dist/controllers/otp-authentication.controller.js +1 -1
  22. package/dist/controllers/setting.controller.d.ts +2 -34
  23. package/dist/controllers/setting.controller.d.ts.map +1 -1
  24. package/dist/controllers/setting.controller.js +4 -130
  25. package/dist/controllers/setting.controller.js.map +1 -1
  26. package/dist/decorators/settings-provider.decorator.d.ts +3 -0
  27. package/dist/decorators/settings-provider.decorator.d.ts.map +1 -0
  28. package/dist/decorators/settings-provider.decorator.js +8 -0
  29. package/dist/decorators/settings-provider.decorator.js.map +1 -0
  30. package/dist/decorators/solid-password.decorator.d.ts.map +1 -1
  31. package/dist/decorators/solid-password.decorator.js +3 -3
  32. package/dist/decorators/solid-password.decorator.js.map +1 -1
  33. package/dist/dtos/create-role-metadata.dto.d.ts +3 -4
  34. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  35. package/dist/dtos/create-role-metadata.dto.js +4 -51
  36. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  37. package/dist/dtos/create-setting.dto.d.ts +3 -0
  38. package/dist/dtos/create-setting.dto.d.ts.map +1 -1
  39. package/dist/dtos/create-setting.dto.js +20 -2
  40. package/dist/dtos/create-setting.dto.js.map +1 -1
  41. package/dist/dtos/update-setting.dto.d.ts +3 -0
  42. package/dist/dtos/update-setting.dto.d.ts.map +1 -1
  43. package/dist/dtos/update-setting.dto.js +19 -1
  44. package/dist/dtos/update-setting.dto.js.map +1 -1
  45. package/dist/entities/setting.entity.d.ts +3 -0
  46. package/dist/entities/setting.entity.d.ts.map +1 -1
  47. package/dist/entities/setting.entity.js +13 -1
  48. package/dist/entities/setting.entity.js.map +1 -1
  49. package/dist/factories/mail.factory.d.ts +3 -4
  50. package/dist/factories/mail.factory.d.ts.map +1 -1
  51. package/dist/factories/mail.factory.js +6 -12
  52. package/dist/factories/mail.factory.js.map +1 -1
  53. package/dist/factories/sms.factory.d.ts +3 -4
  54. package/dist/factories/sms.factory.d.ts.map +1 -1
  55. package/dist/factories/sms.factory.js +6 -12
  56. package/dist/factories/sms.factory.js.map +1 -1
  57. package/dist/factories/whatsapp.factory.d.ts +3 -4
  58. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  59. package/dist/factories/whatsapp.factory.js +6 -12
  60. package/dist/factories/whatsapp.factory.js.map +1 -1
  61. package/dist/guards/access-token.guard.d.ts +3 -4
  62. package/dist/guards/access-token.guard.d.ts.map +1 -1
  63. package/dist/guards/access-token.guard.js +14 -9
  64. package/dist/guards/access-token.guard.js.map +1 -1
  65. package/dist/helpers/cors.helper.d.ts +1 -2
  66. package/dist/helpers/cors.helper.d.ts.map +1 -1
  67. package/dist/helpers/cors.helper.js +2 -2
  68. package/dist/helpers/cors.helper.js.map +1 -1
  69. package/dist/helpers/error-mapper.service.d.ts.map +1 -1
  70. package/dist/helpers/error-mapper.service.js.map +1 -1
  71. package/dist/helpers/google-oauth.helper.d.ts +7 -3
  72. package/dist/helpers/google-oauth.helper.d.ts.map +1 -1
  73. package/dist/helpers/google-oauth.helper.js +1 -2
  74. package/dist/helpers/google-oauth.helper.js.map +1 -1
  75. package/dist/helpers/module.helper.js +0 -2
  76. package/dist/helpers/module.helper.js.map +1 -1
  77. package/dist/helpers/solid-registry.d.ts +8 -3
  78. package/dist/helpers/solid-registry.d.ts.map +1 -1
  79. package/dist/helpers/solid-registry.js +32 -9
  80. package/dist/helpers/solid-registry.js.map +1 -1
  81. package/dist/index.d.ts +2 -4
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +3 -6
  84. package/dist/index.js.map +1 -1
  85. package/dist/interfaces.d.ts +21 -0
  86. package/dist/interfaces.d.ts.map +1 -1
  87. package/dist/interfaces.js +8 -1
  88. package/dist/interfaces.js.map +1 -1
  89. package/dist/passport-strategies/google-oauth.strategy.d.ts +1 -4
  90. package/dist/passport-strategies/google-oauth.strategy.d.ts.map +1 -1
  91. package/dist/passport-strategies/google-oauth.strategy.js +12 -12
  92. package/dist/passport-strategies/google-oauth.strategy.js.map +1 -1
  93. package/dist/seeders/email-template-seeder.service.d.ts +3 -4
  94. package/dist/seeders/email-template-seeder.service.d.ts.map +1 -1
  95. package/dist/seeders/email-template-seeder.service.js +7 -12
  96. package/dist/seeders/email-template-seeder.service.js.map +1 -1
  97. package/dist/seeders/module-metadata-seeder.service.d.ts +1 -5
  98. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  99. package/dist/seeders/module-metadata-seeder.service.js +23 -23
  100. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  101. package/dist/seeders/seed-data/solid-core-metadata.json +98 -4
  102. package/dist/seeders/sms-template-seeder.service.d.ts +3 -4
  103. package/dist/seeders/sms-template-seeder.service.d.ts.map +1 -1
  104. package/dist/seeders/sms-template-seeder.service.js +7 -12
  105. package/dist/seeders/sms-template-seeder.service.js.map +1 -1
  106. package/dist/services/action-metadata.service.d.ts +2 -13
  107. package/dist/services/action-metadata.service.d.ts.map +1 -1
  108. package/dist/services/action-metadata.service.js +4 -22
  109. package/dist/services/action-metadata.service.js.map +1 -1
  110. package/dist/services/ai-interaction.service.d.ts +2 -13
  111. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  112. package/dist/services/ai-interaction.service.js +6 -24
  113. package/dist/services/ai-interaction.service.js.map +1 -1
  114. package/dist/services/authentication.service.d.ts +14 -10
  115. package/dist/services/authentication.service.d.ts.map +1 -1
  116. package/dist/services/authentication.service.js +159 -114
  117. package/dist/services/authentication.service.js.map +1 -1
  118. package/dist/services/bcrypt.service.d.ts +3 -5
  119. package/dist/services/bcrypt.service.d.ts.map +1 -1
  120. package/dist/services/bcrypt.service.js +10 -14
  121. package/dist/services/bcrypt.service.js.map +1 -1
  122. package/dist/services/chatter-message-details.service.d.ts +2 -13
  123. package/dist/services/chatter-message-details.service.d.ts.map +1 -1
  124. package/dist/services/chatter-message-details.service.js +4 -22
  125. package/dist/services/chatter-message-details.service.js.map +1 -1
  126. package/dist/services/chatter-message.service.d.ts +2 -13
  127. package/dist/services/chatter-message.service.d.ts.map +1 -1
  128. package/dist/services/chatter-message.service.js +5 -23
  129. package/dist/services/chatter-message.service.js.map +1 -1
  130. package/dist/services/crud.service.d.ts +12 -12
  131. package/dist/services/crud.service.d.ts.map +1 -1
  132. package/dist/services/crud.service.js +25 -17
  133. package/dist/services/crud.service.js.map +1 -1
  134. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts +2 -13
  135. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts.map +1 -1
  136. package/dist/services/dashboard-question-sql-dataset-config.service.js +4 -21
  137. package/dist/services/dashboard-question-sql-dataset-config.service.js.map +1 -1
  138. package/dist/services/dashboard-question.service.d.ts +2 -13
  139. package/dist/services/dashboard-question.service.d.ts.map +1 -1
  140. package/dist/services/dashboard-question.service.js +4 -21
  141. package/dist/services/dashboard-question.service.js.map +1 -1
  142. package/dist/services/dashboard-variable.service.d.ts +2 -13
  143. package/dist/services/dashboard-variable.service.d.ts.map +1 -1
  144. package/dist/services/dashboard-variable.service.js +4 -21
  145. package/dist/services/dashboard-variable.service.js.map +1 -1
  146. package/dist/services/dashboard.service.d.ts +2 -13
  147. package/dist/services/dashboard.service.d.ts.map +1 -1
  148. package/dist/services/dashboard.service.js +4 -21
  149. package/dist/services/dashboard.service.js.map +1 -1
  150. package/dist/services/email-template.service.d.ts +2 -13
  151. package/dist/services/email-template.service.d.ts.map +1 -1
  152. package/dist/services/email-template.service.js +4 -22
  153. package/dist/services/email-template.service.js.map +1 -1
  154. package/dist/services/export-template.service.d.ts +2 -13
  155. package/dist/services/export-template.service.d.ts.map +1 -1
  156. package/dist/services/export-template.service.js +4 -21
  157. package/dist/services/export-template.service.js.map +1 -1
  158. package/dist/services/export-transaction.service.d.ts +2 -13
  159. package/dist/services/export-transaction.service.d.ts.map +1 -1
  160. package/dist/services/export-transaction.service.js +4 -21
  161. package/dist/services/export-transaction.service.js.map +1 -1
  162. package/dist/services/field-metadata.service.d.ts +11 -0
  163. package/dist/services/field-metadata.service.d.ts.map +1 -1
  164. package/dist/services/field-metadata.service.js +3 -0
  165. package/dist/services/field-metadata.service.js.map +1 -1
  166. package/dist/services/file/file-service.interface.d.ts +22 -0
  167. package/dist/services/file/file-service.interface.d.ts.map +1 -0
  168. package/dist/services/file/file-service.interface.js +5 -0
  169. package/dist/services/file/file-service.interface.js.map +1 -0
  170. package/dist/services/file.service.d.ts +1 -4
  171. package/dist/services/file.service.d.ts.map +1 -1
  172. package/dist/services/file.service.js +11 -12
  173. package/dist/services/file.service.js.map +1 -1
  174. package/dist/services/genai/r2r-helper.service.d.ts +3 -1
  175. package/dist/services/genai/r2r-helper.service.d.ts.map +1 -1
  176. package/dist/services/genai/r2r-helper.service.js +11 -7
  177. package/dist/services/genai/r2r-helper.service.js.map +1 -1
  178. package/dist/services/import-transaction-error-log.service.d.ts +2 -13
  179. package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
  180. package/dist/services/import-transaction-error-log.service.js +4 -22
  181. package/dist/services/import-transaction-error-log.service.js.map +1 -1
  182. package/dist/services/import-transaction.service.d.ts +2 -13
  183. package/dist/services/import-transaction.service.d.ts.map +1 -1
  184. package/dist/services/import-transaction.service.js +4 -22
  185. package/dist/services/import-transaction.service.js.map +1 -1
  186. package/dist/services/list-of-values.service.d.ts +2 -13
  187. package/dist/services/list-of-values.service.d.ts.map +1 -1
  188. package/dist/services/list-of-values.service.js +4 -22
  189. package/dist/services/list-of-values.service.js.map +1 -1
  190. package/dist/services/locale.service.d.ts +2 -13
  191. package/dist/services/locale.service.d.ts.map +1 -1
  192. package/dist/services/locale.service.js +4 -22
  193. package/dist/services/locale.service.js.map +1 -1
  194. package/dist/services/mail/elastic-email.service.d.ts +4 -5
  195. package/dist/services/mail/elastic-email.service.d.ts.map +1 -1
  196. package/dist/services/mail/elastic-email.service.js +10 -13
  197. package/dist/services/mail/elastic-email.service.js.map +1 -1
  198. package/dist/services/mail/smtp-email.service.d.ts +3 -4
  199. package/dist/services/mail/smtp-email.service.d.ts.map +1 -1
  200. package/dist/services/mail/smtp-email.service.js +19 -17
  201. package/dist/services/mail/smtp-email.service.js.map +1 -1
  202. package/dist/services/media-storage-provider-metadata.service.d.ts +11 -0
  203. package/dist/services/media-storage-provider-metadata.service.d.ts.map +1 -1
  204. package/dist/services/media-storage-provider-metadata.service.js +3 -0
  205. package/dist/services/media-storage-provider-metadata.service.js.map +1 -1
  206. package/dist/services/media.service.d.ts +2 -9
  207. package/dist/services/media.service.d.ts.map +1 -1
  208. package/dist/services/media.service.js +17 -28
  209. package/dist/services/media.service.js.map +1 -1
  210. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +2 -4
  211. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  212. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +2 -11
  213. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  214. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +3 -1
  215. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  216. package/dist/services/mediaStorageProviders/file-storage-provider.js +16 -12
  217. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  218. package/dist/services/mediaStorageProviders/index.d.ts +1 -1
  219. package/dist/services/mediaStorageProviders/index.d.ts.map +1 -1
  220. package/dist/services/mediaStorageProviders/index.js +1 -1
  221. package/dist/services/mediaStorageProviders/index.js.map +1 -1
  222. package/dist/services/menu-item-metadata.service.d.ts +2 -13
  223. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  224. package/dist/services/menu-item-metadata.service.js +4 -22
  225. package/dist/services/menu-item-metadata.service.js.map +1 -1
  226. package/dist/services/model-metadata.service.d.ts +11 -0
  227. package/dist/services/model-metadata.service.d.ts.map +1 -1
  228. package/dist/services/model-metadata.service.js +3 -0
  229. package/dist/services/model-metadata.service.js.map +1 -1
  230. package/dist/services/model-sequence.service.d.ts +2 -13
  231. package/dist/services/model-sequence.service.d.ts.map +1 -1
  232. package/dist/services/model-sequence.service.js +4 -21
  233. package/dist/services/model-sequence.service.js.map +1 -1
  234. package/dist/services/module-metadata.service.d.ts +14 -1
  235. package/dist/services/module-metadata.service.d.ts.map +1 -1
  236. package/dist/services/module-metadata.service.js +13 -6
  237. package/dist/services/module-metadata.service.js.map +1 -1
  238. package/dist/services/mq-message-queue.service.d.ts +2 -13
  239. package/dist/services/mq-message-queue.service.d.ts.map +1 -1
  240. package/dist/services/mq-message-queue.service.js +4 -22
  241. package/dist/services/mq-message-queue.service.js.map +1 -1
  242. package/dist/services/mq-message.service.d.ts +2 -13
  243. package/dist/services/mq-message.service.d.ts.map +1 -1
  244. package/dist/services/mq-message.service.js +4 -22
  245. package/dist/services/mq-message.service.js.map +1 -1
  246. package/dist/services/permission-metadata.service.d.ts +2 -13
  247. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  248. package/dist/services/permission-metadata.service.js +4 -22
  249. package/dist/services/permission-metadata.service.js.map +1 -1
  250. package/dist/services/role-metadata.service.d.ts +2 -13
  251. package/dist/services/role-metadata.service.d.ts.map +1 -1
  252. package/dist/services/role-metadata.service.js +4 -23
  253. package/dist/services/role-metadata.service.js.map +1 -1
  254. package/dist/services/saved-filters.service.d.ts +2 -13
  255. package/dist/services/saved-filters.service.d.ts.map +1 -1
  256. package/dist/services/saved-filters.service.js +4 -21
  257. package/dist/services/saved-filters.service.js.map +1 -1
  258. package/dist/services/scheduled-job.service.d.ts +2 -13
  259. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  260. package/dist/services/scheduled-job.service.js +4 -22
  261. package/dist/services/scheduled-job.service.js.map +1 -1
  262. package/dist/services/security-rule.service.d.ts +2 -13
  263. package/dist/services/security-rule.service.d.ts.map +1 -1
  264. package/dist/services/security-rule.service.js +5 -23
  265. package/dist/services/security-rule.service.js.map +1 -1
  266. package/dist/services/setting.service.d.ts +23 -30
  267. package/dist/services/setting.service.d.ts.map +1 -1
  268. package/dist/services/setting.service.js +147 -196
  269. package/dist/services/setting.service.js.map +1 -1
  270. package/dist/services/settings/default-settings-provider.service.d.ts +1058 -0
  271. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -0
  272. package/dist/services/settings/default-settings-provider.service.js +139 -0
  273. package/dist/services/settings/default-settings-provider.service.js.map +1 -0
  274. package/dist/services/short-url/tiny-url.service.d.ts +3 -4
  275. package/dist/services/short-url/tiny-url.service.d.ts.map +1 -1
  276. package/dist/services/short-url/tiny-url.service.js +10 -13
  277. package/dist/services/short-url/tiny-url.service.js.map +1 -1
  278. package/dist/services/sms/Msg91BaseSMSService.d.ts +3 -4
  279. package/dist/services/sms/Msg91BaseSMSService.d.ts.map +1 -1
  280. package/dist/services/sms/Msg91BaseSMSService.js +3 -3
  281. package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
  282. package/dist/services/sms/Msg91OTPService.d.ts +2 -3
  283. package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
  284. package/dist/services/sms/Msg91OTPService.js +7 -13
  285. package/dist/services/sms/Msg91OTPService.js.map +1 -1
  286. package/dist/services/sms/Msg91SMSService.d.ts +2 -3
  287. package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
  288. package/dist/services/sms/Msg91SMSService.js +7 -13
  289. package/dist/services/sms/Msg91SMSService.js.map +1 -1
  290. package/dist/services/sms/TwilioSMSService.d.ts +3 -4
  291. package/dist/services/sms/TwilioSMSService.d.ts.map +1 -1
  292. package/dist/services/sms/TwilioSMSService.js +13 -16
  293. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  294. package/dist/services/sms-template.service.d.ts +2 -13
  295. package/dist/services/sms-template.service.d.ts.map +1 -1
  296. package/dist/services/sms-template.service.js +4 -22
  297. package/dist/services/sms-template.service.js.map +1 -1
  298. package/dist/services/solid-introspect.service.d.ts +4 -1
  299. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  300. package/dist/services/solid-introspect.service.js +33 -47
  301. package/dist/services/solid-introspect.service.js.map +1 -1
  302. package/dist/services/textract.service.d.ts +1 -4
  303. package/dist/services/textract.service.d.ts.map +1 -1
  304. package/dist/services/textract.service.js +14 -18
  305. package/dist/services/textract.service.js.map +1 -1
  306. package/dist/services/user-activity-history.service.d.ts +2 -13
  307. package/dist/services/user-activity-history.service.d.ts.map +1 -1
  308. package/dist/services/user-activity-history.service.js +4 -22
  309. package/dist/services/user-activity-history.service.js.map +1 -1
  310. package/dist/services/user-view-metadata.service.d.ts +2 -13
  311. package/dist/services/user-view-metadata.service.d.ts.map +1 -1
  312. package/dist/services/user-view-metadata.service.js +4 -22
  313. package/dist/services/user-view-metadata.service.js.map +1 -1
  314. package/dist/services/user.service.d.ts +2 -15
  315. package/dist/services/user.service.d.ts.map +1 -1
  316. package/dist/services/user.service.js +7 -28
  317. package/dist/services/user.service.js.map +1 -1
  318. package/dist/services/view-metadata.service.d.ts +2 -13
  319. package/dist/services/view-metadata.service.d.ts.map +1 -1
  320. package/dist/services/view-metadata.service.js +5 -23
  321. package/dist/services/view-metadata.service.js.map +1 -1
  322. package/dist/services/whatsapp/Msg91WhatsappService.d.ts +3 -4
  323. package/dist/services/whatsapp/Msg91WhatsappService.d.ts.map +1 -1
  324. package/dist/services/whatsapp/Msg91WhatsappService.js +12 -18
  325. package/dist/services/whatsapp/Msg91WhatsappService.js.map +1 -1
  326. package/dist/services/whatsapp/Three60WhatsappService.d.ts +1 -4
  327. package/dist/services/whatsapp/Three60WhatsappService.d.ts.map +1 -1
  328. package/dist/services/whatsapp/Three60WhatsappService.js +2 -11
  329. package/dist/services/whatsapp/Three60WhatsappService.js.map +1 -1
  330. package/dist/solid-core.module.d.ts.map +1 -1
  331. package/dist/solid-core.module.js +9 -47
  332. package/dist/solid-core.module.js.map +1 -1
  333. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -1
  334. package/dist/transformers/typeorm/local-date-time-transformer.js +4 -2
  335. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -1
  336. package/dist/tsconfig.tsbuildinfo +1 -1
  337. package/package.json +1 -1
  338. package/src/commands/info.command.ts +101 -0
  339. package/src/commands/mcp.command.ts +3 -17
  340. package/src/commands/seed.command.ts +4 -16
  341. package/src/controllers/email-template.controller.ts +9 -4
  342. package/src/controllers/google-authentication.controller.ts +19 -12
  343. package/src/controllers/setting.controller.ts +6 -81
  344. package/src/decorators/settings-provider.decorator.ts +7 -0
  345. package/src/decorators/solid-password.decorator.ts +43 -43
  346. package/src/dtos/create-role-metadata.dto.ts +4 -81
  347. package/src/dtos/create-setting.dto.ts +14 -1
  348. package/src/dtos/update-setting.dto.ts +14 -0
  349. package/src/entities/setting.entity.ts +15 -1
  350. package/src/factories/mail.factory.ts +4 -4
  351. package/src/factories/sms.factory.ts +9 -7
  352. package/src/factories/whatsapp.factory.ts +4 -4
  353. package/src/guards/access-token.guard.ts +12 -5
  354. package/src/helpers/cors.helper.ts +3 -3
  355. package/src/helpers/error-mapper.service.ts +0 -1
  356. package/src/helpers/google-oauth.helper.ts +11 -7
  357. package/src/helpers/module.helper.ts +2 -2
  358. package/src/helpers/solid-registry.ts +45 -16
  359. package/src/index.ts +2 -4
  360. package/src/interfaces.ts +29 -0
  361. package/src/passport-strategies/google-oauth.strategy.ts +11 -8
  362. package/src/seeders/email-template-seeder.service.ts +6 -4
  363. package/src/seeders/module-metadata-seeder.service.ts +40 -28
  364. package/src/seeders/seed-data/solid-core-metadata.json +99 -5
  365. package/src/seeders/sms-template-seeder.service.ts +6 -4
  366. package/src/services/action-metadata.service.ts +4 -16
  367. package/src/services/ai-interaction.service.ts +6 -17
  368. package/src/services/authentication.service.ts +173 -111
  369. package/src/services/bcrypt.service.ts +9 -9
  370. package/src/services/chatter-message-details.service.ts +5 -17
  371. package/src/services/chatter-message.service.ts +2 -14
  372. package/src/services/crud.service.ts +36 -28
  373. package/src/services/dashboard-question-sql-dataset-config.service.ts +4 -15
  374. package/src/services/dashboard-question.service.ts +4 -17
  375. package/src/services/dashboard-variable.service.ts +4 -16
  376. package/src/services/dashboard.service.ts +2 -13
  377. package/src/services/email-template.service.ts +3 -15
  378. package/src/services/export-template.service.ts +4 -18
  379. package/src/services/export-transaction.service.ts +4 -19
  380. package/src/services/field-metadata.service.ts +5 -1
  381. package/src/services/file/file-service.interface.ts +74 -0
  382. package/src/services/file.service.ts +10 -7
  383. package/src/services/genai/r2r-helper.service.ts +10 -6
  384. package/src/services/import-transaction-error-log.service.ts +5 -17
  385. package/src/services/import-transaction.service.ts +3 -15
  386. package/src/services/list-of-values.service.ts +3 -16
  387. package/src/services/locale.service.ts +3 -15
  388. package/src/services/mail/elastic-email.service.ts +7 -7
  389. package/src/services/mail/smtp-email.service.ts +19 -11
  390. package/src/services/media-storage-provider-metadata.service.ts +4 -0
  391. package/src/services/media.service.ts +39 -22
  392. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +0 -3
  393. package/src/services/mediaStorageProviders/file-storage-provider.ts +24 -12
  394. package/src/services/mediaStorageProviders/index.ts +1 -1
  395. package/src/services/menu-item-metadata.service.ts +5 -17
  396. package/src/services/model-metadata.service.ts +4 -0
  397. package/src/services/model-sequence.service.ts +4 -15
  398. package/src/services/module-metadata.service.ts +13 -4
  399. package/src/services/mq-message-queue.service.ts +5 -17
  400. package/src/services/mq-message.service.ts +5 -17
  401. package/src/services/permission-metadata.service.ts +4 -16
  402. package/src/services/role-metadata.service.ts +3 -16
  403. package/src/services/saved-filters.service.ts +2 -13
  404. package/src/services/scheduled-job.service.ts +3 -15
  405. package/src/services/security-rule.service.ts +4 -16
  406. package/src/services/setting.service.ts +223 -212
  407. package/src/services/settings/default-settings-provider.service.ts +157 -0
  408. package/src/services/short-url/tiny-url.service.ts +9 -7
  409. package/src/services/sms/Msg91BaseSMSService.ts +6 -4
  410. package/src/services/sms/Msg91OTPService.ts +7 -7
  411. package/src/services/sms/Msg91SMSService.ts +7 -6
  412. package/src/services/sms/TwilioSMSService.ts +18 -19
  413. package/src/services/sms-template.service.ts +3 -15
  414. package/src/services/solid-introspect.service.ts +45 -66
  415. package/src/services/textract.service.ts +13 -10
  416. package/src/services/user-activity-history.service.ts +5 -17
  417. package/src/services/user-view-metadata.service.ts +5 -17
  418. package/src/services/user.service.ts +7 -22
  419. package/src/services/view-metadata.service.ts +3 -15
  420. package/src/services/whatsapp/Msg91WhatsappService.ts +10 -11
  421. package/src/services/whatsapp/Three60WhatsappService.ts +0 -3
  422. package/src/solid-core.module.ts +17 -49
  423. package/src/transformers/typeorm/local-date-time-transformer.ts +10 -5
  424. package/dist/config/app-builder.config.d.ts +0 -11
  425. package/dist/config/app-builder.config.d.ts.map +0 -1
  426. package/dist/config/app-builder.config.js +0 -13
  427. package/dist/config/app-builder.config.js.map +0 -1
  428. package/dist/config/common.config.d.ts +0 -96
  429. package/dist/config/common.config.d.ts.map +0 -1
  430. package/dist/config/common.config.js +0 -51
  431. package/dist/config/common.config.js.map +0 -1
  432. package/dist/config/iam.config.d.ts +0 -56
  433. package/dist/config/iam.config.d.ts.map +0 -1
  434. package/dist/config/iam.config.js +0 -35
  435. package/dist/config/iam.config.js.map +0 -1
  436. package/dist/config/jwt.config.d.ts +0 -14
  437. package/dist/config/jwt.config.d.ts.map +0 -1
  438. package/dist/config/jwt.config.js +0 -15
  439. package/dist/config/jwt.config.js.map +0 -1
  440. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts +0 -16
  441. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts.map +0 -1
  442. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js +0 -151
  443. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js.map +0 -1
  444. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +0 -17
  445. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +0 -1
  446. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +0 -80
  447. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +0 -1
  448. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts +0 -16
  449. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts.map +0 -1
  450. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js +0 -74
  451. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js.map +0 -1
  452. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +0 -12
  453. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +0 -1
  454. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js +0 -47
  455. package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +0 -1
  456. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts +0 -16
  457. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts.map +0 -1
  458. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js +0 -151
  459. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js.map +0 -1
  460. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +0 -16
  461. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +0 -1
  462. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +0 -75
  463. package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +0 -1
  464. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts +0 -14
  465. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map +0 -1
  466. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js +0 -73
  467. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js.map +0 -1
  468. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +0 -14
  469. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +0 -1
  470. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js +0 -45
  471. package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +0 -1
  472. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts +0 -14
  473. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +0 -1
  474. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js +0 -51
  475. package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +0 -1
  476. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts +0 -12
  477. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +0 -1
  478. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js +0 -38
  479. package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +0 -1
  480. package/dist/services/media-storage-provider-metadata-seeder.service.d.ts +0 -8
  481. package/dist/services/media-storage-provider-metadata-seeder.service.d.ts.map +0 -1
  482. package/dist/services/media-storage-provider-metadata-seeder.service.js +0 -43
  483. package/dist/services/media-storage-provider-metadata-seeder.service.js.map +0 -1
  484. package/src/config/app-builder.config.ts +0 -12
  485. package/src/config/common.config.ts +0 -55
  486. package/src/config/iam.config.ts +0 -32
  487. package/src/config/jwt.config.ts +0 -13
  488. package/src/services/export_issues.txt +0 -10
  489. package/src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts +0 -137
  490. package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +0 -81
  491. package/src/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.ts +0 -69
  492. package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +0 -68
  493. package/src/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.ts +0 -141
  494. package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +0 -71
  495. package/src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts +0 -72
  496. package/src/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.ts +0 -45
  497. package/src/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.ts +0 -58
  498. package/src/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.ts +0 -40
  499. package/src/services/groupBy.json +0 -92
  500. package/src/services/media-storage-provider-metadata-seeder.service.ts +0 -33
@@ -1,215 +1,237 @@
1
- import { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable } from '@nestjs/common';
2
- import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
- import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
4
- import { EntityManager, Repository } from 'typeorm';
5
-
6
- import { ConfigService, ConfigType } from '@nestjs/config';
7
- import commonConfig from 'src/config/common.config';
8
- import { iamConfig } from 'src/config/iam.config';
1
+ import { BadRequestException, ForbiddenException, Injectable } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { Repository } from 'typeorm';
9
4
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
10
5
  import { CreateSettingDto } from 'src/dtos/create-setting.dto';
11
6
  import { GetMcpUrlDto } from 'src/dtos/get-mcp-url.dto';
12
7
  import { User } from 'src/entities/user.entity';
13
- import { SettingRepository } from 'src/repository/setting.repository';
14
- import { CrudHelperService } from 'src/services/crud-helper.service';
15
- import { CRUDService } from 'src/services/crud.service';
16
- import { FileService } from 'src/services/file.service';
17
- import { ModelMetadataService } from 'src/services/model-metadata.service';
18
- import { ModuleMetadataService } from 'src/services/module-metadata.service';
8
+ import { SettingRepository } from '../repository/setting.repository';
9
+ import { FileService } from '../services/file.service';
19
10
  import { Setting } from '../entities/setting.entity';
20
11
  import { RequestContextService } from './request-context.service';
12
+ import { SolidRegistry } from 'src/helpers/solid-registry';
13
+ import { ISettingsProvider, NoInfer, SettingDefinition, SettingLevel } from '../interfaces';
14
+ import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
15
+ import type { SolidCoreSetting } from './settings/default-settings-provider.service';
16
+ import { Logger } from '@nestjs/common';
21
17
 
22
18
  @Injectable()
23
- export class SettingService extends CRUDService<Setting> {
19
+ export class SettingService {
20
+ private readonly _logger = new Logger(SettingService.name);
21
+
22
+ private settings: SettingDefinition[] = [];
23
+ private settingsByKey = new Map<string, SettingDefinition>();
24
+
25
+ private readonly arrayKeysToSkip = new Set([
26
+ 'authenticationPasswordRegex',
27
+ 'authenticationPasswordRegexErrorMessage',
28
+ 'authenticationPasswordComplexityDescription',
29
+ ]);
30
+
24
31
  constructor(
25
- @Inject(forwardRef(() => ModelMetadataService))
26
- readonly modelMetadataService: ModelMetadataService,
27
- readonly moduleMetadataService: ModuleMetadataService,
28
- readonly configService: ConfigService,
29
32
  readonly fileService: FileService,
30
- readonly discoveryService: DiscoveryService,
31
- readonly crudHelperService: CrudHelperService,
32
- @Inject(iamConfig.KEY) private readonly iamConfiguration: ConfigType<typeof iamConfig>,
33
- @Inject(commonConfig.KEY)
34
- private readonly commonConfiguration: ConfigType<typeof commonConfig>,
35
- @InjectEntityManager()
36
- readonly entityManager: EntityManager,
37
- // @InjectRepository(Setting, 'default')
38
- // readonly repo: Repository<Setting>,
33
+ readonly solidRegistry: SolidRegistry,
39
34
  readonly repo: SettingRepository,
40
- readonly moduleRef: ModuleRef,
35
+ readonly moduleMetadataRepo: ModuleMetadataRepository,
41
36
  private readonly requestContextService: RequestContextService,
42
37
  @InjectRepository(User) private readonly userRepository: Repository<User>,
43
- ) {
44
- super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'setting', 'solid-core', moduleRef
45
- );
46
- }
38
+ ) { }
47
39
 
48
- async seedDefaultSettings(): Promise<void> {
49
- const settingsSeederData = this.getDefaultSettings();
50
-
51
- const existingSettings = await this.repo.find();
52
- const existingKeys = new Set(existingSettings.map(s => s.key));
40
+ private async getSettingsFromDb(): Promise<Setting[]> {
41
+ const settings = await this.repo.find({ relations: ['user'] });
42
+ return settings;
43
+ }
53
44
 
54
- const settingsToInsert: Setting[] = [];
55
- for (const [key, value] of Object.entries(settingsSeederData)) {
56
- if (!existingKeys.has(key)) {
57
- const setting = new Setting();
58
- setting.key = key;
59
- setting.value = typeof value === 'boolean' ? value.toString() :
60
- Array.isArray(value) ? value.join(',') :
61
- value === null || value === undefined ? null : String(value);
62
- settingsToInsert.push(setting);
45
+ private parseSettingValue(value: string, key: string): any {
46
+ try {
47
+ return JSON.parse(value);
48
+ } catch {
49
+ if (value === 'true' || value === 'false') {
50
+ return value === 'true';
63
51
  }
64
- }
65
-
66
- if (settingsToInsert.length > 0) {
67
- await this.repo.save(settingsToInsert);
52
+ if (!isNaN(Number(value)) && value.trim() !== '') {
53
+ return Number(value);
54
+ }
55
+ if (!this.arrayKeysToSkip.has(key) && value.includes(',')) {
56
+ return value.split(',').map(item => item.trim());
57
+ }
58
+ return value;
68
59
  }
69
60
  }
70
61
 
71
- async wrapSettings(): Promise<Record<string, any>> {
72
- const settingsArray: Setting[] = await this.repo.find();
73
-
74
- if (!settingsArray || settingsArray.length === 0) {
75
- return this.getDefaultSettings();
76
- }
77
-
78
- const settingsMap: Record<string, any> = {};
79
- const arrayKeysToSkip = [
80
- 'authenticationPasswordRegex',
81
- 'authenticationPasswordRegexErrorMessage',
82
- 'authenticationPasswordComplexityDescription',
83
- ];
84
- for (const setting of settingsArray) {
85
- if (setting.key && setting.value !== undefined && setting.value !== null) {
86
- let value = setting.value;
87
- try {
88
- settingsMap[setting.key] = JSON.parse(value);
89
- } catch {
90
- if (value === 'true' || value === 'false') {
91
- settingsMap[setting.key] = value === 'true';
92
- } else if (!isNaN(Number(value)) && value.trim() !== '') {
93
- settingsMap[setting.key] = Number(value);
94
- } else if (!arrayKeysToSkip.includes(setting.key) && value.includes(',')) {
95
- settingsMap[setting.key] = value.split(',').map(item => item.trim());
96
- } else {
97
- settingsMap[setting.key] = value;
98
- }
62
+ /**
63
+ * Reads all registered providers and gathers settings from across the running platform.
64
+ * This is the superset of all possible settings.
65
+ * @returns
66
+ */
67
+ private getAllSettingsFromProviders(): SettingDefinition[] {
68
+ // get all settings from registry
69
+ const allSettingsProviders = this.solidRegistry.getSettingsProviders();
70
+ const settings: SettingDefinition[] = [];
71
+ const seenKeys = new Map<string, { setting: SettingDefinition; providerName?: string }>();
72
+ for (const wrapper of allSettingsProviders) {
73
+ const instance = wrapper.instance as ISettingsProvider;
74
+ // if (!instance?.getSettings) continue;
75
+ for (const setting of instance.getSettings()) {
76
+ const existing = seenKeys.get(setting.key);
77
+ if (existing) {
78
+ throw new Error(
79
+ `Duplicate setting key detected: ${setting.key}. ` +
80
+ `First: ${JSON.stringify(existing.setting)} from provider: ${existing.providerName ?? "unknown"}. ` +
81
+ `Second: ${JSON.stringify(setting)} from provider: ${wrapper.name ?? "unknown"}.`
82
+ );
99
83
  }
100
-
101
- // if (value === 'true' || value === 'false') {
102
- // settingsMap[setting.key] = value === 'true';
103
- // }
104
- // else if (!isNaN(Number(value)) && value.trim() !== '') {
105
- // settingsMap[setting.key] = Number(value);
106
- // }
107
- // else if (value.includes(',')) {
108
- // settingsMap[setting.key] = value.split(',').map(item => item.trim());
109
- // }
110
- // else {
111
- // settingsMap[setting.key] = value;
112
- // }
84
+ seenKeys.set(setting.key, { setting, providerName: wrapper.name });
85
+ settings.push(setting);
113
86
  }
114
87
  }
115
88
 
116
- const defaultSettings = this.getDefaultSettings();
117
-
118
- const mergedSettings = Object.keys(defaultSettings).reduce((acc, key) => {
119
- acc[key] = settingsMap[key] !== undefined ? settingsMap[key] : defaultSettings[key];
120
- return acc;
121
- }, {} as Record<string, any>);
122
-
123
- return mergedSettings;
89
+ return settings
124
90
  }
125
91
 
126
- private getDefaultSettings(): Record<string, any> {
127
- return {
128
- passwordlessRegistrationValidateWhat: this.iamConfiguration.passwordlessRegistrationValidateWhat,
129
- allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,
130
- passwordBasedAuth: this.iamConfiguration.passwordBasedAuth,
131
- passwordLessAuth: this.iamConfiguration.passwordLessAuth,
132
- activateUserOnRegistration: this.iamConfiguration.activateUserOnRegistration,
133
- iamGoogleOAuthEnabled: false,
134
- authPagesLayout: "center",
135
- authPagesTheme: "light",
136
- appLogo: null,
137
- companylogo: null,
138
- favicon: null,
139
- // in_form_view | in_image_view
140
- appLogoPosition: "in_form_view",
141
- showAuthContent: false,
142
- appTitle: process.env.SOLID_APP_NAME || "Solid App",
143
- appSubtitle: process.env.SOLID_APP_SUBTITLE || "",
144
- appDescription: process.env.SOLID_APP_DESCRIPTION || "",
145
- showLegalLinks: false,
146
- appTnc: null,
147
- appPrivacyPolicy: null,
148
- defaultRole: this.iamConfiguration.defaultRole,
149
- shouldQueueEmails: this.commonConfiguration.shouldQueueEmails,
150
- shouldQueueSms: this.commonConfiguration.shouldQueueSms,
151
- enableDarkMode: true,
152
- copyright: null,
153
- forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin,
154
- enableUsername: true,
155
- enabledNotification: true,
156
- contactSupportEmail: null,
157
- contactSupportDisplayName: null,
158
- contactSupportIcon: null,
159
- authScreenRightBackgroundImage: null,
160
- authScreenLeftBackgroundImage: null,
161
- authScreenCenterBackgroundImage: null,
162
- authenticationPasswordRegex: this.iamConfiguration.PASSWORD_REGEX,
163
- authenticationPasswordRegexErrorMessage: this.iamConfiguration.PASSWORD_REGEX_ERROR_MESSAGE,
164
- authenticationPasswordComplexityDescription: this.iamConfiguration.PASSWORD_COMPLEXITY_DESC,
165
- solidXGenAiCodeBuilderConfig: JSON.stringify({
166
- defaultProvider: "",
167
- availableProviders: []
168
- }),
169
- iamAutoGeneratedPassword: this.iamConfiguration.iamAutoGeneratedPassword,
170
- showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration
171
- };
92
+ /**
93
+ * public method that gets all settings in the system, this includes settings from solid-core and any consuming projects.
94
+ * this means that the settings returned are the ones provided by ISettingsProvider, merged with values if any from the database.
95
+ *
96
+ * @returns
97
+ */
98
+ getAllSettings(): SettingDefinition[] {
99
+ return this.settings;
172
100
  }
173
101
 
174
- // private async getSettingsFromRepo(): Promise<Setting[]> {
175
- // const cachedSettings = await this.cacheManager.get('cached-system-settings');
176
- // }
102
+ async updateSettingsCache(): Promise<void> {
103
+ this._logger.debug(`updating settings cache...`);
104
+ const settingsFromDb = await this.getSettingsFromDb();
105
+ const settingsFromProviders = this.getAllSettingsFromProviders();
106
+ const settingsFromDbByKey = new Map(settingsFromDb.map(setting => [setting.key, setting]));
107
+
108
+ this.settings = settingsFromProviders.map(setting => {
109
+ const settingFromDb = settingsFromDbByKey.get(setting.key);
110
+ const valueFromDb = settingFromDb?.value;
111
+ if (settingFromDb?.key && valueFromDb !== undefined && valueFromDb !== null) {
112
+ const parsedValue = typeof valueFromDb === 'string' ? this.parseSettingValue(valueFromDb, settingFromDb.key) : valueFromDb;
113
+ return { ...setting, value: parsedValue };
114
+ }
115
+ return setting;
116
+ });
177
117
 
178
- async getConfigValue(settingKey: string) {
179
- try {
180
- const settingsArray: Setting[] = await this.repo.find();
181
- const settingEntry = settingsArray.find(setting => setting.key === settingKey);
118
+ // Also keep a key vs SettingDefinition map...
119
+ this.settingsByKey = new Map(this.settings.map(setting => [setting.key, setting]));
120
+ }
182
121
 
183
- if (settingEntry && settingEntry.value !== null && settingEntry.value !== undefined) {
184
- const value = settingEntry.value;
122
+ private isDisallowedSettingKey(key: string, settingLevelsToDisallow: SettingLevel[]): boolean {
123
+ if (!key) {
124
+ return false;
125
+ }
126
+ const setting = this.settingsByKey.get(key);
127
+ // return setting ? [SettingLevel.SystemEnv, SettingLevel.SystemAdminReadonly].includes(setting.level) : false;
128
+ return setting ? settingLevelsToDisallow.includes(setting.level) : false;
129
+ }
185
130
 
186
- if (value === 'true' || value === 'false') {
187
- return value === 'true';
188
- }
189
- else if (!isNaN(Number(value)) && value.trim() !== '') {
190
- return Number(value);
191
- }
192
- else if (value.includes(',')) {
193
- return value.split(',').map(item => item.trim());
194
- }
195
- else {
196
- return value;
131
+ /**
132
+ * 1.
133
+ * This method will seed (insert only) settings that are introduced in code but do not already exist in the database.
134
+ * Also this method only deals with settings with level system-admin-editable & internal-user.
135
+ */
136
+ async seedSystemAdminEditableAndAboveSettings(): Promise<void> {
137
+ // Seed only settings with level system-admin-editable & internal-user,
138
+ // so basically settings which are either system-admin-editable and above.
139
+ const saEditableAndAbove = this.getAllSettingsFromProviders().filter(i => [SettingLevel.SystemAdminEditable, SettingLevel.InternalUser].includes(i.level));
140
+
141
+ // Get hold of the current values from the database.
142
+ const existingSettingsFromDb: Setting[] = await this.getSettingsFromDb();
143
+
144
+ // const existingKeysFromDb = new Set(existingSettingsFromDb.map(s => s.key));
145
+ const existingSettingsFromDbByKey = new Map(existingSettingsFromDb.map(setting => [setting.key, setting]));
146
+ const settingsToMutate: Setting[] = [];
147
+ // const settingsToUpdate: Setting[] = [];
148
+
149
+ for (const { key, value, level, moduleName } of saEditableAndAbove) {
150
+ const moduleMetadata = await this.moduleMetadataRepo.findOneBy({ name: moduleName });
151
+ if (!existingSettingsFromDbByKey.has(key)) {
152
+ const setting = new Setting();
153
+ setting.key = key;
154
+ setting.level = level;
155
+ if (moduleMetadata)
156
+ setting.moduleMetadata = moduleMetadata;
157
+
158
+ if (typeof value === 'boolean') {
159
+ setting.value = value.toString();
160
+ } else if (Array.isArray(value)) {
161
+ setting.value = value.join(',');
162
+ } else if (value === null || value === undefined) {
163
+ setting.value = null;
164
+ } else {
165
+ setting.value = String(value);
197
166
  }
167
+
168
+ settingsToMutate.push(setting);
198
169
  }
170
+ else {
171
+ const setting = existingSettingsFromDbByKey.get(key);
172
+ setting.level = level;
173
+ if (moduleMetadata)
174
+ setting.moduleMetadata = moduleMetadata;
175
+ settingsToMutate.push(setting);
176
+ }
177
+ }
178
+
179
+ if (settingsToMutate.length > 0) {
180
+ await this.repo.save(settingsToMutate);
181
+ }
182
+ // if (settingsToUpdate.length > 0) {
183
+ // await this.repo.save(settingsToUpdate);
184
+ // }
185
+ }
199
186
 
200
- const defaultSettings = this.getDefaultSettings();
201
- return defaultSettings[settingKey];
202
- } catch (error) {
203
- const defaultSettings = this.getDefaultSettings();
204
- return defaultSettings[settingKey];
187
+ /**
188
+ * 2.
189
+ * Method used from the solid-core-ui to fetch available settings.
190
+ * Here we are returning settings other than system-env.
191
+ *
192
+ * @returns
193
+ */
194
+ async getSystemAdminReadonlyAndAboveSettings(): Promise<Record<any, any>> {
195
+ const finalSettings: Record<any, any> = {};
196
+ const systemAdminReadonlyAndAboveSettings = this.settings.filter(i => i.level !== "system-env");
197
+ for (const setting of systemAdminReadonlyAndAboveSettings) {
198
+ finalSettings[setting.key] = setting.value;
205
199
  }
200
+ return finalSettings;
206
201
  }
207
202
 
203
+ /**
204
+ * 3.
205
+ * This method updates settings from the admin user interface.
206
+ * Most likely settings with level system-admin-editable & internal-user are the ones that will get modified here.
207
+ *
208
+ * @param settings
209
+ * @param uploadedFiles
210
+ * @returns
211
+ */
208
212
  async updateSettings(settings: CreateSettingDto[] = [], uploadedFiles: Array<Express.Multer.File> = []): Promise<Setting[]> {
209
213
  const activeUser = this.requestContextService.getActiveUser();
210
214
  const userId = activeUser?.sub;
211
215
 
212
- const existingSettings = await this.repo.find();
216
+ const restrictedKeys = new Set<string>();
217
+
218
+ settings.forEach(setting => {
219
+ if (this.isDisallowedSettingKey(setting.key, [SettingLevel.SystemEnv, SettingLevel.SystemAdminReadonly])) {
220
+ restrictedKeys.add(setting.key);
221
+ }
222
+ });
223
+ uploadedFiles.forEach(file => {
224
+ if (this.isDisallowedSettingKey(file.fieldname, [SettingLevel.SystemEnv, SettingLevel.SystemAdminReadonly])) {
225
+ restrictedKeys.add(file.fieldname);
226
+ }
227
+ });
228
+
229
+ if (restrictedKeys.size > 0) {
230
+ throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);
231
+ }
232
+
233
+ // const existingSettings = await this.repo.find();
234
+ const existingSettings: Setting[] = await this.getSettingsFromDb();
213
235
 
214
236
  const settingsToUpdate: Setting[] = [];
215
237
  const settingsToCreate: Setting[] = [];
@@ -225,8 +247,9 @@ export class SettingService extends CRUDService<Setting> {
225
247
  for (const file of uploadedFiles) {
226
248
  const settingKey = file.fieldname;
227
249
  const relativeFileName = `${file.filename}-${file.originalname}`;
228
- const storagePath = `${this.configService.get('app-builder.fileStorageDir')}/${relativeFileName}`;
229
- const baseUrl = process.env.BASE_URL || '';
250
+ const fileStorageDir = this.getConfigValue<SolidCoreSetting>("fileStorageDir")
251
+ const storagePath = `${fileStorageDir}/${relativeFileName}`;
252
+ const baseUrl = this.getConfigValue<SolidCoreSetting>("baseUrl") || '';
230
253
  const fileUrl = `${baseUrl}/${storagePath}`;
231
254
 
232
255
  await this.fileService.copyFile(file.path, storagePath);
@@ -294,54 +317,42 @@ export class SettingService extends CRUDService<Setting> {
294
317
  if (settingsToCreate.length > 0) {
295
318
  await this.repo.save(settingsToCreate);
296
319
  }
320
+ await this.updateSettingsCache();
297
321
 
298
322
  return [...settingsToUpdate, ...settingsToCreate];
299
323
  }
300
324
 
301
- async getAllSettings(): Promise<{ system: Record<string, any>, user: Record<string, any> }> {
302
- const settingsArray = await this.repo.find({ relations: ['user'] });
303
-
304
- const system: Record<string, any> = {};
305
- const user: Record<string, any> = {};
306
- const arrayKeysToSkip = [
307
- 'authenticationPasswordRegex',
308
- 'authenticationPasswordRegexErrorMessage',
309
- 'authenticationPasswordComplexityDescription',
310
- ];
311
- for (const setting of settingsArray) {
312
- if (setting.key && setting.value !== undefined && setting.value !== null) {
313
- const value = setting.value;
314
- let parsedValue: any;
315
-
316
- try {
317
- parsedValue = JSON.parse(value);
318
- } catch {
319
- if (value === 'true' || value === 'false') {
320
- parsedValue = value === 'true';
321
- } else if (!isNaN(Number(value)) && value.trim() !== '') {
322
- parsedValue = Number(value);
323
- } else if (!arrayKeysToSkip.includes(setting.key) && value.includes(',')) {
324
- parsedValue = value.split(',').map(item => item.trim());
325
- } else {
326
- parsedValue = value;
327
- }
328
- }
329
- if (setting.type === 'user') {
330
- user[setting.key] = parsedValue;
331
- } else {
332
- system[setting.key] = parsedValue;
333
- }
334
- }
325
+ /**
326
+ * 4.
327
+ * @param settingKey
328
+ * @returns
329
+ */
330
+ getConfigValue<T = never>(settingKey: NoInfer<T>) {
331
+ const cachedSetting = this.settingsByKey.get(settingKey as string);
332
+ if (cachedSetting) {
333
+ return cachedSetting.value;
335
334
  }
336
335
 
337
- return { system, user };
336
+ return null;
337
+
338
+ // const cachedSetting = this.settings.find(setting => setting.key === settingKey);
339
+ // if (cachedSetting) {
340
+ // return cachedSetting.value;
341
+ // }
342
+
343
+ // // This is probably not needed at all, but leaving it here as a backup for scenarios like
344
+ // // if getConfigValue<SolidCoreSetting>() is called before onApplicationBootstrap() runs or if the cache refresh fails.
345
+ // const getAllSettings = this.getAllSettingsFromProviders();
346
+ // const settingValue = getAllSettings.find(i => (i.key == settingKey))
347
+ // return settingValue?.value;
338
348
  }
339
349
 
340
350
  async getMcpUrl(getMcpUrlDto: GetMcpUrlDto, solidRequestContext: any = {}): Promise<any> {
341
351
 
342
352
  const { showHeader, inListView } = getMcpUrlDto;
343
353
 
344
- if (process.env.MCP_ENABLED === 'false') {
354
+ const mcpEnabled = this.getConfigValue<SolidCoreSetting>('mcpEnabled');
355
+ if (mcpEnabled === 'false' || mcpEnabled === false) {
345
356
  throw new ForbiddenException(ERROR_MESSAGES.FORBIDDEN);
346
357
  }
347
358
 
@@ -353,9 +364,9 @@ export class SettingService extends CRUDService<Setting> {
353
364
  throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);
354
365
  }
355
366
  }
356
- const apiKey = process.env.MCP_API_KEY;
367
+ const apiKey = this.getConfigValue<SolidCoreSetting>('mcpApiKey');
357
368
  const userId = solidRequestContext.activeUser.sub;
358
- const mcpServerUrl = process.env.MCP_SERVER_URL;
369
+ const mcpServerUrl = this.getConfigValue<SolidCoreSetting>('mcpServerUrl');
359
370
  return { mcpUrl: `${mcpServerUrl}/static/frontend.html?solidx-mcp-api-key=${apiKey}&solidx-user-id=${userId}&solidx-show-header=${showHeader}&solidx-in-list-view=${inListView}` };
360
371
  }
361
372