@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.
- package/dist/commands/refresh-model.command.d.ts +1 -7
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +4 -49
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/commands/refresh-module.command.d.ts +0 -2
- package/dist/commands/refresh-module.command.d.ts.map +1 -1
- package/dist/commands/refresh-module.command.js +3 -16
- package/dist/commands/refresh-module.command.js.map +1 -1
- package/dist/commands/test-data.command.d.ts +2 -0
- package/dist/commands/test-data.command.d.ts.map +1 -1
- package/dist/commands/test-data.command.js +32 -6
- package/dist/commands/test-data.command.js.map +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/action-metadata.controller.js.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +2 -0
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +17 -0
- package/dist/controllers/chatter-message.controller.js.map +1 -1
- package/dist/controllers/facebook-authentication.controller.js +1 -1
- package/dist/controllers/facebook-authentication.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.js +1 -1
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
- package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/gupshup-webhook.controller.js +87 -0
- package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.js +147 -0
- package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/module-metadata.controller.js +1 -1
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message-queue.controller.js.map +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/mq-message.controller.js.map +1 -1
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
- package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.js +34 -0
- package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
- package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-user.dto.d.ts +1 -0
- package/dist/dtos/update-user.dto.d.ts.map +1 -1
- package/dist/dtos/update-user.dto.js +7 -1
- package/dist/dtos/update-user.dto.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +0 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
- package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
- package/dist/entities/mcp-audit-log.entity.js +90 -0
- package/dist/entities/mcp-audit-log.entity.js.map +1 -0
- package/dist/entities/user.entity.js +1 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/factories/whatsapp.factory.d.ts.map +1 -1
- package/dist/factories/whatsapp.factory.js +13 -11
- package/dist/factories/whatsapp.factory.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts +1 -0
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +8 -3
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/command.service.d.ts +1 -0
- package/dist/helpers/command.service.d.ts.map +1 -1
- package/dist/helpers/command.service.js +1 -0
- package/dist/helpers/command.service.js.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +1 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
- package/dist/listeners/user-registration.listener.d.ts +5 -2
- package/dist/listeners/user-registration.listener.d.ts.map +1 -1
- package/dist/listeners/user-registration.listener.js +37 -4
- package/dist/listeners/user-registration.listener.js.map +1 -1
- package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
- package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
- package/dist/repository/mcp-audit-log.repository.js +34 -0
- package/dist/repository/mcp-audit-log.repository.js.map +1 -0
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +9 -0
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +155 -18
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +381 -2
- package/dist/services/authentication.service.d.ts +6 -1
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +145 -15
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +13 -4
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +117 -37
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/csv.service.js.map +1 -1
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.js.map +1 -1
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/fixtures.service.js.map +1 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/mcp-audit-log.service.d.ts +12 -0
- package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
- package/dist/services/mcp-audit-log.service.js +38 -0
- package/dist/services/mcp-audit-log.service.js.map +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +24 -24
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +19 -2
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -3
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/redis-publisher.service.js +4 -1
- package/dist/services/queues/redis-publisher.service.js.map +1 -1
- package/dist/services/queues/redis-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +119 -4
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user.service.js +1 -1
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +17 -2
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
- package/dist/solid-core.module.d.ts +2 -2
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -6
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
- package/dist/testing/core/testing-engine.js.map +1 -1
- package/dist/testing/reporter/console-reporter.d.ts +10 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
- package/dist/testing/reporter/console-reporter.js +21 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -1
- package/dist/testing/reporter/reporter.types.d.ts +7 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
- package/dist/testing/reporter/reporter.types.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.js.map +1 -1
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
- package/dist/testing/runner/run-from-metadata.js +20 -1
- package/dist/testing/runner/run-from-metadata.js.map +1 -1
- package/dist/winston.logger.d.ts +5 -0
- package/dist/winston.logger.d.ts.map +1 -1
- package/dist/winston.logger.js +6 -4
- package/dist/winston.logger.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/package.json +8 -8
- package/src/commands/refresh-model.command.ts +6 -51
- package/src/commands/refresh-module.command.ts +3 -16
- package/src/commands/test-data.command.ts +29 -6
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/chatter-message.controller.ts +12 -0
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/gupshup-webhook.controller.ts +91 -0
- package/src/controllers/mcp-audit-log.controller.ts +70 -0
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/model-metadata.controller.ts +1 -1
- package/src/controllers/module-metadata.controller.ts +1 -1
- package/src/controllers/mq-message-queue.controller.ts +1 -1
- package/src/controllers/mq-message.controller.ts +1 -1
- package/src/controllers/view-metadata.controller.ts +1 -1
- package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
- package/src/dtos/update-chatter-note-message.dto.ts +14 -0
- package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
- package/src/dtos/update-user.dto.ts +4 -0
- package/src/entities/chatter-message-details.entity.ts +1 -2
- package/src/entities/mcp-audit-log.entity.ts +55 -0
- package/src/entities/user.entity.ts +1 -1
- package/src/factories/whatsapp.factory.ts +33 -32
- package/src/helpers/bootstrap.helper.ts +16 -6
- package/src/helpers/command.service.ts +2 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/field-quality-check-fixes.md +178 -0
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/index.ts +6 -0
- package/src/interfaces.ts +1 -3
- package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
- package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
- package/src/listeners/user-registration.listener.ts +49 -6
- package/src/repository/mcp-audit-log.repository.ts +17 -0
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/module-test-data.service.ts +186 -17
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +381 -2
- package/src/services/authentication.service.ts +267 -44
- package/src/services/chatter-message.service.ts +140 -40
- package/src/services/crud.service.ts +1 -1
- package/src/services/csv.service.ts +1 -1
- package/src/services/dashboard.service.ts +1 -1
- package/src/services/database/database-bootstrap.service.ts +1 -1
- package/src/services/excel.service.ts +1 -1
- package/src/services/export-transaction.service.ts +2 -2
- package/src/services/field-metadata.service.ts +1 -1
- package/src/services/fixtures.service.ts +2 -2
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/list-of-values.service.ts +1 -1
- package/src/services/mcp-audit-log.service.ts +19 -0
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
- package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
- package/src/services/model-metadata.service.ts +36 -34
- package/src/services/module-metadata.service.ts +19 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +1 -1
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +4 -4
- package/src/services/role-metadata.service.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
- package/src/services/settings/default-settings-provider.service.ts +119 -4
- package/src/services/sms/TwilioSMSService.ts +2 -2
- package/src/services/solid-introspect.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +1 -1
- package/src/services/user.service.ts +1 -1
- package/src/services/view-metadata.service.ts +25 -8
- package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
- package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
- package/src/solid-core.module.ts +213 -196
- package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
- package/src/subscribers/security-rule.subscriber.ts +8 -8
- package/src/subscribers/view-metadata.subscriber.ts +1 -1
- package/src/testing/README.md +15 -0
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/console-reporter.ts +27 -0
- package/src/testing/reporter/reporter.types.ts +7 -0
- package/src/testing/reporter/webhook-reporter.ts +1 -1
- package/src/testing/runner/run-from-metadata.ts +19 -1
- package/src/winston.logger.ts +5 -7
- package/.claude/settings.local.json +0 -15
- package/src/services/1.js +0 -6
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var GupshupOtpWhatsappService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GupshupOtpWhatsappService = void 0;
|
|
14
|
+
const axios_1 = require("@nestjs/axios");
|
|
15
|
+
const common_1 = require("@nestjs/common");
|
|
16
|
+
const whatsapp_provider_decorator_1 = require("../../decorators/whatsapp-provider.decorator");
|
|
17
|
+
let GupshupOtpWhatsappService = GupshupOtpWhatsappService_1 = class GupshupOtpWhatsappService {
|
|
18
|
+
constructor(httpService) {
|
|
19
|
+
this.httpService = httpService;
|
|
20
|
+
this.logger = new common_1.Logger(GupshupOtpWhatsappService_1.name);
|
|
21
|
+
}
|
|
22
|
+
async sendWhatsAppMessage(to, templateId, parameters, parentEntity, parentEntityId) {
|
|
23
|
+
if (!to) {
|
|
24
|
+
throw new Error("WhatsApp destination number is required");
|
|
25
|
+
}
|
|
26
|
+
const payload = parameters?.payload;
|
|
27
|
+
if (payload?.message?.type === "text" && payload?.message?.text) {
|
|
28
|
+
await this.sendTextMessage(payload.destination || to, payload.message.text, payload.source, payload["src.name"]);
|
|
29
|
+
return { to, templateId, parameters, parentEntity, parentEntityId };
|
|
30
|
+
}
|
|
31
|
+
if (parameters?.type === "text" && parameters?.text) {
|
|
32
|
+
await this.sendTextMessage(to, parameters.text);
|
|
33
|
+
return { to, templateId, parameters, parentEntity, parentEntityId };
|
|
34
|
+
}
|
|
35
|
+
if (!templateId) {
|
|
36
|
+
throw new Error("WhatsApp templateId is required for template message");
|
|
37
|
+
}
|
|
38
|
+
const bodyParams = Array.isArray(parameters)
|
|
39
|
+
? parameters
|
|
40
|
+
: Array.isArray(parameters?.body)
|
|
41
|
+
? parameters.body
|
|
42
|
+
: [];
|
|
43
|
+
await this.sendOtpTemplate(to, templateId, bodyParams.map((x) => String(x)));
|
|
44
|
+
return { to, templateId, parameters, parentEntity, parentEntityId };
|
|
45
|
+
}
|
|
46
|
+
async sendTextMessage(destination, text, sourceOverride, appNameOverride) {
|
|
47
|
+
const apiKey = process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY ||
|
|
48
|
+
process.env.GUPSHUP_API_KEY;
|
|
49
|
+
const msgUrl = process.env.COMMON_GUPSHUP_WHATSAPP_API_URL ||
|
|
50
|
+
process.env.GUPSHUP_API_URL ||
|
|
51
|
+
"https://api.gupshup.io/wa/api/v1/msg";
|
|
52
|
+
const source = sourceOverride ||
|
|
53
|
+
process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE ||
|
|
54
|
+
process.env.GUPSHUP_SOURCE_NUMBER;
|
|
55
|
+
const appName = appNameOverride || process.env.COMMON_GUPSHUP_APP_NAME || "solidx";
|
|
56
|
+
if (!apiKey || !msgUrl || !source) {
|
|
57
|
+
throw new Error("Missing Gupshup WhatsApp configuration for text message");
|
|
58
|
+
}
|
|
59
|
+
const rawDestination = destination.replace(/\D/g, "");
|
|
60
|
+
const params = new URLSearchParams();
|
|
61
|
+
params.append("channel", "whatsapp");
|
|
62
|
+
params.append("source", source);
|
|
63
|
+
params.append("destination", rawDestination);
|
|
64
|
+
params.append("src.name", appName);
|
|
65
|
+
params.append("message", JSON.stringify({ type: "text", text }));
|
|
66
|
+
await this.httpService.axiosRef.post(msgUrl, params.toString(), {
|
|
67
|
+
headers: {
|
|
68
|
+
apikey: apiKey,
|
|
69
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async sendOtpTemplate(destination, templateId, bodyParams) {
|
|
74
|
+
const apiKey = process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY ||
|
|
75
|
+
process.env.GUPSHUP_API_KEY;
|
|
76
|
+
const baseUrl = process.env.COMMON_GUPSHUP_WHATSAPP_API_URL ||
|
|
77
|
+
process.env.GUPSHUP_API_URL ||
|
|
78
|
+
"https://api.gupshup.io/wa/api/v1/msg";
|
|
79
|
+
const templateUrl = process.env.COMMON_GUPSHUP_WHATSAPP_TEMPLATE_API_URL ||
|
|
80
|
+
baseUrl.replace(/\/msg$/, "/template/msg");
|
|
81
|
+
const source = process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE ||
|
|
82
|
+
process.env.GUPSHUP_SOURCE_NUMBER;
|
|
83
|
+
const appName = process.env.COMMON_GUPSHUP_APP_NAME || "solidx";
|
|
84
|
+
if (!apiKey || !templateUrl || !source) {
|
|
85
|
+
throw new Error("Missing Gupshup OTP WhatsApp configuration");
|
|
86
|
+
}
|
|
87
|
+
if (!destination || !String(destination).trim()) {
|
|
88
|
+
throw new Error("WhatsApp destination is empty");
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const rawDestination = destination.replace(/\D/g, "");
|
|
92
|
+
const params = new URLSearchParams();
|
|
93
|
+
params.append("channel", "whatsapp");
|
|
94
|
+
params.append("source", source);
|
|
95
|
+
params.append("destination", rawDestination);
|
|
96
|
+
params.append("to", rawDestination.startsWith("+")
|
|
97
|
+
? rawDestination
|
|
98
|
+
: `+${rawDestination}`);
|
|
99
|
+
params.append("src.name", appName);
|
|
100
|
+
params.append("template", JSON.stringify({
|
|
101
|
+
id: templateId,
|
|
102
|
+
params: bodyParams,
|
|
103
|
+
}));
|
|
104
|
+
this.logger.debug(`Gupshup OTP outbound (template): endpoint=${templateUrl}, source=${source}, destination=${rawDestination}, to=${rawDestination.startsWith("+") ? rawDestination : `+${rawDestination}`}, templateId=${templateId}, params=${JSON.stringify(bodyParams)}`);
|
|
105
|
+
const response = await this.httpService.axiosRef.post(templateUrl, params.toString(), {
|
|
106
|
+
headers: {
|
|
107
|
+
apikey: apiKey,
|
|
108
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
this.logger.debug(`Gupshup response: ${response.status}, data=${JSON.stringify(response.data)}`);
|
|
112
|
+
this.logger.debug(`Independent OTP WhatsApp sent to ${rawDestination} template=${templateId} via template endpoint`);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const axiosError = error;
|
|
116
|
+
this.logger.error(`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}`);
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
exports.GupshupOtpWhatsappService = GupshupOtpWhatsappService;
|
|
122
|
+
exports.GupshupOtpWhatsappService = GupshupOtpWhatsappService = GupshupOtpWhatsappService_1 = __decorate([
|
|
123
|
+
(0, common_1.Injectable)(),
|
|
124
|
+
(0, whatsapp_provider_decorator_1.WhatsAppProvider)(),
|
|
125
|
+
__metadata("design:paramtypes", [axios_1.HttpService])
|
|
126
|
+
], GupshupOtpWhatsappService);
|
|
127
|
+
//# sourceMappingURL=GupshupOtpWhatsappService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GupshupOtpWhatsappService.js","sourceRoot":"","sources":["../../../src/services/whatsapp/GupshupOtpWhatsappService.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpService } from \"@nestjs/axios\";\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { AxiosError } from \"axios\";\nimport { WhatsAppProvider } from \"src/decorators/whatsapp-provider.decorator\";\nimport { IWhatsAppTransport } from \"src/interfaces\";\n\n@Injectable()\n@WhatsAppProvider()\nexport class GupshupOtpWhatsappService implements IWhatsAppTransport {\n private readonly logger = new Logger(GupshupOtpWhatsappService.name);\n\n constructor(private readonly httpService: HttpService) {}\n\n async sendWhatsAppMessage(\n to: string,\n templateId: string,\n parameters: any,\n parentEntity?: any,\n parentEntityId?: any,\n ): Promise<any> {\n if (!to) {\n throw new Error(\"WhatsApp destination number is required\");\n }\n\n const payload = parameters?.payload;\n if (payload?.message?.type === \"text\" && payload?.message?.text) {\n await this.sendTextMessage(\n payload.destination || to,\n payload.message.text,\n payload.source,\n payload[\"src.name\"],\n );\n return { to, templateId, parameters, parentEntity, parentEntityId };\n }\n\n if (parameters?.type === \"text\" && parameters?.text) {\n await this.sendTextMessage(to, parameters.text);\n return { to, templateId, parameters, parentEntity, parentEntityId };\n }\n\n if (!templateId) {\n throw new Error(\"WhatsApp templateId is required for template message\");\n }\n\n const bodyParams = Array.isArray(parameters)\n ? parameters\n : Array.isArray(parameters?.body)\n ? parameters.body\n : [];\n\n await this.sendOtpTemplate(to, templateId, bodyParams.map((x) => String(x)));\n return { to, templateId, parameters, parentEntity, parentEntityId };\n }\n\n private async sendTextMessage(\n destination: string,\n text: string,\n sourceOverride?: string,\n appNameOverride?: string,\n ): Promise<void> {\n const apiKey =\n process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY ||\n process.env.GUPSHUP_API_KEY;\n const msgUrl =\n process.env.COMMON_GUPSHUP_WHATSAPP_API_URL ||\n process.env.GUPSHUP_API_URL ||\n \"https://api.gupshup.io/wa/api/v1/msg\";\n const source =\n sourceOverride ||\n process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE ||\n process.env.GUPSHUP_SOURCE_NUMBER;\n const appName =\n appNameOverride || process.env.COMMON_GUPSHUP_APP_NAME || \"solidx\";\n\n if (!apiKey || !msgUrl || !source) {\n throw new Error(\"Missing Gupshup WhatsApp configuration for text message\");\n }\n\n const rawDestination = destination.replace(/\\D/g, \"\");\n const params = new URLSearchParams();\n params.append(\"channel\", \"whatsapp\");\n params.append(\"source\", source);\n params.append(\"destination\", rawDestination);\n params.append(\"src.name\", appName);\n params.append(\"message\", JSON.stringify({ type: \"text\", text }));\n\n await this.httpService.axiosRef.post(msgUrl, params.toString(), {\n headers: {\n apikey: apiKey,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n });\n }\n\n async sendOtpTemplate(\n destination: string,\n templateId: string,\n bodyParams: string[],\n ): Promise<void> {\n const apiKey =\n process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY ||\n process.env.GUPSHUP_API_KEY;\n const baseUrl =\n process.env.COMMON_GUPSHUP_WHATSAPP_API_URL ||\n process.env.GUPSHUP_API_URL ||\n \"https://api.gupshup.io/wa/api/v1/msg\";\n const templateUrl =\n process.env.COMMON_GUPSHUP_WHATSAPP_TEMPLATE_API_URL ||\n baseUrl.replace(/\\/msg$/, \"/template/msg\");\n const source =\n process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE ||\n process.env.GUPSHUP_SOURCE_NUMBER;\n const appName = process.env.COMMON_GUPSHUP_APP_NAME || \"solidx\";\n\n if (!apiKey || !templateUrl || !source) {\n throw new Error(\"Missing Gupshup OTP WhatsApp configuration\");\n }\n\n if (!destination || !String(destination).trim()) {\n throw new Error(\"WhatsApp destination is empty\");\n }\n\n try {\n const rawDestination = destination.replace(/\\D/g, \"\");\n const params = new URLSearchParams();\n params.append(\"channel\", \"whatsapp\");\n params.append(\"source\", source);\n params.append(\"destination\", rawDestination);\n params.append(\n \"to\",\n rawDestination.startsWith(\"+\")\n ? rawDestination\n : `+${rawDestination}`,\n );\n params.append(\"src.name\", appName);\n params.append(\n \"template\",\n JSON.stringify({\n id: templateId,\n params: bodyParams,\n }),\n );\n\n this.logger.debug(\n `Gupshup OTP outbound (template): endpoint=${templateUrl}, source=${source}, destination=${rawDestination}, to=${rawDestination.startsWith(\"+\") ? rawDestination : `+${rawDestination}`}, templateId=${templateId}, params=${JSON.stringify(bodyParams)}`,\n );\n\n const response = await this.httpService.axiosRef.post(\n templateUrl,\n params.toString(),\n {\n headers: {\n apikey: apiKey,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n },\n );\n\n this.logger.debug(\n `Gupshup response: ${response.status}, data=${JSON.stringify(response.data)}`,\n );\n\n this.logger.debug(\n `Independent OTP WhatsApp sent to ${rawDestination} template=${templateId} via template endpoint`,\n );\n } catch (error) {\n const axiosError = error as AxiosError;\n this.logger.error(\n `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}`,\n );\n throw error;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HttpService } from "@nestjs/axios";
|
|
2
|
+
import { Logger } from "@nestjs/common";
|
|
3
|
+
import { IWhatsAppTransport } from "../../interfaces";
|
|
4
|
+
import { QueueMessage } from "../../interfaces/mq";
|
|
5
|
+
import { SettingService } from "../../services/setting.service";
|
|
6
|
+
export declare class MetaCloudWhatsappService implements IWhatsAppTransport {
|
|
7
|
+
private readonly httpService;
|
|
8
|
+
private readonly settingService;
|
|
9
|
+
readonly logger: Logger;
|
|
10
|
+
constructor(httpService: HttpService, settingService: SettingService);
|
|
11
|
+
sendWhatsAppMessage(to: string, templateId: string, parameters: any, parentEntity?: any, parentEntityId?: any): Promise<any>;
|
|
12
|
+
sendWhatsAppMessageSynchronously(message: QueueMessage<any>): Promise<void>;
|
|
13
|
+
private createWhatsappRequest;
|
|
14
|
+
private normalizeWrappedPayload;
|
|
15
|
+
private normalizePhone;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=MetaCloudWhatsappService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetaCloudWhatsappService.d.ts","sourceRoot":"","sources":["../../../src/services/whatsapp/MetaCloudWhatsappService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAc,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAmB9D,qBAEa,wBAAyB,YAAW,kBAAkB;IAI/D,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,QAAQ,CAAC,MAAM,SAA6C;gBAGzC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc;IAG3C,mBAAmB,CACvB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,EACf,YAAY,CAAC,EAAE,GAAG,EAClB,cAAc,CAAC,EAAE,GAAG,GACnB,OAAO,CAAC,GAAG,CAAC;IAeT,gCAAgC,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CjF,OAAO,CAAC,qBAAqB;IAmF7B,OAAO,CAAC,uBAAuB;IA8D/B,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var MetaCloudWhatsappService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.MetaCloudWhatsappService = void 0;
|
|
14
|
+
const axios_1 = require("@nestjs/axios");
|
|
15
|
+
const common_1 = require("@nestjs/common");
|
|
16
|
+
const whatsapp_provider_decorator_1 = require("../../decorators/whatsapp-provider.decorator");
|
|
17
|
+
const setting_service_1 = require("../setting.service");
|
|
18
|
+
let MetaCloudWhatsappService = MetaCloudWhatsappService_1 = class MetaCloudWhatsappService {
|
|
19
|
+
constructor(httpService, settingService) {
|
|
20
|
+
this.httpService = httpService;
|
|
21
|
+
this.settingService = settingService;
|
|
22
|
+
this.logger = new common_1.Logger(MetaCloudWhatsappService_1.name);
|
|
23
|
+
}
|
|
24
|
+
async sendWhatsAppMessage(to, templateId, parameters, parentEntity, parentEntityId) {
|
|
25
|
+
const message = {
|
|
26
|
+
payload: {
|
|
27
|
+
to,
|
|
28
|
+
templateId,
|
|
29
|
+
...parameters,
|
|
30
|
+
},
|
|
31
|
+
parentEntity,
|
|
32
|
+
parentEntityId,
|
|
33
|
+
};
|
|
34
|
+
await this.sendWhatsAppMessageSynchronously(message);
|
|
35
|
+
return message;
|
|
36
|
+
}
|
|
37
|
+
async sendWhatsAppMessageSynchronously(message) {
|
|
38
|
+
const phoneNumberId = this.settingService.getConfigValue("metaWhatsappPhoneNumberId");
|
|
39
|
+
const apiVersion = this.settingService.getConfigValue("metaWhatsappApiVersion");
|
|
40
|
+
const apiBaseUrl = this.settingService.getConfigValue("metaWhatsappApiUrl");
|
|
41
|
+
const accessToken = this.settingService.getConfigValue("metaWhatsappAccessToken");
|
|
42
|
+
if (!phoneNumberId || !apiVersion || !apiBaseUrl || !accessToken) {
|
|
43
|
+
throw new Error("Missing Meta WhatsApp configuration. Set metaWhatsappApiUrl, metaWhatsappApiVersion, metaWhatsappPhoneNumberId, metaWhatsappAccessToken.");
|
|
44
|
+
}
|
|
45
|
+
const requestBody = this.createWhatsappRequest(message);
|
|
46
|
+
const url = `${String(apiBaseUrl).replace(/\/$/, "")}/${apiVersion}/${phoneNumberId}/messages`;
|
|
47
|
+
try {
|
|
48
|
+
await this.httpService.axiosRef.post(url, requestBody, {
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: `Bearer ${accessToken}`,
|
|
51
|
+
"Content-Type": "application/json",
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
this.logger.debug(`Sent Meta WhatsApp message to ${message.payload?.to} with type ${requestBody.type}`);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const axiosError = error;
|
|
58
|
+
const status = axiosError.response?.status;
|
|
59
|
+
const data = axiosError.response?.data;
|
|
60
|
+
this.logger.error(`Meta WhatsApp send failed: status=${status ?? "unknown"}, url=${url}, response=${typeof data === "object" ? JSON.stringify(data) : data}`);
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
createWhatsappRequest(message) {
|
|
65
|
+
const payload = message?.payload ?? {};
|
|
66
|
+
if (payload?.payload) {
|
|
67
|
+
const normalizedFromWrappedPayload = this.normalizeWrappedPayload(payload.payload);
|
|
68
|
+
if (normalizedFromWrappedPayload) {
|
|
69
|
+
return normalizedFromWrappedPayload;
|
|
70
|
+
}
|
|
71
|
+
return payload.payload;
|
|
72
|
+
}
|
|
73
|
+
const to = this.normalizePhone(payload.to);
|
|
74
|
+
const templatePayload = payload;
|
|
75
|
+
const textPayload = payload;
|
|
76
|
+
if (textPayload.type === "text" || textPayload.text) {
|
|
77
|
+
return {
|
|
78
|
+
messaging_product: "whatsapp",
|
|
79
|
+
recipient_type: "individual",
|
|
80
|
+
to,
|
|
81
|
+
type: "text",
|
|
82
|
+
text: {
|
|
83
|
+
body: textPayload.text ?? "",
|
|
84
|
+
preview_url: Boolean(textPayload.previewUrl),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const templateName = payload.templateId || templatePayload.templateId || templatePayload.templateName;
|
|
89
|
+
if (!templateName) {
|
|
90
|
+
throw new Error("Meta WhatsApp template name is missing. Provide templateId or parameters.templateName.");
|
|
91
|
+
}
|
|
92
|
+
const components = [];
|
|
93
|
+
if (templatePayload.headerText) {
|
|
94
|
+
components.push({
|
|
95
|
+
type: "header",
|
|
96
|
+
parameters: [
|
|
97
|
+
{
|
|
98
|
+
type: "text",
|
|
99
|
+
text: templatePayload.headerText,
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else if (templatePayload.imageLink) {
|
|
105
|
+
components.push({
|
|
106
|
+
type: "header",
|
|
107
|
+
parameters: [
|
|
108
|
+
{
|
|
109
|
+
type: "image",
|
|
110
|
+
image: { link: templatePayload.imageLink },
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (Array.isArray(templatePayload.body) && templatePayload.body.length > 0) {
|
|
116
|
+
components.push({
|
|
117
|
+
type: "body",
|
|
118
|
+
parameters: templatePayload.body.map((entry) => ({
|
|
119
|
+
type: "text",
|
|
120
|
+
text: String(entry),
|
|
121
|
+
})),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
messaging_product: "whatsapp",
|
|
126
|
+
recipient_type: "individual",
|
|
127
|
+
to,
|
|
128
|
+
type: "template",
|
|
129
|
+
template: {
|
|
130
|
+
name: templateName,
|
|
131
|
+
language: {
|
|
132
|
+
code: templatePayload.languageCode || "en",
|
|
133
|
+
},
|
|
134
|
+
...(components.length > 0 ? { components } : {}),
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
normalizeWrappedPayload(payload) {
|
|
139
|
+
if (!payload || typeof payload !== "object") {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
if (payload.messaging_product && payload.to && payload.type) {
|
|
143
|
+
return payload;
|
|
144
|
+
}
|
|
145
|
+
const destination = payload.destination || payload.to;
|
|
146
|
+
const message = payload.message || {};
|
|
147
|
+
if (!destination || !message.type) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
if (message.type === "text" && message.text) {
|
|
151
|
+
return {
|
|
152
|
+
messaging_product: "whatsapp",
|
|
153
|
+
recipient_type: "individual",
|
|
154
|
+
to: this.normalizePhone(destination),
|
|
155
|
+
type: "text",
|
|
156
|
+
text: {
|
|
157
|
+
body: String(message.text),
|
|
158
|
+
preview_url: false,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (message.type === "template" && message.template?.id) {
|
|
163
|
+
const params = Array.isArray(message.template?.params)
|
|
164
|
+
? message.template.params
|
|
165
|
+
: [];
|
|
166
|
+
return {
|
|
167
|
+
messaging_product: "whatsapp",
|
|
168
|
+
recipient_type: "individual",
|
|
169
|
+
to: this.normalizePhone(destination),
|
|
170
|
+
type: "template",
|
|
171
|
+
template: {
|
|
172
|
+
name: String(message.template.id),
|
|
173
|
+
language: {
|
|
174
|
+
code: "en",
|
|
175
|
+
},
|
|
176
|
+
...(params.length > 0
|
|
177
|
+
? {
|
|
178
|
+
components: [
|
|
179
|
+
{
|
|
180
|
+
type: "body",
|
|
181
|
+
parameters: params.map((entry) => ({
|
|
182
|
+
type: "text",
|
|
183
|
+
text: String(entry),
|
|
184
|
+
})),
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
}
|
|
188
|
+
: {}),
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
normalizePhone(phone) {
|
|
195
|
+
const digits = String(phone || "").replace(/\D/g, "");
|
|
196
|
+
if (!digits) {
|
|
197
|
+
throw new Error("Destination phone number is required for WhatsApp message.");
|
|
198
|
+
}
|
|
199
|
+
return digits;
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
exports.MetaCloudWhatsappService = MetaCloudWhatsappService;
|
|
203
|
+
exports.MetaCloudWhatsappService = MetaCloudWhatsappService = MetaCloudWhatsappService_1 = __decorate([
|
|
204
|
+
(0, common_1.Injectable)(),
|
|
205
|
+
(0, whatsapp_provider_decorator_1.WhatsAppProvider)(),
|
|
206
|
+
__metadata("design:paramtypes", [axios_1.HttpService,
|
|
207
|
+
setting_service_1.SettingService])
|
|
208
|
+
], MetaCloudWhatsappService);
|
|
209
|
+
//# sourceMappingURL=MetaCloudWhatsappService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetaCloudWhatsappService.js","sourceRoot":"","sources":["../../../src/services/whatsapp/MetaCloudWhatsappService.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpService } from \"@nestjs/axios\";\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { AxiosError } from \"axios\";\nimport { WhatsAppProvider } from \"src/decorators/whatsapp-provider.decorator\";\nimport { IWhatsAppTransport } from \"src/interfaces\";\nimport { QueueMessage } from \"src/interfaces/mq\";\nimport { SettingService } from \"src/services/setting.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\ntype MetaTemplatePayload = {\n type?: \"template\";\n templateName?: string;\n templateId?: string;\n languageCode?: string;\n body?: string[];\n headerText?: string;\n imageLink?: string;\n};\n\ntype MetaTextPayload = {\n type?: \"text\";\n text?: string;\n previewUrl?: boolean;\n};\n\n@Injectable()\n@WhatsAppProvider()\nexport class MetaCloudWhatsappService implements IWhatsAppTransport {\n readonly logger = new Logger(MetaCloudWhatsappService.name);\n\n constructor(\n private readonly httpService: HttpService,\n private readonly settingService: SettingService,\n ) {}\n\n async sendWhatsAppMessage(\n to: string,\n templateId: string,\n parameters: any,\n parentEntity?: any,\n parentEntityId?: any,\n ): Promise<any> {\n const message: QueueMessage<any> = {\n payload: {\n to,\n templateId,\n ...parameters,\n },\n parentEntity,\n parentEntityId,\n };\n\n await this.sendWhatsAppMessageSynchronously(message);\n return message;\n }\n\n async sendWhatsAppMessageSynchronously(message: QueueMessage<any>): Promise<void> {\n const phoneNumberId = this.settingService.getConfigValue<SolidCoreSetting>(\n \"metaWhatsappPhoneNumberId\",\n );\n const apiVersion = this.settingService.getConfigValue<SolidCoreSetting>(\n \"metaWhatsappApiVersion\",\n );\n const apiBaseUrl = this.settingService.getConfigValue<SolidCoreSetting>(\n \"metaWhatsappApiUrl\",\n );\n const accessToken = this.settingService.getConfigValue<SolidCoreSetting>(\n \"metaWhatsappAccessToken\",\n );\n\n if (!phoneNumberId || !apiVersion || !apiBaseUrl || !accessToken) {\n throw new Error(\n \"Missing Meta WhatsApp configuration. Set metaWhatsappApiUrl, metaWhatsappApiVersion, metaWhatsappPhoneNumberId, metaWhatsappAccessToken.\",\n );\n }\n\n const requestBody = this.createWhatsappRequest(message);\n const url = `${String(apiBaseUrl).replace(/\\/$/, \"\")}/${apiVersion}/${phoneNumberId}/messages`;\n\n try {\n await this.httpService.axiosRef.post(url, requestBody, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n this.logger.debug(\n `Sent Meta WhatsApp message to ${message.payload?.to} with type ${requestBody.type}`,\n );\n } catch (error) {\n const axiosError = error as AxiosError;\n const status = axiosError.response?.status;\n const data = axiosError.response?.data;\n this.logger.error(\n `Meta WhatsApp send failed: status=${status ?? \"unknown\"}, url=${url}, response=${typeof data === \"object\" ? JSON.stringify(data) : data}`,\n );\n throw error;\n }\n }\n\n private createWhatsappRequest(message: QueueMessage<any>): any {\n const payload = message?.payload ?? {};\n\n if (payload?.payload) {\n const normalizedFromWrappedPayload = this.normalizeWrappedPayload(payload.payload);\n if (normalizedFromWrappedPayload) {\n return normalizedFromWrappedPayload;\n }\n return payload.payload;\n }\n\n const to = this.normalizePhone(payload.to);\n const templatePayload: MetaTemplatePayload = payload;\n const textPayload: MetaTextPayload = payload;\n\n if (textPayload.type === \"text\" || textPayload.text) {\n return {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to,\n type: \"text\",\n text: {\n body: textPayload.text ?? \"\",\n preview_url: Boolean(textPayload.previewUrl),\n },\n };\n }\n\n const templateName = payload.templateId || templatePayload.templateId || templatePayload.templateName;\n if (!templateName) {\n throw new Error(\n \"Meta WhatsApp template name is missing. Provide templateId or parameters.templateName.\",\n );\n }\n\n const components: any[] = [];\n if (templatePayload.headerText) {\n components.push({\n type: \"header\",\n parameters: [\n {\n type: \"text\",\n text: templatePayload.headerText,\n },\n ],\n });\n } else if (templatePayload.imageLink) {\n components.push({\n type: \"header\",\n parameters: [\n {\n type: \"image\",\n image: { link: templatePayload.imageLink },\n },\n ],\n });\n }\n\n if (Array.isArray(templatePayload.body) && templatePayload.body.length > 0) {\n components.push({\n type: \"body\",\n parameters: templatePayload.body.map((entry) => ({\n type: \"text\",\n text: String(entry),\n })),\n });\n }\n\n return {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to,\n type: \"template\",\n template: {\n name: templateName,\n language: {\n code: templatePayload.languageCode || \"en\",\n },\n ...(components.length > 0 ? { components } : {}),\n },\n };\n }\n\n private normalizeWrappedPayload(payload: any): any | null {\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n\n if (payload.messaging_product && payload.to && payload.type) {\n return payload;\n }\n\n const destination = payload.destination || payload.to;\n const message = payload.message || {};\n if (!destination || !message.type) {\n return null;\n }\n\n if (message.type === \"text\" && message.text) {\n return {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: this.normalizePhone(destination),\n type: \"text\",\n text: {\n body: String(message.text),\n preview_url: false,\n },\n };\n }\n\n if (message.type === \"template\" && message.template?.id) {\n const params = Array.isArray(message.template?.params)\n ? message.template.params\n : [];\n return {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: this.normalizePhone(destination),\n type: \"template\",\n template: {\n name: String(message.template.id),\n language: {\n code: \"en\",\n },\n ...(params.length > 0\n ? {\n components: [\n {\n type: \"body\",\n parameters: params.map((entry: any) => ({\n type: \"text\",\n text: String(entry),\n })),\n },\n ],\n }\n : {}),\n },\n };\n }\n\n return null;\n }\n\n private normalizePhone(phone: string): string {\n const digits = String(phone || \"\").replace(/\\D/g, \"\");\n if (!digits) {\n throw new Error(\"Destination phone number is required for WhatsApp message.\");\n }\n return digits;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { MiddlewareConsumer, NestModule } from
|
|
1
|
+
import "multer";
|
|
2
|
+
import { MiddlewareConsumer, NestModule } from "@nestjs/common";
|
|
3
3
|
export declare class SolidCoreModule implements NestModule {
|
|
4
4
|
configure(consumer: MiddlewareConsumer): void;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAChB,OAAO,EAAU,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAChB,OAAO,EAAU,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkZhF,qBAqfa,eAAgB,YAAW,UAAU;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAQvC"}
|
|
@@ -89,6 +89,10 @@ const facebook_authentication_controller_1 = require("./controllers/facebook-aut
|
|
|
89
89
|
const microsoft_authentication_controller_1 = require("./controllers/microsoft-authentication.controller");
|
|
90
90
|
const facebook_oauth_strategy_1 = require("./passport-strategies/facebook-oauth.strategy");
|
|
91
91
|
const microsoft_oauth_strategy_1 = require("./passport-strategies/microsoft-oauth.strategy");
|
|
92
|
+
const GupshupOtpWhatsappService_1 = require("./services/whatsapp/GupshupOtpWhatsappService");
|
|
93
|
+
const MetaCloudWhatsappService_1 = require("./services/whatsapp/MetaCloudWhatsappService");
|
|
94
|
+
const gupshup_webhook_controller_1 = require("./controllers/gupshup-webhook.controller");
|
|
95
|
+
const meta_cloud_whatsapp_webhook_controller_1 = require("./controllers/meta-cloud-whatsapp-webhook.controller");
|
|
92
96
|
const axios_1 = require("@nestjs/axios");
|
|
93
97
|
const jwt_1 = require("@nestjs/jwt");
|
|
94
98
|
const seed_command_1 = require("./commands/seed.command");
|
|
@@ -208,6 +212,7 @@ const saved_filters_controller_1 = require("./controllers/saved-filters.controll
|
|
|
208
212
|
const scheduled_job_controller_1 = require("./controllers/scheduled-job.controller");
|
|
209
213
|
const agent_session_controller_1 = require("./controllers/agent-session.controller");
|
|
210
214
|
const agent_event_controller_1 = require("./controllers/agent-event.controller");
|
|
215
|
+
const mcp_audit_log_controller_1 = require("./controllers/mcp-audit-log.controller");
|
|
211
216
|
const security_rule_controller_1 = require("./controllers/security-rule.controller");
|
|
212
217
|
const setting_controller_1 = require("./controllers/setting.controller");
|
|
213
218
|
const info_controller_1 = require("./controllers/info.controller");
|
|
@@ -233,6 +238,7 @@ const saved_filters_entity_1 = require("./entities/saved-filters.entity");
|
|
|
233
238
|
const scheduled_job_entity_1 = require("./entities/scheduled-job.entity");
|
|
234
239
|
const agent_session_entity_1 = require("./entities/agent-session.entity");
|
|
235
240
|
const agent_event_entity_1 = require("./entities/agent-event.entity");
|
|
241
|
+
const mcp_audit_log_entity_1 = require("./entities/mcp-audit-log.entity");
|
|
236
242
|
const security_rule_entity_1 = require("./entities/security-rule.entity");
|
|
237
243
|
const setting_entity_1 = require("./entities/setting.entity");
|
|
238
244
|
const user_activity_history_entity_1 = require("./entities/user-activity-history.entity");
|
|
@@ -307,6 +313,7 @@ const saved_filters_repository_1 = require("./repository/saved-filters.repositor
|
|
|
307
313
|
const scheduled_job_repository_1 = require("./repository/scheduled-job.repository");
|
|
308
314
|
const agent_session_repository_1 = require("./repository/agent-session.repository");
|
|
309
315
|
const agent_event_repository_1 = require("./repository/agent-event.repository");
|
|
316
|
+
const mcp_audit_log_repository_1 = require("./repository/mcp-audit-log.repository");
|
|
310
317
|
const security_rule_repository_1 = require("./repository/security-rule.repository");
|
|
311
318
|
const setting_repository_1 = require("./repository/setting.repository");
|
|
312
319
|
const sms_template_repository_1 = require("./repository/sms-template.repository");
|
|
@@ -355,6 +362,7 @@ const saved_filters_service_1 = require("./services/saved-filters.service");
|
|
|
355
362
|
const scheduled_job_service_1 = require("./services/scheduled-job.service");
|
|
356
363
|
const agent_session_service_1 = require("./services/agent-session.service");
|
|
357
364
|
const agent_event_service_1 = require("./services/agent-event.service");
|
|
365
|
+
const mcp_audit_log_service_1 = require("./services/mcp-audit-log.service");
|
|
358
366
|
const scheduler_service_1 = require("./services/scheduled-jobs/scheduler.service");
|
|
359
367
|
const security_rule_service_1 = require("./services/security-rule.service");
|
|
360
368
|
const list_of_dashboard_question_providers_selection_provider_service_1 = require("./services/selection-providers/list-of-dashboard-question-providers-selection-provider.service");
|
|
@@ -404,8 +412,8 @@ const list_of_roles_selectionproviders_service_1 = require("./services/selection
|
|
|
404
412
|
let SolidCoreModule = class SolidCoreModule {
|
|
405
413
|
configure(consumer) {
|
|
406
414
|
consumer
|
|
407
|
-
.apply(express.json({ limit:
|
|
408
|
-
.forRoutes(
|
|
415
|
+
.apply(express.json({ limit: "10mb" }), express.urlencoded({ limit: "10mb", extended: true }))
|
|
416
|
+
.forRoutes("*");
|
|
409
417
|
}
|
|
410
418
|
};
|
|
411
419
|
exports.SolidCoreModule = SolidCoreModule;
|
|
@@ -445,6 +453,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
|
|
|
445
453
|
scheduled_job_entity_1.ScheduledJob,
|
|
446
454
|
agent_session_entity_1.AgentSession,
|
|
447
455
|
agent_event_entity_1.AgentEvent,
|
|
456
|
+
mcp_audit_log_entity_1.McpAuditLog,
|
|
448
457
|
security_rule_entity_1.SecurityRule,
|
|
449
458
|
setting_entity_1.Setting,
|
|
450
459
|
sms_template_entity_1.SmsTemplate,
|
|
@@ -458,18 +467,18 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
|
|
|
458
467
|
cache_manager_1.CacheModule.registerAsync(cache_options_1.CacheManagerOptions),
|
|
459
468
|
schedule_1.ScheduleModule.forRoot(),
|
|
460
469
|
serve_static_1.ServeStaticModule.forRoot({
|
|
461
|
-
rootPath: (0, path_1.join)(process.cwd(),
|
|
462
|
-
serveRoot:
|
|
470
|
+
rootPath: (0, path_1.join)(process.cwd(), "media-files-storage"),
|
|
471
|
+
serveRoot: "/media-files-storage",
|
|
463
472
|
serveStaticOptions: {
|
|
464
473
|
setHeaders: (res) => {
|
|
465
|
-
res.setHeader(
|
|
474
|
+
res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
|
|
466
475
|
},
|
|
467
476
|
},
|
|
468
477
|
}),
|
|
469
478
|
platform_express_1.MulterModule.registerAsync({
|
|
470
479
|
imports: [config_1.ConfigModule],
|
|
471
480
|
useFactory: async (configService) => ({
|
|
472
|
-
dest: process.env.AB_MEDIA_UPLOAD_DIR ??
|
|
481
|
+
dest: process.env.AB_MEDIA_UPLOAD_DIR ?? "media-uploads",
|
|
473
482
|
}),
|
|
474
483
|
inject: [config_1.ConfigService],
|
|
475
484
|
}),
|
|
@@ -509,6 +518,8 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
|
|
|
509
518
|
module_metadata_controller_1.ModuleMetadataController,
|
|
510
519
|
mq_message_controller_1.MqMessageController,
|
|
511
520
|
mq_message_queue_controller_1.MqMessageQueueController,
|
|
521
|
+
gupshup_webhook_controller_1.GupshupWebhookController,
|
|
522
|
+
meta_cloud_whatsapp_webhook_controller_1.MetaCloudWhatsappWebhookController,
|
|
512
523
|
otp_authentication_controller_1.OTPAuthenticationController,
|
|
513
524
|
permission_metadata_controller_1.PermissionMetadataController,
|
|
514
525
|
role_metadata_controller_1.RoleMetadataController,
|
|
@@ -516,6 +527,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
|
|
|
516
527
|
scheduled_job_controller_1.ScheduledJobController,
|
|
517
528
|
agent_session_controller_1.AgentSessionController,
|
|
518
529
|
agent_event_controller_1.AgentEventController,
|
|
530
|
+
mcp_audit_log_controller_1.McpAuditLogController,
|
|
519
531
|
security_rule_controller_1.SecurityRuleController,
|
|
520
532
|
service_controller_1.ServiceController,
|
|
521
533
|
setting_controller_1.SettingController,
|
|
@@ -603,6 +615,8 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
|
|
|
603
615
|
Msg91SMSService_1.Msg91SMSService,
|
|
604
616
|
Msg91OTPService_1.Msg91OTPService,
|
|
605
617
|
Msg91WhatsappService_1.Msg91WhatsappService,
|
|
618
|
+
MetaCloudWhatsappService_1.MetaCloudWhatsappService,
|
|
619
|
+
GupshupOtpWhatsappService_1.GupshupOtpWhatsappService,
|
|
606
620
|
TwilioSMSService_1.TwilioSMSService,
|
|
607
621
|
sms_template_service_1.SmsTemplateService,
|
|
608
622
|
email_template_service_1.EmailTemplateService,
|
|
@@ -771,8 +785,10 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
|
|
|
771
785
|
scheduled_job_repository_1.ScheduledJobRepository,
|
|
772
786
|
agent_session_repository_1.AgentSessionRepository,
|
|
773
787
|
agent_event_repository_1.AgentEventRepository,
|
|
788
|
+
mcp_audit_log_repository_1.McpAuditLogRepository,
|
|
774
789
|
agent_session_service_1.AgentSessionService,
|
|
775
790
|
agent_event_service_1.AgentEventService,
|
|
791
|
+
mcp_audit_log_service_1.McpAuditLogService,
|
|
776
792
|
scheduled_job_subscriber_1.ScheduledJobSubscriber,
|
|
777
793
|
alpha_num_external_id_computed_field_provider_1.AlphaNumExternalIdComputationProvider,
|
|
778
794
|
list_of_values_subscriber_1.ListOfValuesSubscriber,
|