@solidxai/core 0.1.10-beta.2 → 0.1.10-beta.21

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 (322) hide show
  1. package/dist/commands/refresh-model.command.d.ts +1 -7
  2. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  3. package/dist/commands/refresh-model.command.js +4 -49
  4. package/dist/commands/refresh-model.command.js.map +1 -1
  5. package/dist/commands/refresh-module.command.d.ts +0 -2
  6. package/dist/commands/refresh-module.command.d.ts.map +1 -1
  7. package/dist/commands/refresh-module.command.js +3 -16
  8. package/dist/commands/refresh-module.command.js.map +1 -1
  9. package/dist/commands/test-data.command.d.ts +2 -0
  10. package/dist/commands/test-data.command.d.ts.map +1 -1
  11. package/dist/commands/test-data.command.js +32 -6
  12. package/dist/commands/test-data.command.js.map +1 -1
  13. package/dist/controllers/action-metadata.controller.js +1 -1
  14. package/dist/controllers/action-metadata.controller.js.map +1 -1
  15. package/dist/controllers/chatter-message.controller.d.ts +2 -0
  16. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  17. package/dist/controllers/chatter-message.controller.js +17 -0
  18. package/dist/controllers/chatter-message.controller.js.map +1 -1
  19. package/dist/controllers/facebook-authentication.controller.js +1 -1
  20. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  21. package/dist/controllers/google-authentication.controller.js +1 -1
  22. package/dist/controllers/google-authentication.controller.js.map +1 -1
  23. package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
  24. package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
  25. package/dist/controllers/gupshup-webhook.controller.js +87 -0
  26. package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
  27. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  28. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  29. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  30. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  31. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  32. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  33. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
  34. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
  35. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
  36. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
  37. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  38. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  39. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  40. package/dist/controllers/model-metadata.controller.js +2 -2
  41. package/dist/controllers/model-metadata.controller.js.map +1 -1
  42. package/dist/controllers/module-metadata.controller.js +1 -1
  43. package/dist/controllers/module-metadata.controller.js.map +1 -1
  44. package/dist/controllers/mq-message-queue.controller.js +1 -1
  45. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  46. package/dist/controllers/mq-message.controller.js +1 -1
  47. package/dist/controllers/mq-message.controller.js.map +1 -1
  48. package/dist/controllers/view-metadata.controller.js +1 -1
  49. package/dist/controllers/view-metadata.controller.js.map +1 -1
  50. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  51. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  52. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  53. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  54. package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
  55. package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
  56. package/dist/dtos/update-chatter-note-message.dto.js +34 -0
  57. package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
  58. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  59. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  60. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  61. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  62. package/dist/dtos/update-user.dto.d.ts +1 -0
  63. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  64. package/dist/dtos/update-user.dto.js +7 -1
  65. package/dist/dtos/update-user.dto.js.map +1 -1
  66. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  67. package/dist/entities/chatter-message-details.entity.js +0 -1
  68. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  69. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  70. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  71. package/dist/entities/mcp-audit-log.entity.js +90 -0
  72. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  73. package/dist/entities/user.entity.js +1 -0
  74. package/dist/entities/user.entity.js.map +1 -1
  75. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  76. package/dist/factories/whatsapp.factory.js +13 -11
  77. package/dist/factories/whatsapp.factory.js.map +1 -1
  78. package/dist/helpers/bootstrap.helper.d.ts +1 -0
  79. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  80. package/dist/helpers/bootstrap.helper.js +8 -3
  81. package/dist/helpers/bootstrap.helper.js.map +1 -1
  82. package/dist/helpers/command.service.d.ts +1 -0
  83. package/dist/helpers/command.service.d.ts.map +1 -1
  84. package/dist/helpers/command.service.js +1 -0
  85. package/dist/helpers/command.service.js.map +1 -1
  86. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  87. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  88. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  89. package/dist/index.d.ts +6 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +6 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/interfaces.d.ts +1 -2
  94. package/dist/interfaces.d.ts.map +1 -1
  95. package/dist/interfaces.js.map +1 -1
  96. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  97. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  98. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  99. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  100. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  101. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  102. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  103. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  104. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  105. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  106. package/dist/listeners/user-registration.listener.d.ts +5 -2
  107. package/dist/listeners/user-registration.listener.d.ts.map +1 -1
  108. package/dist/listeners/user-registration.listener.js +37 -4
  109. package/dist/listeners/user-registration.listener.js.map +1 -1
  110. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  111. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  112. package/dist/repository/mcp-audit-log.repository.js +34 -0
  113. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  114. package/dist/repository/security-rule.repository.js.map +1 -1
  115. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  116. package/dist/seeders/module-test-data.service.d.ts +9 -0
  117. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  118. package/dist/seeders/module-test-data.service.js +155 -18
  119. package/dist/seeders/module-test-data.service.js.map +1 -1
  120. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  121. package/dist/seeders/seed-data/solid-core-metadata.json +381 -2
  122. package/dist/services/authentication.service.d.ts +6 -1
  123. package/dist/services/authentication.service.d.ts.map +1 -1
  124. package/dist/services/authentication.service.js +145 -15
  125. package/dist/services/authentication.service.js.map +1 -1
  126. package/dist/services/chatter-message.service.d.ts +13 -4
  127. package/dist/services/chatter-message.service.d.ts.map +1 -1
  128. package/dist/services/chatter-message.service.js +117 -37
  129. package/dist/services/chatter-message.service.js.map +1 -1
  130. package/dist/services/crud.service.js.map +1 -1
  131. package/dist/services/csv.service.js.map +1 -1
  132. package/dist/services/dashboard.service.js.map +1 -1
  133. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  134. package/dist/services/excel.service.js.map +1 -1
  135. package/dist/services/export-transaction.service.js.map +1 -1
  136. package/dist/services/field-metadata.service.js.map +1 -1
  137. package/dist/services/fixtures.service.js.map +1 -1
  138. package/dist/services/import-transaction.service.js.map +1 -1
  139. package/dist/services/list-of-values.service.js.map +1 -1
  140. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  141. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  142. package/dist/services/mcp-audit-log.service.js +38 -0
  143. package/dist/services/mcp-audit-log.service.js.map +1 -0
  144. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
  145. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  146. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
  147. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  148. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
  149. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  150. package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
  151. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  152. package/dist/services/model-metadata.service.d.ts +4 -1
  153. package/dist/services/model-metadata.service.d.ts.map +1 -1
  154. package/dist/services/model-metadata.service.js +24 -24
  155. package/dist/services/model-metadata.service.js.map +1 -1
  156. package/dist/services/module-metadata.service.d.ts +4 -1
  157. package/dist/services/module-metadata.service.d.ts.map +1 -1
  158. package/dist/services/module-metadata.service.js +19 -2
  159. package/dist/services/module-metadata.service.js.map +1 -1
  160. package/dist/services/queues/database-publisher.service.js +3 -3
  161. package/dist/services/queues/database-publisher.service.js.map +1 -1
  162. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  163. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  164. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  165. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  166. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  167. package/dist/services/queues/redis-publisher.service.js +4 -1
  168. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  169. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  170. package/dist/services/role-metadata.service.js.map +1 -1
  171. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  172. package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
  173. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  174. package/dist/services/settings/default-settings-provider.service.js +119 -4
  175. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  176. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  177. package/dist/services/solid-introspect.service.js.map +1 -1
  178. package/dist/services/user-activity-history.service.js.map +1 -1
  179. package/dist/services/user.service.js +1 -1
  180. package/dist/services/user.service.js.map +1 -1
  181. package/dist/services/view-metadata.service.d.ts.map +1 -1
  182. package/dist/services/view-metadata.service.js +17 -2
  183. package/dist/services/view-metadata.service.js.map +1 -1
  184. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
  185. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
  186. package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
  187. package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
  188. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
  189. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
  190. package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
  191. package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
  192. package/dist/solid-core.module.d.ts +2 -2
  193. package/dist/solid-core.module.d.ts.map +1 -1
  194. package/dist/solid-core.module.js +22 -6
  195. package/dist/solid-core.module.js.map +1 -1
  196. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  197. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  198. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  199. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  200. package/dist/testing/core/testing-engine.js.map +1 -1
  201. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  202. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  203. package/dist/testing/reporter/console-reporter.js +21 -0
  204. package/dist/testing/reporter/console-reporter.js.map +1 -1
  205. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  206. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  207. package/dist/testing/reporter/reporter.types.js.map +1 -1
  208. package/dist/testing/reporter/webhook-reporter.js.map +1 -1
  209. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  210. package/dist/testing/runner/run-from-metadata.js +20 -1
  211. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  212. package/dist/winston.logger.d.ts +5 -0
  213. package/dist/winston.logger.d.ts.map +1 -1
  214. package/dist/winston.logger.js +6 -4
  215. package/dist/winston.logger.js.map +1 -1
  216. package/dist-tests/api/authenticate.spec.js +119 -0
  217. package/dist-tests/api/authenticate.spec.js.map +1 -0
  218. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
  219. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
  220. package/dist-tests/api/ping.spec.js +21 -0
  221. package/dist-tests/api/ping.spec.js.map +1 -0
  222. package/dist-tests/helpers/auth.js +41 -0
  223. package/dist-tests/helpers/auth.js.map +1 -0
  224. package/dist-tests/helpers/env.js +11 -0
  225. package/dist-tests/helpers/env.js.map +1 -0
  226. package/docs/grouping-enhancements.md +89 -0
  227. package/docs/java-spring/README.md +3 -0
  228. package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
  229. package/docs/seed-changes.md +65 -0
  230. package/docs/test-data-workflow.md +200 -0
  231. package/docs/type-declaration-import-issue.md +24 -0
  232. package/package.json +8 -8
  233. package/src/commands/refresh-model.command.ts +6 -51
  234. package/src/commands/refresh-module.command.ts +3 -16
  235. package/src/commands/test-data.command.ts +29 -6
  236. package/src/controllers/action-metadata.controller.ts +1 -1
  237. package/src/controllers/chatter-message.controller.ts +12 -0
  238. package/src/controllers/facebook-authentication.controller.ts +1 -1
  239. package/src/controllers/google-authentication.controller.ts +1 -1
  240. package/src/controllers/gupshup-webhook.controller.ts +91 -0
  241. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  242. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  243. package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
  244. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  245. package/src/controllers/model-metadata.controller.ts +1 -1
  246. package/src/controllers/module-metadata.controller.ts +1 -1
  247. package/src/controllers/mq-message-queue.controller.ts +1 -1
  248. package/src/controllers/mq-message.controller.ts +1 -1
  249. package/src/controllers/view-metadata.controller.ts +1 -1
  250. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  251. package/src/dtos/update-chatter-note-message.dto.ts +14 -0
  252. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  253. package/src/dtos/update-user.dto.ts +4 -0
  254. package/src/entities/chatter-message-details.entity.ts +1 -2
  255. package/src/entities/mcp-audit-log.entity.ts +55 -0
  256. package/src/entities/user.entity.ts +1 -1
  257. package/src/factories/whatsapp.factory.ts +33 -32
  258. package/src/helpers/bootstrap.helper.ts +16 -6
  259. package/src/helpers/command.service.ts +2 -0
  260. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  261. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  262. package/src/helpers/field-crud-managers/field-quality-check-fixes.md +178 -0
  263. package/src/helpers/module-metadata-helper.service.ts +1 -1
  264. package/src/index.ts +6 -0
  265. package/src/interfaces.ts +1 -3
  266. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  267. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  268. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  269. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  270. package/src/listeners/user-registration.listener.ts +49 -6
  271. package/src/repository/mcp-audit-log.repository.ts +17 -0
  272. package/src/repository/security-rule.repository.ts +1 -1
  273. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  274. package/src/seeders/module-test-data.service.ts +186 -17
  275. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  276. package/src/seeders/seed-data/solid-core-metadata.json +381 -2
  277. package/src/services/authentication.service.ts +267 -44
  278. package/src/services/chatter-message.service.ts +140 -40
  279. package/src/services/crud.service.ts +1 -1
  280. package/src/services/csv.service.ts +1 -1
  281. package/src/services/dashboard.service.ts +1 -1
  282. package/src/services/database/database-bootstrap.service.ts +1 -1
  283. package/src/services/excel.service.ts +1 -1
  284. package/src/services/export-transaction.service.ts +2 -2
  285. package/src/services/field-metadata.service.ts +1 -1
  286. package/src/services/fixtures.service.ts +2 -2
  287. package/src/services/import-transaction.service.ts +2 -2
  288. package/src/services/list-of-values.service.ts +1 -1
  289. package/src/services/mcp-audit-log.service.ts +19 -0
  290. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
  291. package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
  292. package/src/services/model-metadata.service.ts +36 -34
  293. package/src/services/module-metadata.service.ts +19 -7
  294. package/src/services/queues/database-publisher.service.ts +4 -4
  295. package/src/services/queues/database-subscriber.service.ts +1 -1
  296. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  297. package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
  298. package/src/services/queues/redis-publisher.service.ts +7 -4
  299. package/src/services/queues/redis-subscriber.service.ts +4 -4
  300. package/src/services/role-metadata.service.ts +1 -1
  301. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  302. package/src/services/settings/default-settings-provider.service.ts +119 -4
  303. package/src/services/sms/TwilioSMSService.ts +2 -2
  304. package/src/services/solid-introspect.service.ts +2 -2
  305. package/src/services/user-activity-history.service.ts +1 -1
  306. package/src/services/user.service.ts +1 -1
  307. package/src/services/view-metadata.service.ts +25 -8
  308. package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
  309. package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
  310. package/src/solid-core.module.ts +213 -196
  311. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  312. package/src/subscribers/security-rule.subscriber.ts +8 -8
  313. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  314. package/src/testing/README.md +15 -0
  315. package/src/testing/core/testing-engine.ts +2 -2
  316. package/src/testing/reporter/console-reporter.ts +27 -0
  317. package/src/testing/reporter/reporter.types.ts +7 -0
  318. package/src/testing/reporter/webhook-reporter.ts +1 -1
  319. package/src/testing/runner/run-from-metadata.ts +19 -1
  320. package/src/winston.logger.ts +5 -7
  321. package/.claude/settings.local.json +0 -15
  322. package/src/services/1.js +0 -6
@@ -50,6 +50,7 @@ import { SettingService } from "./setting.service";
50
50
  import { UserActivityHistoryService } from "./user-activity-history.service";
51
51
  import { UserService } from "./user.service";
52
52
  import { SmsFactory } from "src/factories/sms.factory";
53
+ import { WhatsAppFactory } from "src/factories/whatsapp.factory";
53
54
  import { SolidRegistry } from "src/helpers/solid-registry";
54
55
 
55
56
  enum LoginProvider {
@@ -79,6 +80,7 @@ export class AuthenticationService {
79
80
  private readonly mailServiceFactory: MailFactory,
80
81
  // private readonly smsService: Msg91OTPService,
81
82
  private readonly smsFactory: SmsFactory,
83
+ private readonly whatsAppFactory: WhatsAppFactory,
82
84
  private readonly eventEmitter: EventEmitter2,
83
85
  private readonly settingService: SettingService,
84
86
  private readonly roleMetadataService: RoleMetadataService,
@@ -164,6 +166,8 @@ export class AuthenticationService {
164
166
  "mobile",
165
167
  "roles",
166
168
  "forcePasswordChange",
169
+ "isAllowedToGenerateApiKeys",
170
+ "failedLoginAttempts",
167
171
  ]);
168
172
 
169
173
  async signUp(
@@ -228,9 +232,11 @@ export class AuthenticationService {
228
232
  userRoles.push(defaultRole);
229
233
  }
230
234
  await this.handlePostSignup(savedUser, userRoles, pwd, autoGeneratedPwd);
235
+ await this.handlePasswordlessSignupOtp(savedUser, signUpDto, autoGeneratedPwd, repo);
236
+ this.triggerRegistrationEvent(savedUser);
231
237
 
232
238
  return savedUser;
233
- } catch (err) {
239
+ } catch (err: any) {
234
240
  const pgUniqueViolationErrorCode = "23505";
235
241
  if (err.code === pgUniqueViolationErrorCode) {
236
242
  throw new ConflictException(
@@ -243,6 +249,42 @@ export class AuthenticationService {
243
249
  }
244
250
  }
245
251
 
252
+ private async handlePasswordlessSignupOtp<T extends User>(
253
+ user: T,
254
+ signUpDto: SignUpDto,
255
+ autoGeneratedPwd: string,
256
+ repo: Repository<T>,
257
+ ): Promise<void> {
258
+ const isPasswordProvided = !!signUpDto.password;
259
+ const isAutoGeneratedPassword = !!autoGeneratedPwd;
260
+ if (isPasswordProvided || isAutoGeneratedPassword) {
261
+ return;
262
+ }
263
+
264
+ if (!user.mobile) {
265
+ this.logger.warn(
266
+ `Skipping passwordless signup OTP WhatsApp notification for user ${user.username}: mobile is missing.`,
267
+ );
268
+ return;
269
+ }
270
+
271
+ const isPasswordlessRegistrationEnabled =
272
+ await this.isPasswordlessRegistrationEnabled();
273
+ if (!isPasswordlessRegistrationEnabled) {
274
+ return;
275
+ }
276
+
277
+ await this.assignRegistrationOtp(
278
+ PasswordlessRegistrationValidateWhatSources.MOBILE,
279
+ user,
280
+ );
281
+ await repo.save(user);
282
+ await this.notifyUserOnOtpInitiateRegistration(
283
+ user,
284
+ PasswordlessRegistrationValidateWhatSources.MOBILE,
285
+ );
286
+ }
287
+
246
288
  /** @deprecated Use IExtensionUserCreationProvider instead. Kept for backward compatibility. */
247
289
  async signupForExtensionUser<T extends User>(
248
290
  signUpDto: SignUpDto,
@@ -485,7 +527,7 @@ export class AuthenticationService {
485
527
  validationSource,
486
528
  );
487
529
  await this.notifyUserOnOtpInitiateRegistration(user, validationSource);
488
- } catch (err) {
530
+ } catch (err: any) {
489
531
  if (err.code === "23505") {
490
532
  throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);
491
533
  }
@@ -614,7 +656,7 @@ export class AuthenticationService {
614
656
  const companyLogo = await this.getCompanyLogo();
615
657
  if (
616
658
  registrationValidationSource ===
617
- PasswordlessLoginValidateWhatSources.EMAIL
659
+ PasswordlessRegistrationValidateWhatSources.EMAIL
618
660
  ) {
619
661
  const mailService = this.mailServiceFactory.getMailService();
620
662
  mailService.sendEmailUsingTemplate(
@@ -644,25 +686,141 @@ export class AuthenticationService {
644
686
  }
645
687
  if (
646
688
  registrationValidationSource ===
647
- PasswordlessLoginValidateWhatSources.MOBILE
689
+ PasswordlessRegistrationValidateWhatSources.MOBILE
648
690
  ) {
649
- const smsService = this.smsFactory.getSmsService();
650
- smsService.sendSMSUsingTemplate(
691
+ const templateParams = {
692
+ solidAppName:
693
+ this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
694
+ otp: user.mobileVerificationTokenOnRegistration,
695
+ mobileVerificationTokenOnRegistration:
696
+ user.mobileVerificationTokenOnRegistration,
697
+ firstName: user.username,
698
+ fullName: user.fullName ? user.fullName : user.username,
699
+ companyLogoUrl: companyLogo,
700
+ };
701
+
702
+ const whatsappDestination = this.normalizeWhatsAppDestination(
651
703
  user.mobile,
652
- "otp-on-register",
653
- {
654
- solidAppName:
655
- this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
656
- otp: user.mobileVerificationTokenOnRegistration,
657
- mobileVerificationTokenOnRegistration:
658
- user.mobileVerificationTokenOnRegistration,
659
- firstName: user.username,
660
- fullName: user.fullName ? user.fullName : user.username,
661
- companyLogoUrl: companyLogo,
662
- },
663
- this.settingService.getConfigValue<SolidCoreSetting>("shouldQueueSms"),
664
704
  );
705
+ const gupshupTemplateAppName =
706
+ process.env.COMMON_GUPSHUP_APP_NAME || "Gupshup";
707
+ const whatsappTemplateId =
708
+ this.settingService.getConfigValue<SolidCoreSetting>(
709
+ "otpWhatsappTemplateId",
710
+ ) || "common_otp";
711
+ const whatsappIndependentEnabled =
712
+ this.settingService.getConfigValue<SolidCoreSetting>(
713
+ "otpWhatsappIndependentEnabled",
714
+ ) !== false;
715
+
716
+ let smsSent = false;
717
+ let whatsappSent = false;
718
+ let smsErrorMessage: string | undefined;
719
+ let whatsappErrorMessage: string | undefined;
720
+
721
+ this.logger.debug(
722
+ `OTP SMS send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}`,
723
+ );
724
+
725
+ try {
726
+ const smsService = this.smsFactory.getSmsService();
727
+ await smsService.sendSMSUsingTemplate(
728
+ user.mobile,
729
+ "otp-on-register",
730
+ templateParams,
731
+ false,
732
+ );
733
+ smsSent = true;
734
+ } catch (smsError: any) {
735
+ smsErrorMessage = smsError?.message;
736
+ this.logger.warn(
737
+ `OTP SMS failed: destination=${user.mobile}, message=${smsErrorMessage}`,
738
+ );
739
+ }
740
+
741
+ if (whatsappIndependentEnabled) {
742
+ if (!whatsappDestination) {
743
+ whatsappErrorMessage = "Normalized WhatsApp destination is empty";
744
+ this.logger.error(
745
+ `Independent OTP WhatsApp skipped: destination=${user.mobile}, message=${whatsappErrorMessage}`,
746
+ );
747
+ } else {
748
+ this.logger.debug(
749
+ `Independent OTP WhatsApp send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
750
+ );
751
+ try {
752
+ await this.sendOtpToWhatsappProvider(
753
+ whatsappDestination,
754
+ String(whatsappTemplateId),
755
+ String(gupshupTemplateAppName),
756
+ String(templateParams.otp || ""),
757
+ );
758
+ whatsappSent = true;
759
+ this.logger.log(
760
+ `Independent OTP WhatsApp success: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
761
+ );
762
+ } catch (waError: any) {
763
+ whatsappErrorMessage = waError?.message;
764
+ this.logger.error(
765
+ `Independent OTP WhatsApp failed: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}, message=${whatsappErrorMessage}`,
766
+ );
767
+ }
768
+ }
769
+ }
770
+
771
+ if (!smsSent && !whatsappSent) {
772
+ throw new Error(
773
+ `OTP delivery failed on both channels. smsError=${smsErrorMessage || "unknown"}, whatsappError=${whatsappErrorMessage || "disabled/unknown"}`,
774
+ );
775
+ }
776
+ }
777
+ }
778
+
779
+ private normalizeWhatsAppDestination(rawMobile: string): string {
780
+ const raw = (rawMobile || "").trim();
781
+ let sanitized = raw.replace(/[^\d+]/g, "");
782
+
783
+ if (sanitized.startsWith("00")) {
784
+ sanitized = `+${sanitized.slice(2)}`;
785
+ }
786
+
787
+ const defaultDialCode = String(
788
+ this.settingService.getConfigValue<SolidCoreSetting>(
789
+ "otpDefaultCountryDialCode",
790
+ ) || "",
791
+ ).replace(/\D/g, "");
792
+
793
+ if (sanitized.startsWith("+")) {
794
+ const e164Digits = sanitized.slice(1).replace(/\D/g, "");
795
+ if (e164Digits.length >= 8 && e164Digits.length <= 15) {
796
+ return e164Digits;
797
+ }
665
798
  }
799
+
800
+ const digits = sanitized.replace(/\D/g, "");
801
+
802
+ if (digits.length >= 11 && digits.length <= 15) {
803
+ return digits;
804
+ }
805
+
806
+ if (digits.length === 10 && defaultDialCode) {
807
+ return `${defaultDialCode}${digits}`;
808
+ }
809
+
810
+ return digits;
811
+ }
812
+
813
+ private async sendOtpToWhatsappProvider(
814
+ destination: string,
815
+ templateId: string,
816
+ appName: string,
817
+ otp: string,
818
+ ): Promise<void> {
819
+ const whatsappService = this.whatsAppFactory.getWhatsappService();
820
+ await whatsappService.sendWhatsAppMessage(destination, null, {
821
+ type: "text",
822
+ text: `${appName} OTP is ${otp}. It is valid for 10 mins.`,
823
+ });
666
824
  }
667
825
 
668
826
  async otpConfirmRegistration(confirmSignUpDto: OTPConfirmOTPDto) {
@@ -765,7 +923,7 @@ export class AuthenticationService {
765
923
  this.resolvePasswordlessValidationSource();
766
924
  if (
767
925
  registrationValidationSource ===
768
- PasswordlessLoginValidateWhatSources.EMAIL
926
+ PasswordlessRegistrationValidateWhatSources.EMAIL
769
927
  ) {
770
928
  if (!user.emailVerifiedOnRegistrationAt) {
771
929
  return false;
@@ -773,7 +931,7 @@ export class AuthenticationService {
773
931
  }
774
932
  if (
775
933
  registrationValidationSource ===
776
- PasswordlessLoginValidateWhatSources.MOBILE
934
+ PasswordlessRegistrationValidateWhatSources.MOBILE
777
935
  ) {
778
936
  if (!user.mobileVerifiedOnRegistrationAt) {
779
937
  return false;
@@ -888,7 +1046,7 @@ export class AuthenticationService {
888
1046
  const dummyOtp = this.getDummyOtpForUser(user);
889
1047
  if (!dummyOtp) {
890
1048
  await this.assignLoginOtp(user, type);
891
- this.notifyUserOnOtpInititateLogin(user, type);
1049
+ await this.notifyUserOnOtpInititateLogin(user, type);
892
1050
  }
893
1051
  return this.buildLoginOtpResponse(user, type);
894
1052
  }
@@ -1013,21 +1171,88 @@ export class AuthenticationService {
1013
1171
  );
1014
1172
  }
1015
1173
  if (loginType === PasswordlessLoginValidateWhatSources.MOBILE) {
1016
- const smsService = this.smsFactory.getSmsService();
1017
- smsService.sendSMSUsingTemplate(
1018
- user.mobile,
1019
- "otp-on-login",
1020
- {
1021
- solidAppName:
1022
- this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
1023
- otp: user.mobileVerificationTokenOnLogin,
1024
- mobileVerificationTokenOnLogin: user.mobileVerificationTokenOnLogin,
1025
- firstName: user.username,
1026
- fullName: user.fullName ? user.fullName : user.username,
1027
- companyLogoUrl: companyLogo,
1028
- },
1029
- this.settingService.getConfigValue<SolidCoreSetting>("shouldQueueSms"),
1174
+ const templateParams = {
1175
+ solidAppName:
1176
+ this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
1177
+ otp: user.mobileVerificationTokenOnLogin,
1178
+ mobileVerificationTokenOnLogin: user.mobileVerificationTokenOnLogin,
1179
+ firstName: user.username,
1180
+ fullName: user.fullName ? user.fullName : user.username,
1181
+ companyLogoUrl: companyLogo,
1182
+ };
1183
+
1184
+ const whatsappDestination = this.normalizeWhatsAppDestination(user.mobile);
1185
+ const gupshupTemplateAppName =
1186
+ process.env.COMMON_GUPSHUP_APP_NAME || "Gupshup";
1187
+ const whatsappTemplateId =
1188
+ this.settingService.getConfigValue<SolidCoreSetting>(
1189
+ "otpWhatsappTemplateId",
1190
+ ) || "common_otp";
1191
+ const whatsappIndependentEnabled =
1192
+ this.settingService.getConfigValue<SolidCoreSetting>(
1193
+ "otpWhatsappIndependentEnabled",
1194
+ ) !== false;
1195
+
1196
+ let smsSent = false;
1197
+ let whatsappSent = false;
1198
+ let smsErrorMessage: string | undefined;
1199
+ let whatsappErrorMessage: string | undefined;
1200
+
1201
+ this.logger.debug(
1202
+ `OTP LOGIN SMS send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}`,
1030
1203
  );
1204
+
1205
+ try {
1206
+ const smsService = this.smsFactory.getSmsService();
1207
+ await smsService.sendSMSUsingTemplate(
1208
+ user.mobile,
1209
+ "otp-on-login",
1210
+ templateParams,
1211
+ false,
1212
+ );
1213
+ smsSent = true;
1214
+ } catch (smsError: any) {
1215
+ smsErrorMessage = smsError?.message;
1216
+ this.logger.warn(
1217
+ `OTP LOGIN SMS failed: destination=${user.mobile}, message=${smsErrorMessage}`,
1218
+ );
1219
+ }
1220
+
1221
+ if (whatsappIndependentEnabled) {
1222
+ if (!whatsappDestination) {
1223
+ whatsappErrorMessage = "Normalized WhatsApp destination is empty";
1224
+ this.logger.error(
1225
+ `OTP LOGIN WhatsApp skipped: destination=${user.mobile}, message=${whatsappErrorMessage}`,
1226
+ );
1227
+ } else {
1228
+ this.logger.debug(
1229
+ `OTP LOGIN WhatsApp send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
1230
+ );
1231
+ try {
1232
+ await this.sendOtpToWhatsappProvider(
1233
+ whatsappDestination,
1234
+ String(whatsappTemplateId),
1235
+ String(gupshupTemplateAppName),
1236
+ String(templateParams.otp || ""),
1237
+ );
1238
+ whatsappSent = true;
1239
+ this.logger.log(
1240
+ `OTP LOGIN WhatsApp success: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
1241
+ );
1242
+ } catch (waError: any) {
1243
+ whatsappErrorMessage = waError?.message;
1244
+ this.logger.error(
1245
+ `OTP LOGIN WhatsApp failed: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}, message=${whatsappErrorMessage}`,
1246
+ );
1247
+ }
1248
+ }
1249
+ }
1250
+
1251
+ if (!smsSent && !whatsappSent) {
1252
+ throw new Error(
1253
+ `OTP LOGIN delivery failed on both channels. smsError=${smsErrorMessage || "unknown"}, whatsappError=${whatsappErrorMessage || "disabled/unknown"}`,
1254
+ );
1255
+ }
1031
1256
  }
1032
1257
  }
1033
1258
 
@@ -1335,12 +1560,10 @@ export class AuthenticationService {
1335
1560
  const user = await this.resolveUserByVerificationToken(
1336
1561
  confirmForgotPasswordDto.verificationToken,
1337
1562
  );
1338
- if (!user)
1339
- throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
1563
+ if (!user) throw new UnauthorizedException("Invalid verification token");
1340
1564
  if (user.lastLoginProvider !== "local")
1341
1565
  throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
1342
- if (!user.active)
1343
- throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
1566
+ if (!user.active) throw new UnauthorizedException("User is inactive");
1344
1567
 
1345
1568
  // 1) Atomically consume the token (only one request can succeed)
1346
1569
  const { affected } = await m
@@ -1548,7 +1771,7 @@ export class AuthenticationService {
1548
1771
  accessToken: await this.generateAccessToken(user),
1549
1772
  refreshToken: currentRefreshToken,
1550
1773
  };
1551
- } catch (err) {
1774
+ } catch (err: any) {
1552
1775
  if (err instanceof InvalidatedRefreshTokenError) {
1553
1776
  // Take action: notify user that his refresh token might have been stolen?
1554
1777
  throw new UnauthorizedException(ERROR_MESSAGES.ACCESS_DENIED);
@@ -1599,7 +1822,7 @@ export class AuthenticationService {
1599
1822
  } else {
1600
1823
  throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
1601
1824
  }
1602
- } catch (error) {
1825
+ } catch (error: any) {
1603
1826
  throw new UnauthorizedException(
1604
1827
  ERROR_MESSAGES.GOOGLE_OAUTH_PROFILE_FETCH_FAILED,
1605
1828
  );
@@ -1668,7 +1891,7 @@ export class AuthenticationService {
1668
1891
  } else {
1669
1892
  throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
1670
1893
  }
1671
- } catch (error) {
1894
+ } catch (error: any) {
1672
1895
  if (error instanceof UnauthorizedException) {
1673
1896
  throw error;
1674
1897
  }
@@ -1733,7 +1956,7 @@ export class AuthenticationService {
1733
1956
  } else {
1734
1957
  throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
1735
1958
  }
1736
- } catch (error) {
1959
+ } catch (error: any) {
1737
1960
  throw new UnauthorizedException("Microsoft OAuth profile fetch failed");
1738
1961
  }
1739
1962
  }
@@ -1880,7 +2103,7 @@ export class AuthenticationService {
1880
2103
  await this.userActivityHistoryService.logEvent("logout", user);
1881
2104
 
1882
2105
  return { message: SUCCESS_MESSAGES.LOGOUT_SUCCESS };
1883
- } catch (err) {
2106
+ } catch (err: any) {
1884
2107
  throw err instanceof UnauthorizedException ||
1885
2108
  err instanceof InternalServerErrorException
1886
2109
  ? err