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

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 (320) hide show
  1. package/CLAUDE.md +18 -0
  2. package/CURRENT_PROMPT +6 -0
  3. package/dist/commands/refresh-model.command.d.ts +1 -7
  4. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  5. package/dist/commands/refresh-model.command.js +4 -49
  6. package/dist/commands/refresh-model.command.js.map +1 -1
  7. package/dist/commands/refresh-module.command.d.ts +0 -2
  8. package/dist/commands/refresh-module.command.d.ts.map +1 -1
  9. package/dist/commands/refresh-module.command.js +3 -16
  10. package/dist/commands/refresh-module.command.js.map +1 -1
  11. package/dist/commands/test-data.command.d.ts +2 -0
  12. package/dist/commands/test-data.command.d.ts.map +1 -1
  13. package/dist/commands/test-data.command.js +32 -6
  14. package/dist/commands/test-data.command.js.map +1 -1
  15. package/dist/controllers/action-metadata.controller.js +1 -1
  16. package/dist/controllers/action-metadata.controller.js.map +1 -1
  17. package/dist/controllers/chatter-message.controller.d.ts +2 -0
  18. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  19. package/dist/controllers/chatter-message.controller.js +17 -0
  20. package/dist/controllers/chatter-message.controller.js.map +1 -1
  21. package/dist/controllers/facebook-authentication.controller.js +1 -1
  22. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  23. package/dist/controllers/google-authentication.controller.js +1 -1
  24. package/dist/controllers/google-authentication.controller.js.map +1 -1
  25. package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
  26. package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
  27. package/dist/controllers/gupshup-webhook.controller.js +87 -0
  28. package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
  29. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  30. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  31. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  32. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  33. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  34. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  35. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
  36. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
  37. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
  38. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
  39. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  40. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  41. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  42. package/dist/controllers/model-metadata.controller.js +2 -2
  43. package/dist/controllers/model-metadata.controller.js.map +1 -1
  44. package/dist/controllers/module-metadata.controller.js +1 -1
  45. package/dist/controllers/module-metadata.controller.js.map +1 -1
  46. package/dist/controllers/mq-message-queue.controller.js +1 -1
  47. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  48. package/dist/controllers/mq-message.controller.js +1 -1
  49. package/dist/controllers/mq-message.controller.js.map +1 -1
  50. package/dist/controllers/view-metadata.controller.js +1 -1
  51. package/dist/controllers/view-metadata.controller.js.map +1 -1
  52. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  53. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  54. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  55. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  56. package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
  57. package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
  58. package/dist/dtos/update-chatter-note-message.dto.js +34 -0
  59. package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
  60. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  61. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  62. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  63. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  64. package/dist/dtos/update-user.dto.d.ts +1 -0
  65. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  66. package/dist/dtos/update-user.dto.js +7 -1
  67. package/dist/dtos/update-user.dto.js.map +1 -1
  68. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  69. package/dist/entities/chatter-message-details.entity.js +0 -1
  70. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  71. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  72. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  73. package/dist/entities/mcp-audit-log.entity.js +90 -0
  74. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  75. package/dist/entities/user.entity.js +1 -0
  76. package/dist/entities/user.entity.js.map +1 -1
  77. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  78. package/dist/factories/whatsapp.factory.js +13 -11
  79. package/dist/factories/whatsapp.factory.js.map +1 -1
  80. package/dist/helpers/bootstrap.helper.d.ts +1 -0
  81. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  82. package/dist/helpers/bootstrap.helper.js +8 -3
  83. package/dist/helpers/bootstrap.helper.js.map +1 -1
  84. package/dist/helpers/command.service.d.ts +1 -0
  85. package/dist/helpers/command.service.d.ts.map +1 -1
  86. package/dist/helpers/command.service.js +1 -0
  87. package/dist/helpers/command.service.js.map +1 -1
  88. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  89. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  90. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  91. package/dist/index.d.ts +6 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +6 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/interfaces.d.ts +1 -2
  96. package/dist/interfaces.d.ts.map +1 -1
  97. package/dist/interfaces.js.map +1 -1
  98. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  99. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  100. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  101. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  102. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  103. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  104. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  105. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  106. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  107. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  108. package/dist/listeners/user-registration.listener.d.ts +5 -2
  109. package/dist/listeners/user-registration.listener.d.ts.map +1 -1
  110. package/dist/listeners/user-registration.listener.js +37 -4
  111. package/dist/listeners/user-registration.listener.js.map +1 -1
  112. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  113. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  114. package/dist/repository/mcp-audit-log.repository.js +34 -0
  115. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  116. package/dist/repository/security-rule.repository.js.map +1 -1
  117. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  118. package/dist/seeders/module-test-data.service.d.ts +9 -0
  119. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  120. package/dist/seeders/module-test-data.service.js +155 -18
  121. package/dist/seeders/module-test-data.service.js.map +1 -1
  122. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  123. package/dist/seeders/seed-data/solid-core-metadata.json +506 -49
  124. package/dist/services/authentication.service.d.ts +6 -1
  125. package/dist/services/authentication.service.d.ts.map +1 -1
  126. package/dist/services/authentication.service.js +145 -15
  127. package/dist/services/authentication.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts +13 -4
  129. package/dist/services/chatter-message.service.d.ts.map +1 -1
  130. package/dist/services/chatter-message.service.js +117 -37
  131. package/dist/services/chatter-message.service.js.map +1 -1
  132. package/dist/services/crud.service.js.map +1 -1
  133. package/dist/services/csv.service.js.map +1 -1
  134. package/dist/services/dashboard.service.js.map +1 -1
  135. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  136. package/dist/services/excel.service.js.map +1 -1
  137. package/dist/services/export-transaction.service.js.map +1 -1
  138. package/dist/services/field-metadata.service.js.map +1 -1
  139. package/dist/services/fixtures.service.js.map +1 -1
  140. package/dist/services/import-transaction.service.js.map +1 -1
  141. package/dist/services/list-of-values.service.js.map +1 -1
  142. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  143. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  144. package/dist/services/mcp-audit-log.service.js +38 -0
  145. package/dist/services/mcp-audit-log.service.js.map +1 -0
  146. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
  147. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  148. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
  149. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  150. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
  151. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  152. package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
  153. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  154. package/dist/services/model-metadata.service.d.ts +4 -1
  155. package/dist/services/model-metadata.service.d.ts.map +1 -1
  156. package/dist/services/model-metadata.service.js +24 -24
  157. package/dist/services/model-metadata.service.js.map +1 -1
  158. package/dist/services/module-metadata.service.d.ts +4 -1
  159. package/dist/services/module-metadata.service.d.ts.map +1 -1
  160. package/dist/services/module-metadata.service.js +19 -2
  161. package/dist/services/module-metadata.service.js.map +1 -1
  162. package/dist/services/queues/database-publisher.service.js +3 -3
  163. package/dist/services/queues/database-publisher.service.js.map +1 -1
  164. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  165. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  166. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  167. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  168. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  169. package/dist/services/queues/redis-publisher.service.js +4 -1
  170. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  171. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  172. package/dist/services/role-metadata.service.js.map +1 -1
  173. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  174. package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
  175. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  176. package/dist/services/settings/default-settings-provider.service.js +119 -4
  177. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  178. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  179. package/dist/services/solid-introspect.service.js.map +1 -1
  180. package/dist/services/user-activity-history.service.js.map +1 -1
  181. package/dist/services/user.service.js +1 -1
  182. package/dist/services/user.service.js.map +1 -1
  183. package/dist/services/view-metadata.service.d.ts.map +1 -1
  184. package/dist/services/view-metadata.service.js +17 -2
  185. package/dist/services/view-metadata.service.js.map +1 -1
  186. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
  187. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
  188. package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
  189. package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
  190. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
  191. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
  192. package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
  193. package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
  194. package/dist/solid-core.module.d.ts +2 -2
  195. package/dist/solid-core.module.d.ts.map +1 -1
  196. package/dist/solid-core.module.js +22 -6
  197. package/dist/solid-core.module.js.map +1 -1
  198. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  199. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  200. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  201. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  202. package/dist/testing/adapters/ui/playwright-adapter.d.ts +1 -0
  203. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  204. package/dist/testing/adapters/ui/playwright-adapter.js +3 -0
  205. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  206. package/dist/testing/core/testing-engine.js.map +1 -1
  207. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  208. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  209. package/dist/testing/reporter/console-reporter.js +21 -0
  210. package/dist/testing/reporter/console-reporter.js.map +1 -1
  211. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  212. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  213. package/dist/testing/reporter/reporter.types.js.map +1 -1
  214. package/dist/testing/reporter/webhook-reporter.js.map +1 -1
  215. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  216. package/dist/testing/runner/run-from-metadata.js +20 -1
  217. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  218. package/dist/testing/steps/ui/index.d.ts.map +1 -1
  219. package/dist/testing/steps/ui/index.js +2 -0
  220. package/dist/testing/steps/ui/index.js.map +1 -1
  221. package/dist/testing/steps/ui/manual.step.d.ts +3 -0
  222. package/dist/testing/steps/ui/manual.step.d.ts.map +1 -0
  223. package/dist/testing/steps/ui/manual.step.js +56 -0
  224. package/dist/testing/steps/ui/manual.step.js.map +1 -0
  225. package/dist/winston.logger.d.ts +5 -0
  226. package/dist/winston.logger.d.ts.map +1 -1
  227. package/dist/winston.logger.js +6 -4
  228. package/dist/winston.logger.js.map +1 -1
  229. package/package.json +8 -8
  230. package/src/commands/refresh-model.command.ts +6 -51
  231. package/src/commands/refresh-module.command.ts +3 -16
  232. package/src/commands/test-data.command.ts +29 -6
  233. package/src/controllers/action-metadata.controller.ts +1 -1
  234. package/src/controllers/chatter-message.controller.ts +12 -0
  235. package/src/controllers/facebook-authentication.controller.ts +1 -1
  236. package/src/controllers/google-authentication.controller.ts +1 -1
  237. package/src/controllers/gupshup-webhook.controller.ts +91 -0
  238. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  239. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  240. package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
  241. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  242. package/src/controllers/model-metadata.controller.ts +1 -1
  243. package/src/controllers/module-metadata.controller.ts +1 -1
  244. package/src/controllers/mq-message-queue.controller.ts +1 -1
  245. package/src/controllers/mq-message.controller.ts +1 -1
  246. package/src/controllers/view-metadata.controller.ts +1 -1
  247. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  248. package/src/dtos/update-chatter-note-message.dto.ts +14 -0
  249. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  250. package/src/dtos/update-user.dto.ts +4 -0
  251. package/src/entities/chatter-message-details.entity.ts +1 -2
  252. package/src/entities/mcp-audit-log.entity.ts +55 -0
  253. package/src/entities/user.entity.ts +1 -1
  254. package/src/factories/whatsapp.factory.ts +33 -32
  255. package/src/helpers/bootstrap.helper.ts +16 -6
  256. package/src/helpers/command.service.ts +2 -0
  257. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  258. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  259. package/src/helpers/field-crud-managers/field-quality-check-fixes.md +208 -0
  260. package/src/helpers/module-metadata-helper.service.ts +1 -1
  261. package/src/index.ts +6 -0
  262. package/src/interfaces.ts +1 -3
  263. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  264. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  265. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  266. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  267. package/src/listeners/user-registration.listener.ts +49 -6
  268. package/src/repository/mcp-audit-log.repository.ts +17 -0
  269. package/src/repository/security-rule.repository.ts +1 -1
  270. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  271. package/src/seeders/module-test-data.service.ts +186 -17
  272. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  273. package/src/seeders/seed-data/solid-core-metadata.json +506 -49
  274. package/src/services/authentication.service.ts +267 -44
  275. package/src/services/chatter-message.service.ts +140 -40
  276. package/src/services/crud.service.ts +1 -1
  277. package/src/services/csv.service.ts +1 -1
  278. package/src/services/dashboard.service.ts +1 -1
  279. package/src/services/database/database-bootstrap.service.ts +1 -1
  280. package/src/services/excel.service.ts +1 -1
  281. package/src/services/export-transaction.service.ts +2 -2
  282. package/src/services/field-metadata.service.ts +1 -1
  283. package/src/services/fixtures.service.ts +2 -2
  284. package/src/services/import-transaction.service.ts +2 -2
  285. package/src/services/list-of-values.service.ts +1 -1
  286. package/src/services/mcp-audit-log.service.ts +19 -0
  287. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
  288. package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
  289. package/src/services/model-metadata.service.ts +36 -34
  290. package/src/services/module-metadata.service.ts +19 -7
  291. package/src/services/queues/database-publisher.service.ts +4 -4
  292. package/src/services/queues/database-subscriber.service.ts +1 -1
  293. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  294. package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
  295. package/src/services/queues/redis-publisher.service.ts +7 -4
  296. package/src/services/queues/redis-subscriber.service.ts +4 -4
  297. package/src/services/role-metadata.service.ts +1 -1
  298. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  299. package/src/services/settings/default-settings-provider.service.ts +119 -4
  300. package/src/services/sms/TwilioSMSService.ts +2 -2
  301. package/src/services/solid-introspect.service.ts +2 -2
  302. package/src/services/user-activity-history.service.ts +1 -1
  303. package/src/services/user.service.ts +1 -1
  304. package/src/services/view-metadata.service.ts +25 -8
  305. package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
  306. package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
  307. package/src/solid-core.module.ts +213 -196
  308. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  309. package/src/subscribers/security-rule.subscriber.ts +8 -8
  310. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  311. package/src/testing/README.md +55 -2
  312. package/src/testing/adapters/ui/playwright-adapter.ts +4 -0
  313. package/src/testing/core/testing-engine.ts +2 -2
  314. package/src/testing/reporter/console-reporter.ts +27 -0
  315. package/src/testing/reporter/reporter.types.ts +7 -0
  316. package/src/testing/reporter/webhook-reporter.ts +1 -1
  317. package/src/testing/runner/run-from-metadata.ts +19 -1
  318. package/src/testing/steps/ui/index.ts +2 -0
  319. package/src/testing/steps/ui/manual.step.ts +80 -0
  320. package/src/winston.logger.ts +5 -7
@@ -0,0 +1,174 @@
1
+ import { HttpService } from "@nestjs/axios";
2
+ import { Injectable, Logger } from "@nestjs/common";
3
+ import { AxiosError } from "axios";
4
+ import { WhatsAppProvider } from "src/decorators/whatsapp-provider.decorator";
5
+ import { IWhatsAppTransport } from "src/interfaces";
6
+
7
+ @Injectable()
8
+ @WhatsAppProvider()
9
+ export class GupshupOtpWhatsappService implements IWhatsAppTransport {
10
+ private readonly logger = new Logger(GupshupOtpWhatsappService.name);
11
+
12
+ constructor(private readonly httpService: HttpService) {}
13
+
14
+ async sendWhatsAppMessage(
15
+ to: string,
16
+ templateId: string,
17
+ parameters: any,
18
+ parentEntity?: any,
19
+ parentEntityId?: any,
20
+ ): Promise<any> {
21
+ if (!to) {
22
+ throw new Error("WhatsApp destination number is required");
23
+ }
24
+
25
+ const payload = parameters?.payload;
26
+ if (payload?.message?.type === "text" && payload?.message?.text) {
27
+ await this.sendTextMessage(
28
+ payload.destination || to,
29
+ payload.message.text,
30
+ payload.source,
31
+ payload["src.name"],
32
+ );
33
+ return { to, templateId, parameters, parentEntity, parentEntityId };
34
+ }
35
+
36
+ if (parameters?.type === "text" && parameters?.text) {
37
+ await this.sendTextMessage(to, parameters.text);
38
+ return { to, templateId, parameters, parentEntity, parentEntityId };
39
+ }
40
+
41
+ if (!templateId) {
42
+ throw new Error("WhatsApp templateId is required for template message");
43
+ }
44
+
45
+ const bodyParams = Array.isArray(parameters)
46
+ ? parameters
47
+ : Array.isArray(parameters?.body)
48
+ ? parameters.body
49
+ : [];
50
+
51
+ await this.sendOtpTemplate(to, templateId, bodyParams.map((x) => String(x)));
52
+ return { to, templateId, parameters, parentEntity, parentEntityId };
53
+ }
54
+
55
+ private async sendTextMessage(
56
+ destination: string,
57
+ text: string,
58
+ sourceOverride?: string,
59
+ appNameOverride?: string,
60
+ ): Promise<void> {
61
+ const apiKey =
62
+ process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY ||
63
+ process.env.GUPSHUP_API_KEY;
64
+ const msgUrl =
65
+ process.env.COMMON_GUPSHUP_WHATSAPP_API_URL ||
66
+ process.env.GUPSHUP_API_URL ||
67
+ "https://api.gupshup.io/wa/api/v1/msg";
68
+ const source =
69
+ sourceOverride ||
70
+ process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE ||
71
+ process.env.GUPSHUP_SOURCE_NUMBER;
72
+ const appName =
73
+ appNameOverride || process.env.COMMON_GUPSHUP_APP_NAME || "solidx";
74
+
75
+ if (!apiKey || !msgUrl || !source) {
76
+ throw new Error("Missing Gupshup WhatsApp configuration for text message");
77
+ }
78
+
79
+ const rawDestination = destination.replace(/\D/g, "");
80
+ const params = new URLSearchParams();
81
+ params.append("channel", "whatsapp");
82
+ params.append("source", source);
83
+ params.append("destination", rawDestination);
84
+ params.append("src.name", appName);
85
+ params.append("message", JSON.stringify({ type: "text", text }));
86
+
87
+ await this.httpService.axiosRef.post(msgUrl, params.toString(), {
88
+ headers: {
89
+ apikey: apiKey,
90
+ "Content-Type": "application/x-www-form-urlencoded",
91
+ },
92
+ });
93
+ }
94
+
95
+ async sendOtpTemplate(
96
+ destination: string,
97
+ templateId: string,
98
+ bodyParams: string[],
99
+ ): Promise<void> {
100
+ const apiKey =
101
+ process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY ||
102
+ process.env.GUPSHUP_API_KEY;
103
+ const baseUrl =
104
+ process.env.COMMON_GUPSHUP_WHATSAPP_API_URL ||
105
+ process.env.GUPSHUP_API_URL ||
106
+ "https://api.gupshup.io/wa/api/v1/msg";
107
+ const templateUrl =
108
+ process.env.COMMON_GUPSHUP_WHATSAPP_TEMPLATE_API_URL ||
109
+ baseUrl.replace(/\/msg$/, "/template/msg");
110
+ const source =
111
+ process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE ||
112
+ process.env.GUPSHUP_SOURCE_NUMBER;
113
+ const appName = process.env.COMMON_GUPSHUP_APP_NAME || "solidx";
114
+
115
+ if (!apiKey || !templateUrl || !source) {
116
+ throw new Error("Missing Gupshup OTP WhatsApp configuration");
117
+ }
118
+
119
+ if (!destination || !String(destination).trim()) {
120
+ throw new Error("WhatsApp destination is empty");
121
+ }
122
+
123
+ try {
124
+ const rawDestination = destination.replace(/\D/g, "");
125
+ const params = new URLSearchParams();
126
+ params.append("channel", "whatsapp");
127
+ params.append("source", source);
128
+ params.append("destination", rawDestination);
129
+ params.append(
130
+ "to",
131
+ rawDestination.startsWith("+")
132
+ ? rawDestination
133
+ : `+${rawDestination}`,
134
+ );
135
+ params.append("src.name", appName);
136
+ params.append(
137
+ "template",
138
+ JSON.stringify({
139
+ id: templateId,
140
+ params: bodyParams,
141
+ }),
142
+ );
143
+
144
+ this.logger.debug(
145
+ `Gupshup OTP outbound (template): endpoint=${templateUrl}, source=${source}, destination=${rawDestination}, to=${rawDestination.startsWith("+") ? rawDestination : `+${rawDestination}`}, templateId=${templateId}, params=${JSON.stringify(bodyParams)}`,
146
+ );
147
+
148
+ const response = await this.httpService.axiosRef.post(
149
+ templateUrl,
150
+ params.toString(),
151
+ {
152
+ headers: {
153
+ apikey: apiKey,
154
+ "Content-Type": "application/x-www-form-urlencoded",
155
+ },
156
+ },
157
+ );
158
+
159
+ this.logger.debug(
160
+ `Gupshup response: ${response.status}, data=${JSON.stringify(response.data)}`,
161
+ );
162
+
163
+ this.logger.debug(
164
+ `Independent OTP WhatsApp sent to ${rawDestination} template=${templateId} via template endpoint`,
165
+ );
166
+ } catch (error) {
167
+ const axiosError = error as AxiosError;
168
+ this.logger.error(
169
+ `Independent OTP WhatsApp failed: destination=${destination}, templateId=${templateId}, status=${axiosError.response?.status ?? "unknown"}, response=${typeof axiosError.response?.data === "object" ? JSON.stringify(axiosError.response?.data) : axiosError.response?.data}, url=${templateUrl}`,
170
+ );
171
+ throw error;
172
+ }
173
+ }
174
+ }
@@ -0,0 +1,253 @@
1
+ import { HttpService } from "@nestjs/axios";
2
+ import { Injectable, Logger } from "@nestjs/common";
3
+ import { AxiosError } from "axios";
4
+ import { WhatsAppProvider } from "src/decorators/whatsapp-provider.decorator";
5
+ import { IWhatsAppTransport } from "src/interfaces";
6
+ import { QueueMessage } from "src/interfaces/mq";
7
+ import { SettingService } from "src/services/setting.service";
8
+ import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
9
+
10
+ type MetaTemplatePayload = {
11
+ type?: "template";
12
+ templateName?: string;
13
+ templateId?: string;
14
+ languageCode?: string;
15
+ body?: string[];
16
+ headerText?: string;
17
+ imageLink?: string;
18
+ };
19
+
20
+ type MetaTextPayload = {
21
+ type?: "text";
22
+ text?: string;
23
+ previewUrl?: boolean;
24
+ };
25
+
26
+ @Injectable()
27
+ @WhatsAppProvider()
28
+ export class MetaCloudWhatsappService implements IWhatsAppTransport {
29
+ readonly logger = new Logger(MetaCloudWhatsappService.name);
30
+
31
+ constructor(
32
+ private readonly httpService: HttpService,
33
+ private readonly settingService: SettingService,
34
+ ) {}
35
+
36
+ async sendWhatsAppMessage(
37
+ to: string,
38
+ templateId: string,
39
+ parameters: any,
40
+ parentEntity?: any,
41
+ parentEntityId?: any,
42
+ ): Promise<any> {
43
+ const message: QueueMessage<any> = {
44
+ payload: {
45
+ to,
46
+ templateId,
47
+ ...parameters,
48
+ },
49
+ parentEntity,
50
+ parentEntityId,
51
+ };
52
+
53
+ await this.sendWhatsAppMessageSynchronously(message);
54
+ return message;
55
+ }
56
+
57
+ async sendWhatsAppMessageSynchronously(message: QueueMessage<any>): Promise<void> {
58
+ const phoneNumberId = this.settingService.getConfigValue<SolidCoreSetting>(
59
+ "metaWhatsappPhoneNumberId",
60
+ );
61
+ const apiVersion = this.settingService.getConfigValue<SolidCoreSetting>(
62
+ "metaWhatsappApiVersion",
63
+ );
64
+ const apiBaseUrl = this.settingService.getConfigValue<SolidCoreSetting>(
65
+ "metaWhatsappApiUrl",
66
+ );
67
+ const accessToken = this.settingService.getConfigValue<SolidCoreSetting>(
68
+ "metaWhatsappAccessToken",
69
+ );
70
+
71
+ if (!phoneNumberId || !apiVersion || !apiBaseUrl || !accessToken) {
72
+ throw new Error(
73
+ "Missing Meta WhatsApp configuration. Set metaWhatsappApiUrl, metaWhatsappApiVersion, metaWhatsappPhoneNumberId, metaWhatsappAccessToken.",
74
+ );
75
+ }
76
+
77
+ const requestBody = this.createWhatsappRequest(message);
78
+ const url = `${String(apiBaseUrl).replace(/\/$/, "")}/${apiVersion}/${phoneNumberId}/messages`;
79
+
80
+ try {
81
+ await this.httpService.axiosRef.post(url, requestBody, {
82
+ headers: {
83
+ Authorization: `Bearer ${accessToken}`,
84
+ "Content-Type": "application/json",
85
+ },
86
+ });
87
+ this.logger.debug(
88
+ `Sent Meta WhatsApp message to ${message.payload?.to} with type ${requestBody.type}`,
89
+ );
90
+ } catch (error) {
91
+ const axiosError = error as AxiosError;
92
+ const status = axiosError.response?.status;
93
+ const data = axiosError.response?.data;
94
+ this.logger.error(
95
+ `Meta WhatsApp send failed: status=${status ?? "unknown"}, url=${url}, response=${typeof data === "object" ? JSON.stringify(data) : data}`,
96
+ );
97
+ throw error;
98
+ }
99
+ }
100
+
101
+ private createWhatsappRequest(message: QueueMessage<any>): any {
102
+ const payload = message?.payload ?? {};
103
+
104
+ if (payload?.payload) {
105
+ const normalizedFromWrappedPayload = this.normalizeWrappedPayload(payload.payload);
106
+ if (normalizedFromWrappedPayload) {
107
+ return normalizedFromWrappedPayload;
108
+ }
109
+ return payload.payload;
110
+ }
111
+
112
+ const to = this.normalizePhone(payload.to);
113
+ const templatePayload: MetaTemplatePayload = payload;
114
+ const textPayload: MetaTextPayload = payload;
115
+
116
+ if (textPayload.type === "text" || textPayload.text) {
117
+ return {
118
+ messaging_product: "whatsapp",
119
+ recipient_type: "individual",
120
+ to,
121
+ type: "text",
122
+ text: {
123
+ body: textPayload.text ?? "",
124
+ preview_url: Boolean(textPayload.previewUrl),
125
+ },
126
+ };
127
+ }
128
+
129
+ const templateName = payload.templateId || templatePayload.templateId || templatePayload.templateName;
130
+ if (!templateName) {
131
+ throw new Error(
132
+ "Meta WhatsApp template name is missing. Provide templateId or parameters.templateName.",
133
+ );
134
+ }
135
+
136
+ const components: any[] = [];
137
+ if (templatePayload.headerText) {
138
+ components.push({
139
+ type: "header",
140
+ parameters: [
141
+ {
142
+ type: "text",
143
+ text: templatePayload.headerText,
144
+ },
145
+ ],
146
+ });
147
+ } else if (templatePayload.imageLink) {
148
+ components.push({
149
+ type: "header",
150
+ parameters: [
151
+ {
152
+ type: "image",
153
+ image: { link: templatePayload.imageLink },
154
+ },
155
+ ],
156
+ });
157
+ }
158
+
159
+ if (Array.isArray(templatePayload.body) && templatePayload.body.length > 0) {
160
+ components.push({
161
+ type: "body",
162
+ parameters: templatePayload.body.map((entry) => ({
163
+ type: "text",
164
+ text: String(entry),
165
+ })),
166
+ });
167
+ }
168
+
169
+ return {
170
+ messaging_product: "whatsapp",
171
+ recipient_type: "individual",
172
+ to,
173
+ type: "template",
174
+ template: {
175
+ name: templateName,
176
+ language: {
177
+ code: templatePayload.languageCode || "en",
178
+ },
179
+ ...(components.length > 0 ? { components } : {}),
180
+ },
181
+ };
182
+ }
183
+
184
+ private normalizeWrappedPayload(payload: any): any | null {
185
+ if (!payload || typeof payload !== "object") {
186
+ return null;
187
+ }
188
+
189
+ if (payload.messaging_product && payload.to && payload.type) {
190
+ return payload;
191
+ }
192
+
193
+ const destination = payload.destination || payload.to;
194
+ const message = payload.message || {};
195
+ if (!destination || !message.type) {
196
+ return null;
197
+ }
198
+
199
+ if (message.type === "text" && message.text) {
200
+ return {
201
+ messaging_product: "whatsapp",
202
+ recipient_type: "individual",
203
+ to: this.normalizePhone(destination),
204
+ type: "text",
205
+ text: {
206
+ body: String(message.text),
207
+ preview_url: false,
208
+ },
209
+ };
210
+ }
211
+
212
+ if (message.type === "template" && message.template?.id) {
213
+ const params = Array.isArray(message.template?.params)
214
+ ? message.template.params
215
+ : [];
216
+ return {
217
+ messaging_product: "whatsapp",
218
+ recipient_type: "individual",
219
+ to: this.normalizePhone(destination),
220
+ type: "template",
221
+ template: {
222
+ name: String(message.template.id),
223
+ language: {
224
+ code: "en",
225
+ },
226
+ ...(params.length > 0
227
+ ? {
228
+ components: [
229
+ {
230
+ type: "body",
231
+ parameters: params.map((entry: any) => ({
232
+ type: "text",
233
+ text: String(entry),
234
+ })),
235
+ },
236
+ ],
237
+ }
238
+ : {}),
239
+ },
240
+ };
241
+ }
242
+
243
+ return null;
244
+ }
245
+
246
+ private normalizePhone(phone: string): string {
247
+ const digits = String(phone || "").replace(/\D/g, "");
248
+ if (!digits) {
249
+ throw new Error("Destination phone number is required for WhatsApp message.");
250
+ }
251
+ return digits;
252
+ }
253
+ }