From 2896d448d6f2f5a3b93fff7b9ad0d6adcce31028 Mon Sep 17 00:00:00 2001 From: Gaurav Dafale Date: Wed, 20 May 2026 11:52:30 +0530 Subject: [PATCH] feat: integrate gupshup provider for notifications --- .../whatsapp-webhook.controller.ts | 81 ++ src/listeners/user-registration.listener.ts | 62 +- src/services/authentication.service.ts | 3 + .../default-settings-provider.service.ts | 62 ++ .../whatsapp/GupshupWhatsappService.ts | 119 +++ src/solid-core.module.ts | 742 +++++++++--------- 6 files changed, 692 insertions(+), 377 deletions(-) create mode 100644 src/controllers/whatsapp-webhook.controller.ts create mode 100644 src/services/whatsapp/GupshupWhatsappService.ts diff --git a/src/controllers/whatsapp-webhook.controller.ts b/src/controllers/whatsapp-webhook.controller.ts new file mode 100644 index 00000000..015a2be9 --- /dev/null +++ b/src/controllers/whatsapp-webhook.controller.ts @@ -0,0 +1,81 @@ +import { Body, Controller, HttpCode, HttpStatus, Logger, Post, Req } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { Request } from 'express'; +import { Auth } from 'src/decorators/auth.decorator'; +import { Public } from 'src/decorators/public.decorator'; +import { AuthType } from 'src/enums/auth-type.enum'; + +@Auth(AuthType.None) +@Controller('webhook/whatsapp') +@ApiTags('Solid Core') +export class WhatsappWebhookController { + private readonly logger = new Logger(WhatsappWebhookController.name); + + @Public() + @Post() + @HttpCode(HttpStatus.OK) + async receiveWebhook(@Req() req: Request, @Body() body: unknown) { + const userAgent = req.headers['user-agent'] ?? null; + this.logger.log(`Received WhatsApp webhook${userAgent ? ` from ${userAgent}` : ''}`); + this.logger.debug(`WhatsApp webhook payload: ${JSON.stringify(body)}`); + + const statusInfo = this.extractStatusInfo(body); + if (statusInfo) { + this.logger.log( + `WhatsApp delivery update: status=${statusInfo.status ?? 'unknown'}, messageId=${statusInfo.messageId ?? 'n/a'}, destination=${statusInfo.destination ?? 'n/a'}, reason=${statusInfo.reason ?? 'n/a'}`, + ); + } + + // Always acknowledge webhook receipt to avoid provider retries. + return { + success: true, + message: 'Webhook received', + }; + } + + private extractStatusInfo(body: unknown): { + status?: string; + messageId?: string; + destination?: string; + reason?: string; + } | null { + if (!body || typeof body !== 'object') { + return null; + } + + const payload = body as Record; + + const status = + this.asString(payload.status) || + this.asString(payload.messageStatus) || + this.asString((payload.payload as Record)?.status); + + const messageId = + this.asString(payload.messageId) || + this.asString(payload.id) || + this.asString((payload.payload as Record)?.id) || + this.asString((payload.payload as Record)?.messageId); + + const destination = + this.asString(payload.destination) || + this.asString(payload.phone) || + this.asString((payload.payload as Record)?.destination) || + this.asString((payload.payload as Record)?.phone); + + const reason = + this.asString(payload.reason) || + this.asString(payload.error) || + this.asString((payload.payload as Record)?.reason) || + this.asString((payload.payload as Record)?.error); + + if (!status && !messageId && !destination && !reason) { + return null; + } + + return { status, messageId, destination, reason }; + } + + private asString(value: unknown): string | undefined { + return typeof value === 'string' && value.trim() ? value.trim() : undefined; + } +} diff --git a/src/listeners/user-registration.listener.ts b/src/listeners/user-registration.listener.ts index 91703e9f..b489f5c7 100755 --- a/src/listeners/user-registration.listener.ts +++ b/src/listeners/user-registration.listener.ts @@ -1,14 +1,60 @@ - -import { User } from "../entities/user.entity"; -import { OnEvent } from "@nestjs/event-emitter"; import { Injectable, Logger } from "@nestjs/common"; +import { OnEvent } from "@nestjs/event-emitter"; +import { AxiosError } from "axios"; +import { WhatsAppFactory } from "src/factories/whatsapp.factory"; import { EventDetails, EventType } from "../interfaces"; +import { User } from "../entities/user.entity"; @Injectable() export class UserRegistrationListener { - private logger = new Logger(UserRegistrationListener.name); - @OnEvent(EventType.USER_REGISTERED) - handleUserRegistration(event: EventDetails) { - this.logger.log(`User registered with details: ${JSON.stringify(event.payload)}`); + private readonly logger = new Logger(UserRegistrationListener.name); + + constructor(private readonly whatsAppFactory: WhatsAppFactory) {} + + @OnEvent(EventType.USER_REGISTERED) + async handleUserRegistration(event: EventDetails) { + this.logger.log(`User registered with details: ${JSON.stringify(event.payload)}`); + + const to = + process.env.WHATSAPP_EVENT_NOTIFY_TO || + process.env.COMMON_WHATSAPP_EVENT_NOTIFY_TO; + + if (!to) { + this.logger.debug( + "Skipping WhatsApp registration notification. Set WHATSAPP_EVENT_NOTIFY_TO or COMMON_WHATSAPP_EVENT_NOTIFY_TO.", + ); + return; + } + + const userName = event?.payload?.username || event?.payload?.email || "User"; + + try { + const whatsappService = this.whatsAppFactory.getWhatsappService(); + await whatsappService.sendWhatsAppMessage(to, null, { + payload: { + channel: "whatsapp", + source: + process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE || + process.env.GUPSHUP_SOURCE_NUMBER, + destination: to, + "src.name": process.env.COMMON_GUPSHUP_APP_NAME || "solidx", + message: { + type: "text", + text: `New user registered: ${userName}`, + }, + }, + }); + + this.logger.log(`Sent registration WhatsApp notification to ${to}`); + } catch (error) { + const axiosError = error as AxiosError; + const status = axiosError.response?.status; + const responseData = axiosError.response?.data; + const genericError = error as Error; + + this.logger.error( + `Failed to send registration WhatsApp notification to ${to}. status=${status ?? 'unknown'}, response=${typeof responseData === 'object' ? JSON.stringify(responseData) : responseData}, message=${genericError?.message ?? 'unknown'}, stack=${genericError?.stack ?? 'n/a'}`, + ); } -} \ No newline at end of file + } +} diff --git a/src/services/authentication.service.ts b/src/services/authentication.service.ts index 1f4b45ab..f0e5b75b 100755 --- a/src/services/authentication.service.ts +++ b/src/services/authentication.service.ts @@ -336,6 +336,9 @@ export class AuthenticationService { // Send welcome notifications (email/SMS) if enabled. await this.notifyUserOnSignup(user); + + // Emit registration event for all successful standard signups as well. + this.triggerRegistrationEvent(user); } generatePassword(length: number = 8): string { diff --git a/src/services/settings/default-settings-provider.service.ts b/src/services/settings/default-settings-provider.service.ts index cf8bcdd9..8754055c 100644 --- a/src/services/settings/default-settings-provider.service.ts +++ b/src/services/settings/default-settings-provider.service.ts @@ -1161,6 +1161,68 @@ const getSolidCoreSettings = (isProd: boolean) => sortOrder: 30, controlType: "shortText", }, + + //gupshup-settings-provider.service.ts + { + moduleName: "solid-core", + key: "gupShupAppName", + value: process.env.COMMON_GUPSHUP_APP_NAME, + level: SettingLevel.SystemAdminReadonly, + label: "Gupshup App Name", + group: "gupshup-settings", + sortOrder: 10, + controlType: "shortText", + }, + { + moduleName: "solid-core", + key: "gupshupApiUrl", + value: process.env.COMMON_GUPSHUP_API_URL, + level: SettingLevel.SystemAdminReadonly, + label: "Gupshup API URL", + group: "gupshup-settings", + sortOrder: 10, + controlType: "shortText", + }, + { + moduleName: "solid-core", + key: "gupshupWhatsappProvider", + value: process.env.COMMON_WHATSAPP_PROVIDER, + level: SettingLevel.SystemAdminReadonly, + label: "Gupshup WhatsApp Provider", + group: "gupshup-settings", + sortOrder: 10, + controlType: "shortText", + }, + { + moduleName: "solid-core", + key: "gupshupWhatsappApiKey", + value: process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY, + level: SettingLevel.SystemEnv, + label: "Gupshup API Key", + group: "gupshup-settings", + sortOrder: 10, + controlType: "shortText", + }, + { + moduleName: "solid-core", + key: "gupshupWhatsappSource", + value: process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE, + level: SettingLevel.SystemEnv, + label: "Gupshup WhatsApp Source", + group: "gupshup-settings", + sortOrder: 10, + controlType: "shortText", + }, + { + moduleName: "solid-core", + key: "gupshupNotifyTo", + value: process.env.WHATSAPP_EVENT_NOTIFY_TO, + level: SettingLevel.SystemEnv, + label: "Gupshup Notify To", + group: "gupshup-settings", + sortOrder: 10, + controlType: "shortText", + }, ] as const satisfies SettingDefinition[]; // 2. diff --git a/src/services/whatsapp/GupshupWhatsappService.ts b/src/services/whatsapp/GupshupWhatsappService.ts new file mode 100644 index 00000000..b3e7a5ac --- /dev/null +++ b/src/services/whatsapp/GupshupWhatsappService.ts @@ -0,0 +1,119 @@ +import { HttpService } from '@nestjs/axios'; +import { Injectable, Logger } from '@nestjs/common'; +import { AxiosError } from 'axios'; +import { QueueMessage } from 'src/interfaces/mq'; +import { IWhatsAppTransport } from '../../interfaces'; +import { WhatsAppProvider } from 'src/decorators/whatsapp-provider.decorator'; + +@Injectable() +@WhatsAppProvider() +export class GupshupWhatsappService implements IWhatsAppTransport { + readonly logger = new Logger(GupshupWhatsappService.name); + + constructor(private readonly httpService: HttpService) {} + + async sendWhatsAppMessage( + to: string, + templateId: string, + parameters: any, + parentEntity?: any, + parentEntityId?: any, + ): Promise { + const message = { + payload: { + to, + templateId, + ...parameters, + }, + parentEntity, + parentEntityId, + }; + + await this.sendWhatsAppMessageSynchronously(message); + return message; + } + + async sendWhatsAppMessageSynchronously(message: QueueMessage): Promise { + const requestBody = this.createWhatsappRequest(message); + + const apiKey = + process.env.COMMON_GUPSHUP_WHATSAPP_API_KEY || process.env.GUPSHUP_API_KEY; + const url = + process.env.COMMON_GUPSHUP_WHATSAPP_API_URL || process.env.GUPSHUP_API_URL; + + if (!apiKey || !url) { + throw new Error('Missing Gupshup configuration: API key or URL'); + } + + const isWaEndpoint = url.includes('/wa/api/v1/msg'); + + try { + if (isWaEndpoint) { + const form = this.toWaFormEncoded(requestBody); + await this.httpService.axiosRef.post(url, form.toString(), { + headers: { + apikey: apiKey, + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }); + } else { + await this.httpService.axiosRef.post(url, requestBody, { + headers: { + apikey: apiKey, + 'Content-Type': 'application/json', + }, + }); + } + + this.logger.debug( + `Sent Gupshup WhatsApp message to ${message.payload.to} using ${isWaEndpoint ? 'wa' : 'json'} endpoint`, + ); + } catch (error) { + const axiosError = error as AxiosError; + const status = axiosError.response?.status; + const responseData = axiosError.response?.data; + + this.logger.error( + `Gupshup send failed: status=${status ?? 'unknown'}, url=${url}, response=${typeof responseData === 'object' ? JSON.stringify(responseData) : responseData}`, + ); + + throw error; + } + } + + private createWhatsappRequest(message: QueueMessage): any { + const { to, templateId, ...parameters } = message.payload; + const source = + process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE || process.env.GUPSHUP_SOURCE_NUMBER; + + if (parameters?.payload) { + return parameters.payload; + } + + return { + channel: 'whatsapp', + source, + destination: to, + message: { + type: 'template', + template: { + id: templateId, + params: parameters, + }, + }, + }; + } + + private toWaFormEncoded(payload: Record): URLSearchParams { + const params = new URLSearchParams(); + const appName = process.env.COMMON_GUPSHUP_APP_NAME || 'solidx'; + + params.append('channel', payload.channel || 'whatsapp'); + params.append('source', payload.source || ''); + params.append('destination', payload.destination || ''); + params.append('src.name', payload['src.name'] || appName); + params.append('message', JSON.stringify(payload.message || {})); + + return params; + } +} diff --git a/src/solid-core.module.ts b/src/solid-core.module.ts index e7e48abf..350decff 100755 --- a/src/solid-core.module.ts +++ b/src/solid-core.module.ts @@ -1,7 +1,7 @@ -import 'multer'; -import { Global, MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; -import * as express from 'express'; -import { ConfigModule, ConfigService } from '@nestjs/config'; +import "multer"; +import { Global, MiddlewareConsumer, Module, NestModule } from "@nestjs/common"; +import * as express from "express"; +import { ConfigModule, ConfigService } from "@nestjs/config"; import { APP_FILTER, APP_GUARD, @@ -9,136 +9,136 @@ import { DiscoveryService, MetadataScanner, Reflector, -} from '@nestjs/core'; -import { MulterModule } from '@nestjs/platform-express'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { RemoveFieldsCommand } from './commands/remove-fields.command'; -import { FieldMetadataController } from './controllers/field-metadata.controller'; -import { MediaStorageProviderMetadataController } from './controllers/media-storage-provider-metadata.controller'; -import { ModelMetadataController } from './controllers/model-metadata.controller'; -import { ModuleMetadataController } from './controllers/module-metadata.controller'; -import { TestController } from './controllers/test.controller'; -import { FieldMetadata } from './entities/field-metadata.entity'; -import { ListOfValues } from './entities/list-of-values.entity'; -import { MediaStorageProviderMetadata } from './entities/media-storage-provider-metadata.entity'; -import { Media } from './entities/media.entity'; -import { ModelMetadata } from './entities/model-metadata.entity'; -import { ModuleMetadata } from './entities/module-metadata.entity'; -import { CommandService } from './helpers/command.service'; -import { SchematicService } from './helpers/schematic.service'; -import { ListOfValuesSelectionProvider } from './services/selection-providers/list-of-values-selection-providers.service'; -import { PseudoForeignKeySelectionProvider } from './services/selection-providers/pseudo-foreign-key-selection-provider.service'; -import { ModuleMetadataSeederService } from './seeders/module-metadata-seeder.service'; -import { ModuleTestDataService } from './seeders/module-test-data.service'; -import { CrudHelperService } from './services/crud-helper.service'; -import { FieldMetadataService } from './services/field-metadata.service'; -import { ListOfValuesService } from './services/list-of-values.service'; +} from "@nestjs/core"; +import { MulterModule } from "@nestjs/platform-express"; +import { TypeOrmModule } from "@nestjs/typeorm"; +import { RemoveFieldsCommand } from "./commands/remove-fields.command"; +import { FieldMetadataController } from "./controllers/field-metadata.controller"; +import { MediaStorageProviderMetadataController } from "./controllers/media-storage-provider-metadata.controller"; +import { ModelMetadataController } from "./controllers/model-metadata.controller"; +import { ModuleMetadataController } from "./controllers/module-metadata.controller"; +import { TestController } from "./controllers/test.controller"; +import { FieldMetadata } from "./entities/field-metadata.entity"; +import { ListOfValues } from "./entities/list-of-values.entity"; +import { MediaStorageProviderMetadata } from "./entities/media-storage-provider-metadata.entity"; +import { Media } from "./entities/media.entity"; +import { ModelMetadata } from "./entities/model-metadata.entity"; +import { ModuleMetadata } from "./entities/module-metadata.entity"; +import { CommandService } from "./helpers/command.service"; +import { SchematicService } from "./helpers/schematic.service"; +import { ListOfValuesSelectionProvider } from "./services/selection-providers/list-of-values-selection-providers.service"; +import { PseudoForeignKeySelectionProvider } from "./services/selection-providers/pseudo-foreign-key-selection-provider.service"; +import { ModuleMetadataSeederService } from "./seeders/module-metadata-seeder.service"; +import { ModuleTestDataService } from "./seeders/module-test-data.service"; +import { CrudHelperService } from "./services/crud-helper.service"; +import { FieldMetadataService } from "./services/field-metadata.service"; +import { ListOfValuesService } from "./services/list-of-values.service"; // import { MediaStorageProviderMetadataSeederService } from './services/media-storage-provider-metadata-seeder.service'; -import { MediaStorageProviderMetadataService } from './services/media-storage-provider-metadata.service'; -import { MediaService } from './services/media.service'; -import { ModelMetadataService } from './services/model-metadata.service'; -import { ModuleMetadataService } from './services/module-metadata.service'; -import { SolidIntrospectService } from './services/solid-introspect.service'; +import { MediaStorageProviderMetadataService } from "./services/media-storage-provider-metadata.service"; +import { MediaService } from "./services/media.service"; +import { ModelMetadataService } from "./services/model-metadata.service"; +import { ModuleMetadataService } from "./services/module-metadata.service"; +import { SolidIntrospectService } from "./services/solid-introspect.service"; // import { ListOfComputedFieldProvider } from './providers/list-of-computed-field-provider.service'; -import { ServeStaticModule } from '@nestjs/serve-static'; -import { join } from 'path'; -import { RefreshModelCommand } from './commands/refresh-model.command'; -import { MediaController } from './controllers/media.controller'; +import { ServeStaticModule } from "@nestjs/serve-static"; +import { join } from "path"; +import { RefreshModelCommand } from "./commands/refresh-model.command"; +import { MediaController } from "./controllers/media.controller"; -import { RefreshModuleCommand } from './commands/refresh-module.command'; -import { ModelMetadataSubscriber } from './subscribers/model-metadata.subscriber'; +import { RefreshModuleCommand } from "./commands/refresh-module.command"; +import { ModelMetadataSubscriber } from "./subscribers/model-metadata.subscriber"; -import { ViewMetadataController } from './controllers/view-metadata.controller'; -import { ViewMetadata } from './entities/view-metadata.entity'; -import { ViewMetadataService } from './services/view-metadata.service'; +import { ViewMetadataController } from "./controllers/view-metadata.controller"; +import { ViewMetadata } from "./entities/view-metadata.entity"; +import { ViewMetadataService } from "./services/view-metadata.service"; -import { ActionMetadataController } from './controllers/action-metadata.controller'; -import { ActionMetadata } from './entities/action-metadata.entity'; -import { ActionMetadataService } from './services/action-metadata.service'; +import { ActionMetadataController } from "./controllers/action-metadata.controller"; +import { ActionMetadata } from "./entities/action-metadata.entity"; +import { ActionMetadataService } from "./services/action-metadata.service"; -import { FacebookAuthenticationController } from './controllers/facebook-authentication.controller'; -import { MicrosoftAuthenticationController } from './controllers/microsoft-authentication.controller'; -import { FacebookOAuthStrategy } from './passport-strategies/facebook-oauth.strategy'; -import { MicrosoftOAuthStrategy } from './passport-strategies/microsoft-oauth.strategy'; +import { FacebookAuthenticationController } from "./controllers/facebook-authentication.controller"; +import { MicrosoftAuthenticationController } from "./controllers/microsoft-authentication.controller"; +import { FacebookOAuthStrategy } from "./passport-strategies/facebook-oauth.strategy"; +import { MicrosoftOAuthStrategy } from "./passport-strategies/microsoft-oauth.strategy"; -import { HttpModule } from '@nestjs/axios'; -import { JwtModule } from '@nestjs/jwt'; -import { SeedCommand } from './commands/seed.command'; -import { TestDataCommand } from './commands/test-data.command'; -import { TestRunCommand } from './commands/run-tests.command'; -import { TestCommand } from './commands/test.command'; -import { AuthenticationController } from './controllers/authentication.controller'; -import { EmailTemplateController } from './controllers/email-template.controller'; -import { GoogleAuthenticationController } from './controllers/google-authentication.controller'; -import { MenuItemMetadataController } from './controllers/menu-item-metadata.controller'; -import { MqMessageQueueController } from './controllers/mq-message-queue.controller'; -import { MqMessageController } from './controllers/mq-message.controller'; -import { OTPAuthenticationController } from './controllers/otp-authentication.controller'; -import { ServiceController } from './controllers/service.controller'; -import { SmsTemplateController } from './controllers/sms-template.controller'; -import { TestQueueController } from './controllers/test-queue.controller'; -import { EmailAttachment } from './entities/email-attachment.entity'; -import { EmailTemplate } from './entities/email-template.entity'; -import { MenuItemMetadata } from './entities/menu-item-metadata.entity'; -import { MqMessageQueue } from './entities/mq-message-queue.entity'; -import { MqMessage } from './entities/mq-message.entity'; -import { SmsTemplate } from './entities/sms-template.entity'; -import { AccessTokenGuard } from './guards/access-token.guard'; -import { ApiKeyGuard } from './guards/api-key.guard'; -import { AuthenticationGuard } from './guards/authentication.guard'; -import { PermissionsGuard } from './guards/permissions.guard'; -import { SolidRegistry } from './helpers/solid-registry'; -import { LoggingInterceptor } from './interceptors/logging.interceptor'; -import { ApiEmailQueuePublisher } from './jobs/rabbitmq/api-email-publisher.service'; -import { ApiEmailQueueSubscriber } from './jobs/rabbitmq/api-email-subscriber.service'; -import { TestQueuePublisherDatabase } from './jobs/database/test-queue-publisher-database.service'; -import { TestQueueSubscriberDatabase } from './jobs/database/test-queue-subscriber-database.service'; -import { TestQueuePublisherRedis } from './jobs/redis/test-queue-publisher-redis.service'; -import { TestQueueSubscriberRedis } from './jobs/redis/test-queue-subscriber-redis.service'; -import { Msg91WhatsappQueuePublisher } from './jobs/rabbitmq/msg91-whatsapp-publisher.service'; -import { Msg91WhatsappQueueSubscriber } from './jobs/rabbitmq/msg91-whatsapp-subscriber.service'; -import { Msg91OTPQueuePublisher } from './jobs/rabbitmq/msg91-otp-publisher.service'; -import { Msg91OTPQueueSubscriber } from './jobs/rabbitmq/msg91-otp-subscriber.service'; -import { Msg91SmsQueuePublisher } from './jobs/rabbitmq/msg91-sms-publisher.service'; -import { Msg91SmsQueueSubscriber } from './jobs/rabbitmq/msg91-sms-subscriber.service'; -import { SmtpEmailQueuePublisherRabbitmq } from './jobs/rabbitmq/smtp-email-publisher.service'; -import { SmtpEmailQueueSubscriberRabbitmq } from './jobs/rabbitmq/smtp-email-subscriber.service'; -import { TestQueuePublisher } from './jobs/rabbitmq/test-queue-publisher.service'; -import { TestQueueSubscriber } from './jobs/rabbitmq/test-queue-subscriber.service'; -import { ChatterQueuePublisherRabbitmq } from './jobs/rabbitmq/chatter-queue-publisher.service'; -import { ChatterQueueSubscriberRabbitmq } from './jobs/rabbitmq/chatter-queue-subscriber.service'; -import { ChatterQueuePublisherDatabase } from './jobs/database/chatter-queue-publisher-database.service'; -import { ChatterQueueSubscriberDatabase } from './jobs/database/chatter-queue-subscriber-database.service'; -import { ApiEmailQueuePublisherRedis } from './jobs/redis/api-email-publisher-redis.service'; -import { ApiEmailQueueSubscriberRedis } from './jobs/redis/api-email-subscriber-redis.service'; -import { ChatterQueuePublisherRedis } from './jobs/redis/chatter-queue-publisher-redis.service'; -import { ChatterQueueSubscriberRedis } from './jobs/redis/chatter-queue-subscriber-redis.service'; -import { ComputedFieldEvaluationPublisherRedis } from './jobs/redis/computed-field-evaluation-publisher-redis.service'; -import { ComputedFieldEvaluationSubscriberRedis } from './jobs/redis/computed-field-evaluation-subscriber-redis.service'; -import { GenerateCodePublisherRedis } from './jobs/redis/generate-code-publisher-redis.service'; -import { GenerateCodeSubscriberRedis } from './jobs/redis/generate-code-subscriber-redis.service'; -import { Msg91OTPQueuePublisherRedis } from './jobs/redis/msg91-otp-publisher-redis.service'; -import { Msg91OTPQueueSubscriberRedis } from './jobs/redis/msg91-otp-subscriber-redis.service'; -import { Msg91SmsQueuePublisherRedis } from './jobs/redis/msg91-sms-publisher-redis.service'; -import { Msg91SmsQueueSubscriberRedis } from './jobs/redis/msg91-sms-subscriber-redis.service'; -import { Msg91WhatsappQueuePublisherRedis } from './jobs/redis/msg91-whatsapp-publisher-redis.service'; -import { Msg91WhatsappQueueSubscriberRedis } from './jobs/redis/msg91-whatsapp-subscriber-redis.service'; -import { SmtpEmailQueuePublisherRedis } from './jobs/redis/smtp-email-publisher-redis.service'; -import { SmtpEmailQueueSubscriberRedis } from './jobs/redis/smtp-email-subscriber-redis.service'; -import { Three60WhatsappQueuePublisherRedis } from './jobs/redis/three60-whatsapp-publisher-redis.service'; -import { Three60WhatsappQueueSubscriberRedis } from './jobs/redis/three60-whatsapp-subscriber-redis.service'; -import { TriggerMcpClientPublisherRedis } from './jobs/redis/trigger-mcp-client-publisher-redis.service'; -import { TriggerMcpClientSubscriberRedis } from './jobs/redis/trigger-mcp-client-subscriber-redis.service'; -import { TwilioSmsQueuePublisherRedis } from './jobs/redis/twilio-sms-publisher-redis.service'; -import { TwilioSmsQueueSubscriberRedis } from './jobs/redis/twilio-sms-subscriber-redis.service'; -import { UserRegistrationListener } from './listeners/user-registration.listener'; -import { GoogleOauthStrategy } from './passport-strategies/google-oauth.strategy'; -import { ApiKeyService } from './services/api-key.service'; -import { AuthenticationService } from './services/authentication.service'; -import { BcryptService } from './services/bcrypt.service'; -import { UuidExternalIdEntityComputedFieldProvider } from './services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service'; -import { UuidExternalIdComputedFieldProvider } from './services/computed-fields/uuid-external-id-computed-field-provider.service'; -import { EmailTemplateService } from './services/email-template.service'; +import { HttpModule } from "@nestjs/axios"; +import { JwtModule } from "@nestjs/jwt"; +import { SeedCommand } from "./commands/seed.command"; +import { TestDataCommand } from "./commands/test-data.command"; +import { TestRunCommand } from "./commands/run-tests.command"; +import { TestCommand } from "./commands/test.command"; +import { AuthenticationController } from "./controllers/authentication.controller"; +import { EmailTemplateController } from "./controllers/email-template.controller"; +import { GoogleAuthenticationController } from "./controllers/google-authentication.controller"; +import { MenuItemMetadataController } from "./controllers/menu-item-metadata.controller"; +import { MqMessageQueueController } from "./controllers/mq-message-queue.controller"; +import { MqMessageController } from "./controllers/mq-message.controller"; +import { OTPAuthenticationController } from "./controllers/otp-authentication.controller"; +import { ServiceController } from "./controllers/service.controller"; +import { SmsTemplateController } from "./controllers/sms-template.controller"; +import { TestQueueController } from "./controllers/test-queue.controller"; +import { EmailAttachment } from "./entities/email-attachment.entity"; +import { EmailTemplate } from "./entities/email-template.entity"; +import { MenuItemMetadata } from "./entities/menu-item-metadata.entity"; +import { MqMessageQueue } from "./entities/mq-message-queue.entity"; +import { MqMessage } from "./entities/mq-message.entity"; +import { SmsTemplate } from "./entities/sms-template.entity"; +import { AccessTokenGuard } from "./guards/access-token.guard"; +import { ApiKeyGuard } from "./guards/api-key.guard"; +import { AuthenticationGuard } from "./guards/authentication.guard"; +import { PermissionsGuard } from "./guards/permissions.guard"; +import { SolidRegistry } from "./helpers/solid-registry"; +import { LoggingInterceptor } from "./interceptors/logging.interceptor"; +import { ApiEmailQueuePublisher } from "./jobs/rabbitmq/api-email-publisher.service"; +import { ApiEmailQueueSubscriber } from "./jobs/rabbitmq/api-email-subscriber.service"; +import { TestQueuePublisherDatabase } from "./jobs/database/test-queue-publisher-database.service"; +import { TestQueueSubscriberDatabase } from "./jobs/database/test-queue-subscriber-database.service"; +import { TestQueuePublisherRedis } from "./jobs/redis/test-queue-publisher-redis.service"; +import { TestQueueSubscriberRedis } from "./jobs/redis/test-queue-subscriber-redis.service"; +import { Msg91WhatsappQueuePublisher } from "./jobs/rabbitmq/msg91-whatsapp-publisher.service"; +import { Msg91WhatsappQueueSubscriber } from "./jobs/rabbitmq/msg91-whatsapp-subscriber.service"; +import { Msg91OTPQueuePublisher } from "./jobs/rabbitmq/msg91-otp-publisher.service"; +import { Msg91OTPQueueSubscriber } from "./jobs/rabbitmq/msg91-otp-subscriber.service"; +import { Msg91SmsQueuePublisher } from "./jobs/rabbitmq/msg91-sms-publisher.service"; +import { Msg91SmsQueueSubscriber } from "./jobs/rabbitmq/msg91-sms-subscriber.service"; +import { SmtpEmailQueuePublisherRabbitmq } from "./jobs/rabbitmq/smtp-email-publisher.service"; +import { SmtpEmailQueueSubscriberRabbitmq } from "./jobs/rabbitmq/smtp-email-subscriber.service"; +import { TestQueuePublisher } from "./jobs/rabbitmq/test-queue-publisher.service"; +import { TestQueueSubscriber } from "./jobs/rabbitmq/test-queue-subscriber.service"; +import { ChatterQueuePublisherRabbitmq } from "./jobs/rabbitmq/chatter-queue-publisher.service"; +import { ChatterQueueSubscriberRabbitmq } from "./jobs/rabbitmq/chatter-queue-subscriber.service"; +import { ChatterQueuePublisherDatabase } from "./jobs/database/chatter-queue-publisher-database.service"; +import { ChatterQueueSubscriberDatabase } from "./jobs/database/chatter-queue-subscriber-database.service"; +import { ApiEmailQueuePublisherRedis } from "./jobs/redis/api-email-publisher-redis.service"; +import { ApiEmailQueueSubscriberRedis } from "./jobs/redis/api-email-subscriber-redis.service"; +import { ChatterQueuePublisherRedis } from "./jobs/redis/chatter-queue-publisher-redis.service"; +import { ChatterQueueSubscriberRedis } from "./jobs/redis/chatter-queue-subscriber-redis.service"; +import { ComputedFieldEvaluationPublisherRedis } from "./jobs/redis/computed-field-evaluation-publisher-redis.service"; +import { ComputedFieldEvaluationSubscriberRedis } from "./jobs/redis/computed-field-evaluation-subscriber-redis.service"; +import { GenerateCodePublisherRedis } from "./jobs/redis/generate-code-publisher-redis.service"; +import { GenerateCodeSubscriberRedis } from "./jobs/redis/generate-code-subscriber-redis.service"; +import { Msg91OTPQueuePublisherRedis } from "./jobs/redis/msg91-otp-publisher-redis.service"; +import { Msg91OTPQueueSubscriberRedis } from "./jobs/redis/msg91-otp-subscriber-redis.service"; +import { Msg91SmsQueuePublisherRedis } from "./jobs/redis/msg91-sms-publisher-redis.service"; +import { Msg91SmsQueueSubscriberRedis } from "./jobs/redis/msg91-sms-subscriber-redis.service"; +import { Msg91WhatsappQueuePublisherRedis } from "./jobs/redis/msg91-whatsapp-publisher-redis.service"; +import { Msg91WhatsappQueueSubscriberRedis } from "./jobs/redis/msg91-whatsapp-subscriber-redis.service"; +import { SmtpEmailQueuePublisherRedis } from "./jobs/redis/smtp-email-publisher-redis.service"; +import { SmtpEmailQueueSubscriberRedis } from "./jobs/redis/smtp-email-subscriber-redis.service"; +import { Three60WhatsappQueuePublisherRedis } from "./jobs/redis/three60-whatsapp-publisher-redis.service"; +import { Three60WhatsappQueueSubscriberRedis } from "./jobs/redis/three60-whatsapp-subscriber-redis.service"; +import { TriggerMcpClientPublisherRedis } from "./jobs/redis/trigger-mcp-client-publisher-redis.service"; +import { TriggerMcpClientSubscriberRedis } from "./jobs/redis/trigger-mcp-client-subscriber-redis.service"; +import { TwilioSmsQueuePublisherRedis } from "./jobs/redis/twilio-sms-publisher-redis.service"; +import { TwilioSmsQueueSubscriberRedis } from "./jobs/redis/twilio-sms-subscriber-redis.service"; +import { UserRegistrationListener } from "./listeners/user-registration.listener"; +import { GoogleOauthStrategy } from "./passport-strategies/google-oauth.strategy"; +import { ApiKeyService } from "./services/api-key.service"; +import { AuthenticationService } from "./services/authentication.service"; +import { BcryptService } from "./services/bcrypt.service"; +import { UuidExternalIdEntityComputedFieldProvider } from "./services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service"; +import { UuidExternalIdComputedFieldProvider } from "./services/computed-fields/uuid-external-id-computed-field-provider.service"; +import { EmailTemplateService } from "./services/email-template.service"; import { DiskFileService, S3FileService, @@ -146,251 +146,253 @@ import { DiskStoragePathBuilder, S3StoragePathBuilder, StoragePathBuilderFactory, -} from './services/file'; -import { HashingService } from './services/hashing.service'; -import { ElasticEmailService } from './services/mail/elastic-email.service'; -import { SMTPEMailService } from './services/mail/smtp-email.service'; -import { MenuItemMetadataService } from './services/menu-item-metadata.service'; -import { MqMessageQueueService } from './services/mq-message-queue.service'; -import { MqMessageService } from './services/mq-message.service'; -import { PdfService } from './services/pdf.service'; -import { RefreshTokenIdsStorageService } from './services/refresh-token-ids-storage.service'; -import { SsoCodeStorageService } from './services/sso-code-storage.service'; -import { ListOfModelsSelectionProvider } from './services/selection-providers/list-of-models-selection-provider.service'; -import { TinyUrlService } from './services/short-url/tiny-url.service'; -import { SmsTemplateService } from './services/sms-template.service'; -import { Msg91OTPService } from './services/sms/Msg91OTPService'; -import { Msg91SMSService } from './services/sms/Msg91SMSService'; +} from "./services/file"; +import { HashingService } from "./services/hashing.service"; +import { ElasticEmailService } from "./services/mail/elastic-email.service"; +import { SMTPEMailService } from "./services/mail/smtp-email.service"; +import { MenuItemMetadataService } from "./services/menu-item-metadata.service"; +import { MqMessageQueueService } from "./services/mq-message-queue.service"; +import { MqMessageService } from "./services/mq-message.service"; +import { PdfService } from "./services/pdf.service"; +import { RefreshTokenIdsStorageService } from "./services/refresh-token-ids-storage.service"; +import { SsoCodeStorageService } from "./services/sso-code-storage.service"; +import { ListOfModelsSelectionProvider } from "./services/selection-providers/list-of-models-selection-provider.service"; +import { TinyUrlService } from "./services/short-url/tiny-url.service"; +import { SmsTemplateService } from "./services/sms-template.service"; +import { Msg91OTPService } from "./services/sms/Msg91OTPService"; +import { Msg91SMSService } from "./services/sms/Msg91SMSService"; // import { UserService } from './services/user.service'; -import { Msg91WhatsappService } from './services/whatsapp/Msg91WhatsappService'; -import { SoftDeleteAwareEventSubscriber } from './subscribers/soft-delete-aware-event.subscriber'; +import { Msg91WhatsappService } from "./services/whatsapp/Msg91WhatsappService"; +import { SoftDeleteAwareEventSubscriber } from "./subscribers/soft-delete-aware-event.subscriber"; -import { PermissionMetadataController } from './controllers/permission-metadata.controller'; -import { PermissionMetadata } from './entities/permission-metadata.entity'; -import { PermissionMetadataService } from './services/permission-metadata.service'; +import { PermissionMetadataController } from "./controllers/permission-metadata.controller"; +import { PermissionMetadata } from "./entities/permission-metadata.entity"; +import { PermissionMetadataService } from "./services/permission-metadata.service"; -import { ScheduleModule } from '@nestjs/schedule'; -import { ClsModule } from 'nestjs-cls'; -import { AiInteractionController } from './controllers/ai-interaction.controller'; -import { ChatterMessageDetailsController } from './controllers/chatter-message-details.controller'; -import { ChatterMessageController } from './controllers/chatter-message.controller'; -import { DashboardQuestionSqlDatasetConfigController } from './controllers/dashboard-question-sql-dataset-config.controller'; -import { DashboardQuestionController } from './controllers/dashboard-question.controller'; -import { DashboardVariableController } from './controllers/dashboard-variable.controller'; -import { DashboardLayoutController } from './controllers/dashboard-layout.controller'; +import { ScheduleModule } from "@nestjs/schedule"; +import { ClsModule } from "nestjs-cls"; +import { AiInteractionController } from "./controllers/ai-interaction.controller"; +import { ChatterMessageDetailsController } from "./controllers/chatter-message-details.controller"; +import { ChatterMessageController } from "./controllers/chatter-message.controller"; +import { DashboardQuestionSqlDatasetConfigController } from "./controllers/dashboard-question-sql-dataset-config.controller"; +import { DashboardQuestionController } from "./controllers/dashboard-question.controller"; +import { DashboardVariableController } from "./controllers/dashboard-variable.controller"; +import { DashboardLayoutController } from "./controllers/dashboard-layout.controller"; -import { DashboardController } from './controllers/dashboard.controller'; -import { ExportTemplateController } from './controllers/export-template.controller'; -import { ExportTransactionController } from './controllers/export-transaction.controller'; -import { ImportTransactionErrorLogController } from './controllers/import-transaction-error-log.controller'; -import { ImportTransactionController } from './controllers/import-transaction.controller'; -import { ListOfValuesController } from './controllers/list-of-values.controller'; -import { LocaleController } from './controllers/locale.controller'; -import { RoleMetadataController } from './controllers/role-metadata.controller'; -import { SavedFiltersController } from './controllers/saved-filters.controller'; -import { ScheduledJobController } from './controllers/scheduled-job.controller'; -import { AgentSessionController } from './controllers/agent-session.controller'; -import { AgentEventController } from './controllers/agent-event.controller'; -import { SecurityRuleController } from './controllers/security-rule.controller'; -import { SettingController } from './controllers/setting.controller'; -import { InfoController } from './controllers/info.controller'; -import { InfoService } from './services/info.service'; -import { UserActivityHistoryController } from './controllers/user-activity-history.controller'; -import { UserViewMetadataController } from './controllers/user-view-metadata.controller'; -import { UserController } from './controllers/user.controller'; -import { AiInteraction } from './entities/ai-interaction.entity'; -import { ChatterMessageDetails } from './entities/chatter-message-details.entity'; -import { ChatterMessage } from './entities/chatter-message.entity'; -import { DashboardQuestionSqlDatasetConfig } from './entities/dashboard-question-sql-dataset-config.entity'; -import { DashboardQuestion } from './entities/dashboard-question.entity'; -import { DashboardVariable } from './entities/dashboard-variable.entity'; -import { DashboardLayout } from './entities/dashboard-layout.entity'; +import { DashboardController } from "./controllers/dashboard.controller"; +import { ExportTemplateController } from "./controllers/export-template.controller"; +import { ExportTransactionController } from "./controllers/export-transaction.controller"; +import { ImportTransactionErrorLogController } from "./controllers/import-transaction-error-log.controller"; +import { ImportTransactionController } from "./controllers/import-transaction.controller"; +import { ListOfValuesController } from "./controllers/list-of-values.controller"; +import { LocaleController } from "./controllers/locale.controller"; +import { RoleMetadataController } from "./controllers/role-metadata.controller"; +import { SavedFiltersController } from "./controllers/saved-filters.controller"; +import { ScheduledJobController } from "./controllers/scheduled-job.controller"; +import { AgentSessionController } from "./controllers/agent-session.controller"; +import { AgentEventController } from "./controllers/agent-event.controller"; +import { SecurityRuleController } from "./controllers/security-rule.controller"; +import { SettingController } from "./controllers/setting.controller"; +import { InfoController } from "./controllers/info.controller"; +import { WhatsappWebhookController } from "./controllers/whatsapp-webhook.controller"; +import { InfoService } from "./services/info.service"; +import { UserActivityHistoryController } from "./controllers/user-activity-history.controller"; +import { UserViewMetadataController } from "./controllers/user-view-metadata.controller"; +import { UserController } from "./controllers/user.controller"; +import { AiInteraction } from "./entities/ai-interaction.entity"; +import { ChatterMessageDetails } from "./entities/chatter-message-details.entity"; +import { ChatterMessage } from "./entities/chatter-message.entity"; +import { DashboardQuestionSqlDatasetConfig } from "./entities/dashboard-question-sql-dataset-config.entity"; +import { DashboardQuestion } from "./entities/dashboard-question.entity"; +import { DashboardVariable } from "./entities/dashboard-variable.entity"; +import { DashboardLayout } from "./entities/dashboard-layout.entity"; -import { Dashboard } from './entities/dashboard.entity'; -import { ExportTemplate } from './entities/export-template.entity'; -import { ExportTransaction } from './entities/export-transaction.entity'; -import { ImportTransactionErrorLog } from './entities/import-transaction-error-log.entity'; -import { ImportTransaction } from './entities/import-transaction.entity'; -import { Locale } from './entities/locale.entity'; -import { RoleMetadata } from './entities/role-metadata.entity'; -import { SavedFilters } from './entities/saved-filters.entity'; -import { ScheduledJob } from './entities/scheduled-job.entity'; -import { AgentSession } from './entities/agent-session.entity'; -import { AgentEvent } from './entities/agent-event.entity'; -import { SecurityRule } from './entities/security-rule.entity'; -import { Setting } from './entities/setting.entity'; -import { UserActivityHistory } from './entities/user-activity-history.entity'; -import { UserViewMetadata } from './entities/user-view-metadata.entity'; -import { UserApiKey } from './entities/user-api-key.entity'; -import { User } from './entities/user.entity'; -import { HttpExceptionFilter } from './filters/http-exception.filter'; -import { ModelMetadataHelperService } from './helpers/model-metadata-helper.service'; -import { ModuleMetadataHelperService } from './helpers/module-metadata-helper.service'; -import { ApiEmailQueuePublisherDatabase } from './jobs/database/api-email-publisher-database.service'; -import { ApiEmailQueueSubscriberDatabase } from './jobs/database/api-email-subscriber-database.service'; -import { ComputedFieldEvaluationPublisherDatabase } from './jobs/database/computed-field-evaluation-publisher-database.service'; -import { ComputedFieldEvaluationSubscriberDatabase } from './jobs/database/computed-field-evaluation-subscriber-database.service'; -import { GenerateCodePublisherDatabase } from './jobs/database/generate-code-publisher-database.service'; -import { GenerateCodeSubscriberDatabase } from './jobs/database/generate-code-subscriber-database.service'; -import { OTPQueuePublisherDatabase } from './jobs/database/otp-publisher-database.service'; -import { OTPQueueSubscriberDatabase } from './jobs/database/otp-subscriber-database.service'; -import { Msg91SmsQueuePublisherDatabase } from './jobs/database/msg91-sms-publisher-database.service'; -import { Msg91SmsQueueSubscriberDatabase } from './jobs/database/msg91-sms-subscriber-database.service'; -import { SmtpEmailQueuePublisherDatabase } from './jobs/database/smtp-email-publisher-database.service'; -import { SmtpEmailQueueSubscriberDatabase } from './jobs/database/smtp-email-subscriber-database.service'; +import { Dashboard } from "./entities/dashboard.entity"; +import { ExportTemplate } from "./entities/export-template.entity"; +import { ExportTransaction } from "./entities/export-transaction.entity"; +import { ImportTransactionErrorLog } from "./entities/import-transaction-error-log.entity"; +import { ImportTransaction } from "./entities/import-transaction.entity"; +import { Locale } from "./entities/locale.entity"; +import { RoleMetadata } from "./entities/role-metadata.entity"; +import { SavedFilters } from "./entities/saved-filters.entity"; +import { ScheduledJob } from "./entities/scheduled-job.entity"; +import { AgentSession } from "./entities/agent-session.entity"; +import { AgentEvent } from "./entities/agent-event.entity"; +import { SecurityRule } from "./entities/security-rule.entity"; +import { Setting } from "./entities/setting.entity"; +import { UserActivityHistory } from "./entities/user-activity-history.entity"; +import { UserViewMetadata } from "./entities/user-view-metadata.entity"; +import { UserApiKey } from "./entities/user-api-key.entity"; +import { User } from "./entities/user.entity"; +import { HttpExceptionFilter } from "./filters/http-exception.filter"; +import { ModelMetadataHelperService } from "./helpers/model-metadata-helper.service"; +import { ModuleMetadataHelperService } from "./helpers/module-metadata-helper.service"; +import { ApiEmailQueuePublisherDatabase } from "./jobs/database/api-email-publisher-database.service"; +import { ApiEmailQueueSubscriberDatabase } from "./jobs/database/api-email-subscriber-database.service"; +import { ComputedFieldEvaluationPublisherDatabase } from "./jobs/database/computed-field-evaluation-publisher-database.service"; +import { ComputedFieldEvaluationSubscriberDatabase } from "./jobs/database/computed-field-evaluation-subscriber-database.service"; +import { GenerateCodePublisherDatabase } from "./jobs/database/generate-code-publisher-database.service"; +import { GenerateCodeSubscriberDatabase } from "./jobs/database/generate-code-subscriber-database.service"; +import { OTPQueuePublisherDatabase } from "./jobs/database/otp-publisher-database.service"; +import { OTPQueueSubscriberDatabase } from "./jobs/database/otp-subscriber-database.service"; +import { Msg91SmsQueuePublisherDatabase } from "./jobs/database/msg91-sms-publisher-database.service"; +import { Msg91SmsQueueSubscriberDatabase } from "./jobs/database/msg91-sms-subscriber-database.service"; +import { SmtpEmailQueuePublisherDatabase } from "./jobs/database/smtp-email-publisher-database.service"; +import { SmtpEmailQueueSubscriberDatabase } from "./jobs/database/smtp-email-subscriber-database.service"; -import { TwilioSmsQueuePublisherDatabase } from './jobs/database/twilio-sms-publisher-database.service'; -import { TwilioSmsQueueSubscriberDatabase } from './jobs/database/twilio-sms-subscriber-database.service'; +import { TwilioSmsQueuePublisherDatabase } from "./jobs/database/twilio-sms-publisher-database.service"; +import { TwilioSmsQueueSubscriberDatabase } from "./jobs/database/twilio-sms-subscriber-database.service"; // import { ThrottlerModule } from '@nestjs/throttler'; -import { IngestCommand } from './commands/ingest.command'; -import { MailFactory } from './factories/mail.factory'; -import { ErrorMapperService } from './helpers/error-mapper.service'; -import { SolidCoreErrorCodesProvider } from './helpers/solid-core-error-codes-provider.service'; -import { ComputedFieldEvaluationPublisherRabbitmq } from './jobs/rabbitmq/computed-field-evaluation-publisher.service'; -import { ComputedFieldEvaluationSubscriberRabbitmq } from './jobs/rabbitmq/computed-field-evaluation-subscriber.service'; -import { Msg91WhatsappQueuePublisherDatabase } from './jobs/database/msg91-whatsapp-publisher-database.service'; -import { Msg91WhatsappQueueSubscriberDatabase } from './jobs/database/msg91-whatsapp-subscriber-database.service'; -import { Three60WhatsappQueuePublisherDatabase } from './jobs/database/three60-whatsapp-publisher-database.service'; -import { Three60WhatsappQueueSubscriberDatabase } from './jobs/database/three60-whatsapp-subscriber-database.service'; -import { TriggerMcpClientPublisherDatabase } from './jobs/database/trigger-mcp-client-publisher-database.service'; -import { TriggerMcpClientSubscriberDatabase } from './jobs/database/trigger-mcp-client-subscriber-database.service'; -import { GenerateCodePublisherRabbitmq } from './jobs/rabbitmq/generate-code-publisher.service'; -import { GenerateCodeSubscriberRabbitmq } from './jobs/rabbitmq/generate-code-subscriber.service'; -import { Three60WhatsappQueuePublisher } from './jobs/rabbitmq/three60-whatsapp-publisher.service'; -import { Three60WhatsappQueueSubscriber } from './jobs/rabbitmq/three60-whatsapp-subscriber.service'; -import { TriggerMcpClientPublisherRabbitmq } from './jobs/rabbitmq/trigger-mcp-client-publisher.service'; -import { TriggerMcpClientSubscriberRabbitmq } from './jobs/rabbitmq/trigger-mcp-client-subscriber.service'; -import { TwilioSmsQueuePublisherRabbitmq } from './jobs/rabbitmq/twilio-sms-publisher.service'; -import { TwilioSmsQueueSubscriberRabbitmq } from './jobs/rabbitmq/twilio-sms-subscriber.service'; -import { DashboardMapper } from './mappers/dashboard-mapper'; -import { ListOfValuesMapper } from './mappers/list-of-values-mapper'; -import { ActionMetadataRepository } from './repository/action-metadata.repository'; -import { AiInteractionRepository } from './repository/ai-interaction.repository'; -import { ChatterMessageDetailsRepository } from './repository/chatter-message-details.repository'; -import { ChatterMessageRepository } from './repository/chatter-message.repository'; -import { DashboardQuestionSqlDatasetConfigRepository } from './repository/dashboard-question-sql-dataset-config.repository'; -import { DashboardQuestionRepository } from './repository/dashboard-question.repository'; -import { DashboardVariableRepository } from './repository/dashboard-variable.repository'; -import { DashboardRepository } from './repository/dashboard.repository'; -import { DashboardLayoutRepository } from './repository/dashboard-layout.repository'; +import { IngestCommand } from "./commands/ingest.command"; +import { MailFactory } from "./factories/mail.factory"; +import { ErrorMapperService } from "./helpers/error-mapper.service"; +import { SolidCoreErrorCodesProvider } from "./helpers/solid-core-error-codes-provider.service"; +import { ComputedFieldEvaluationPublisherRabbitmq } from "./jobs/rabbitmq/computed-field-evaluation-publisher.service"; +import { ComputedFieldEvaluationSubscriberRabbitmq } from "./jobs/rabbitmq/computed-field-evaluation-subscriber.service"; +import { Msg91WhatsappQueuePublisherDatabase } from "./jobs/database/msg91-whatsapp-publisher-database.service"; +import { Msg91WhatsappQueueSubscriberDatabase } from "./jobs/database/msg91-whatsapp-subscriber-database.service"; +import { Three60WhatsappQueuePublisherDatabase } from "./jobs/database/three60-whatsapp-publisher-database.service"; +import { Three60WhatsappQueueSubscriberDatabase } from "./jobs/database/three60-whatsapp-subscriber-database.service"; +import { TriggerMcpClientPublisherDatabase } from "./jobs/database/trigger-mcp-client-publisher-database.service"; +import { TriggerMcpClientSubscriberDatabase } from "./jobs/database/trigger-mcp-client-subscriber-database.service"; +import { GenerateCodePublisherRabbitmq } from "./jobs/rabbitmq/generate-code-publisher.service"; +import { GenerateCodeSubscriberRabbitmq } from "./jobs/rabbitmq/generate-code-subscriber.service"; +import { Three60WhatsappQueuePublisher } from "./jobs/rabbitmq/three60-whatsapp-publisher.service"; +import { Three60WhatsappQueueSubscriber } from "./jobs/rabbitmq/three60-whatsapp-subscriber.service"; +import { TriggerMcpClientPublisherRabbitmq } from "./jobs/rabbitmq/trigger-mcp-client-publisher.service"; +import { TriggerMcpClientSubscriberRabbitmq } from "./jobs/rabbitmq/trigger-mcp-client-subscriber.service"; +import { TwilioSmsQueuePublisherRabbitmq } from "./jobs/rabbitmq/twilio-sms-publisher.service"; +import { TwilioSmsQueueSubscriberRabbitmq } from "./jobs/rabbitmq/twilio-sms-subscriber.service"; +import { DashboardMapper } from "./mappers/dashboard-mapper"; +import { ListOfValuesMapper } from "./mappers/list-of-values-mapper"; +import { ActionMetadataRepository } from "./repository/action-metadata.repository"; +import { AiInteractionRepository } from "./repository/ai-interaction.repository"; +import { ChatterMessageDetailsRepository } from "./repository/chatter-message-details.repository"; +import { ChatterMessageRepository } from "./repository/chatter-message.repository"; +import { DashboardQuestionSqlDatasetConfigRepository } from "./repository/dashboard-question-sql-dataset-config.repository"; +import { DashboardQuestionRepository } from "./repository/dashboard-question.repository"; +import { DashboardVariableRepository } from "./repository/dashboard-variable.repository"; +import { DashboardRepository } from "./repository/dashboard.repository"; +import { DashboardLayoutRepository } from "./repository/dashboard-layout.repository"; -import { EmailTemplateRepository } from './repository/email-template.repository'; -import { ExportTemplateRepository } from './repository/export-template.repository'; -import { ExportTransactionRepository } from './repository/export-transaction.repository'; -import { FieldMetadataRepository } from './repository/field-metadata.repository'; -import { ImportTransactionErrorLogRepository } from './repository/import-transaction-error-log.repository'; -import { ImportTransactionRepository } from './repository/import-transaction.repository'; -import { ListOfValuesRepository } from './repository/list-of-values.repository'; -import { LocaleRepository } from './repository/locale.repository'; -import { MediaRepository } from './repository/media.repository'; -import { MenuItemMetadataRepository } from './repository/menu-item-metadata.repository'; -import { ModelMetadataRepository } from './repository/model-metadata.repository'; -import { ModuleMetadataRepository } from './repository/module-metadata.repository'; -import { MqMessageQueueRepository } from './repository/mq-message-queue.repository'; -import { MqMessageRepository } from './repository/mq-message.repository'; -import { PermissionMetadataRepository } from './repository/permission-metadata.repository'; -import { RoleMetadataRepository } from './repository/role-metadata.repository'; -import { SavedFiltersRepository } from './repository/saved-filters.repository'; -import { ScheduledJobRepository } from './repository/scheduled-job.repository'; -import { AgentSessionRepository } from './repository/agent-session.repository'; -import { AgentEventRepository } from './repository/agent-event.repository'; -import { SecurityRuleRepository } from './repository/security-rule.repository'; -import { SettingRepository } from './repository/setting.repository'; -import { SmsTemplateRepository } from './repository/sms-template.repository'; -import { UserActivityHistoryRepository } from './repository/user-activity-history.repository'; -import { UserViewMetadataRepository } from './repository/user-view-metadata.repository'; -import { UserApiKeyRepository } from './repository/user-api-key.repository'; -import { UserRepository } from './repository/user.repository'; -import { ViewMetadataRepository } from './repository/view-metadata.repository'; -import { PermissionMetadataSeederService } from './seeders/permission-metadata-seeder.service'; -import { SystemFieldsSeederService } from './seeders/system-fields-seeder.service'; -import { AiInteractionService } from './services/ai-interaction.service'; -import { ChatterMessageDetailsService } from './services/chatter-message-details.service'; -import { ChatterMessageService } from './services/chatter-message.service'; -import { ConcatComputedFieldProvider } from './services/computed-fields/concat-computed-field-provider.service'; -import { AlphaNumExternalIdComputationProvider } from './services/computed-fields/entity/alpha-num-external-id-computed-field-provider'; -import { ConcatEntityComputedFieldProvider } from './services/computed-fields/entity/concat-entity-computed-field-provider.service'; -import { NoopsEntityComputedFieldProviderService } from './services/computed-fields/entity/noops-entity-computed-field-provider.service'; -import { CRUDService } from './services/crud.service'; -import { CsvService } from './services/csv.service'; -import { DashboardQuestionSqlDatasetConfigService } from './services/dashboard-question-sql-dataset-config.service'; -import { DashboardQuestionService } from './services/dashboard-question.service'; -import { DashboardVariableSQLDynamicProvider } from './services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service'; -import { DasbhoardVariableTestDynamicProvider } from './services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service'; -import { DashboardVariableService } from './services/dashboard-variable.service'; -import { DashboardService } from './services/dashboard.service'; -import { DashboardLayoutService } from './services/dashboard-layout.service'; +import { EmailTemplateRepository } from "./repository/email-template.repository"; +import { ExportTemplateRepository } from "./repository/export-template.repository"; +import { ExportTransactionRepository } from "./repository/export-transaction.repository"; +import { FieldMetadataRepository } from "./repository/field-metadata.repository"; +import { ImportTransactionErrorLogRepository } from "./repository/import-transaction-error-log.repository"; +import { ImportTransactionRepository } from "./repository/import-transaction.repository"; +import { ListOfValuesRepository } from "./repository/list-of-values.repository"; +import { LocaleRepository } from "./repository/locale.repository"; +import { MediaRepository } from "./repository/media.repository"; +import { MenuItemMetadataRepository } from "./repository/menu-item-metadata.repository"; +import { ModelMetadataRepository } from "./repository/model-metadata.repository"; +import { ModuleMetadataRepository } from "./repository/module-metadata.repository"; +import { MqMessageQueueRepository } from "./repository/mq-message-queue.repository"; +import { MqMessageRepository } from "./repository/mq-message.repository"; +import { PermissionMetadataRepository } from "./repository/permission-metadata.repository"; +import { RoleMetadataRepository } from "./repository/role-metadata.repository"; +import { SavedFiltersRepository } from "./repository/saved-filters.repository"; +import { ScheduledJobRepository } from "./repository/scheduled-job.repository"; +import { AgentSessionRepository } from "./repository/agent-session.repository"; +import { AgentEventRepository } from "./repository/agent-event.repository"; +import { SecurityRuleRepository } from "./repository/security-rule.repository"; +import { SettingRepository } from "./repository/setting.repository"; +import { SmsTemplateRepository } from "./repository/sms-template.repository"; +import { UserActivityHistoryRepository } from "./repository/user-activity-history.repository"; +import { UserViewMetadataRepository } from "./repository/user-view-metadata.repository"; +import { UserApiKeyRepository } from "./repository/user-api-key.repository"; +import { UserRepository } from "./repository/user.repository"; +import { ViewMetadataRepository } from "./repository/view-metadata.repository"; +import { PermissionMetadataSeederService } from "./seeders/permission-metadata-seeder.service"; +import { SystemFieldsSeederService } from "./seeders/system-fields-seeder.service"; +import { AiInteractionService } from "./services/ai-interaction.service"; +import { ChatterMessageDetailsService } from "./services/chatter-message-details.service"; +import { ChatterMessageService } from "./services/chatter-message.service"; +import { ConcatComputedFieldProvider } from "./services/computed-fields/concat-computed-field-provider.service"; +import { AlphaNumExternalIdComputationProvider } from "./services/computed-fields/entity/alpha-num-external-id-computed-field-provider"; +import { ConcatEntityComputedFieldProvider } from "./services/computed-fields/entity/concat-entity-computed-field-provider.service"; +import { NoopsEntityComputedFieldProviderService } from "./services/computed-fields/entity/noops-entity-computed-field-provider.service"; +import { CRUDService } from "./services/crud.service"; +import { CsvService } from "./services/csv.service"; +import { DashboardQuestionSqlDatasetConfigService } from "./services/dashboard-question-sql-dataset-config.service"; +import { DashboardQuestionService } from "./services/dashboard-question.service"; +import { DashboardVariableSQLDynamicProvider } from "./services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service"; +import { DasbhoardVariableTestDynamicProvider } from "./services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service"; +import { DashboardVariableService } from "./services/dashboard-variable.service"; +import { DashboardService } from "./services/dashboard.service"; +import { DashboardLayoutService } from "./services/dashboard-layout.service"; -import { ExcelService } from './services/excel.service'; -import { ExportTemplateService } from './services/export-template.service'; -import { ExportTransactionService } from './services/export-transaction.service'; -import { IngestMetadataService } from './services/genai/ingest-metadata.service'; -import { McpHandlerFactory } from './services/genai/mcp-handlers/mcp-handler-factory.service'; -import { R2RHelperService } from './services/genai/r2r-helper.service'; -import { ImportTransactionErrorLogService } from './services/import-transaction-error-log.service'; -import { ImportTransactionService } from './services/import-transaction.service'; -import { LocaleService } from './services/locale.service'; -import { FileS3StorageProvider } from './services/mediaStorageProviders/file-s3-storage-provider'; -import { FileStorageProvider } from './services/mediaStorageProviders/file-storage-provider'; -import { PollerService } from './services/poller.service'; -import { ChartJsSqlDataProvider } from './services/question-data-providers/chartjs-sql-data-provider.service'; -import { PrimeReactDatatableSqlDataProvider } from './services/question-data-providers/prime-react-datatable-sql-data-provider.service'; -import { PrimeReactMeterGroupSqlDataProvider } from './services/question-data-providers/prime-react-meter-group-sql-data-provider.service'; -import { PublisherFactory } from './services/queues/publisher-factory.service'; -import { RequestContextService } from './services/request-context.service'; -import { RoleMetadataService } from './services/role-metadata.service'; -import { SavedFiltersService } from './services/saved-filters.service'; -import { ScheduledJobService } from './services/scheduled-job.service'; -import { AgentSessionService } from './services/agent-session.service'; -import { AgentEventService } from './services/agent-event.service'; -import { SchedulerServiceImpl } from './services/scheduled-jobs/scheduler.service'; -import { SecurityRuleService } from './services/security-rule.service'; -import { ListOfDashboardQuestionProvidersSelectionProvider } from './services/selection-providers/list-of-dashboard-question-providers-selection-provider.service'; -import { ListOfDashboardVariableProvidersSelectionProvider } from './services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service'; -import { ListOfScheduledJobsSelectionProvider } from './services/selection-providers/list-of-scheduled-jobs-selection-provider.service'; -import { LocaleListSelectionProvider } from './services/selection-providers/locale-list-selection-provider.service'; -import { SettingService } from './services/setting.service'; -import { TwilioSMSService } from './services/sms/TwilioSMSService'; -import { SolidTsMorphService } from './services/solid-ts-morph.service'; -import { SqlExpressionResolverService } from './services/sql-expression-resolver.service'; -import { TextractService } from './services/textract.service'; -import { UserActivityHistoryService } from './services/user-activity-history.service'; -import { UserViewMetadataService } from './services/user-view-metadata.service'; -import { UserService } from './services/user.service'; -import { Three60WhatsappService } from './services/whatsapp/Three60WhatsappService'; -import { AuditSubscriber } from './subscribers/audit.subscriber'; -import { ComputedEntityFieldSubscriber } from './subscribers/computed-entity-field.subscriber'; -import { CreatedByUpdatedBySubscriber } from './subscribers/created-by-updated-by.subscriber'; -import { DashboardQuestionSqlDatasetConfigSubscriber } from './subscribers/dashboard-question-sql-dataset-config.subscriber'; -import { DashboardQuestionSubscriber } from './subscribers/dashboard-question.subscriber'; -import { DashboardVariableSubscriber } from './subscribers/dashboard-variable.subscriber'; -import { DashboardSubscriber } from './subscribers/dashboard.subscriber'; -import { ListOfValuesSubscriber } from './subscribers/list-of-values.subscriber'; -import { ScheduledJobSubscriber } from './subscribers/scheduled-job.subscriber'; -import { SecurityRuleSubscriber } from './subscribers/security-rule.subscriber'; -import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber'; -import { MediaStorageProviderMetadataRepository } from './repository/media-storage-provider-metadata.repository'; -import { McpCommand } from './commands/mcp.command'; -import { FixturesService } from './services/fixtures.service'; -import { FixturesSetupCommand } from './commands/fixtures/fixtures-setup.command'; -import { FixturesTearDownCommand } from './commands/fixtures/fixtures-tear-down.command'; -import { DatabaseBootstrapService } from './services/database/database-bootstrap.service'; -import { SequenceNumComputedFieldProvider } from './services/computed-fields/entity/sequence-num-computed-field-provider'; -import { ModelSequence } from './entities/model-sequence.entity'; -import { ModelSequenceService } from './services/model-sequence.service'; -import { ModelSequenceController } from './controllers/model-sequence.controller'; -import { ModelSequenceRepository } from './repository/model-sequence.repository'; -import { CacheModule } from '@nestjs/cache-manager'; -import { CacheManagerOptions } from './config/cache.options'; -import { SolidCoreDefaultSettingsProvider } from './services/settings/default-settings-provider.service'; -import { SmsFactory } from './factories/sms.factory'; -import { WhatsAppFactory } from './factories/whatsapp.factory'; -import { ImageEncodingService } from './helpers/image-encoding.helper'; -import { SolidMicroserviceAdapter } from './helpers/solid-microservice-adapter.service'; -import { InfoCommand } from './commands/info.command'; -import { ListOfRolesSelectionProvider } from './services/selection-providers/list-of-roles-selectionproviders.service'; -import { Entity } from 'typeorm'; +import { ExcelService } from "./services/excel.service"; +import { ExportTemplateService } from "./services/export-template.service"; +import { ExportTransactionService } from "./services/export-transaction.service"; +import { IngestMetadataService } from "./services/genai/ingest-metadata.service"; +import { McpHandlerFactory } from "./services/genai/mcp-handlers/mcp-handler-factory.service"; +import { R2RHelperService } from "./services/genai/r2r-helper.service"; +import { ImportTransactionErrorLogService } from "./services/import-transaction-error-log.service"; +import { ImportTransactionService } from "./services/import-transaction.service"; +import { LocaleService } from "./services/locale.service"; +import { FileS3StorageProvider } from "./services/mediaStorageProviders/file-s3-storage-provider"; +import { FileStorageProvider } from "./services/mediaStorageProviders/file-storage-provider"; +import { PollerService } from "./services/poller.service"; +import { ChartJsSqlDataProvider } from "./services/question-data-providers/chartjs-sql-data-provider.service"; +import { PrimeReactDatatableSqlDataProvider } from "./services/question-data-providers/prime-react-datatable-sql-data-provider.service"; +import { PrimeReactMeterGroupSqlDataProvider } from "./services/question-data-providers/prime-react-meter-group-sql-data-provider.service"; +import { PublisherFactory } from "./services/queues/publisher-factory.service"; +import { RequestContextService } from "./services/request-context.service"; +import { RoleMetadataService } from "./services/role-metadata.service"; +import { SavedFiltersService } from "./services/saved-filters.service"; +import { ScheduledJobService } from "./services/scheduled-job.service"; +import { AgentSessionService } from "./services/agent-session.service"; +import { AgentEventService } from "./services/agent-event.service"; +import { SchedulerServiceImpl } from "./services/scheduled-jobs/scheduler.service"; +import { SecurityRuleService } from "./services/security-rule.service"; +import { ListOfDashboardQuestionProvidersSelectionProvider } from "./services/selection-providers/list-of-dashboard-question-providers-selection-provider.service"; +import { ListOfDashboardVariableProvidersSelectionProvider } from "./services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service"; +import { ListOfScheduledJobsSelectionProvider } from "./services/selection-providers/list-of-scheduled-jobs-selection-provider.service"; +import { LocaleListSelectionProvider } from "./services/selection-providers/locale-list-selection-provider.service"; +import { SettingService } from "./services/setting.service"; +import { TwilioSMSService } from "./services/sms/TwilioSMSService"; +import { SolidTsMorphService } from "./services/solid-ts-morph.service"; +import { SqlExpressionResolverService } from "./services/sql-expression-resolver.service"; +import { TextractService } from "./services/textract.service"; +import { UserActivityHistoryService } from "./services/user-activity-history.service"; +import { UserViewMetadataService } from "./services/user-view-metadata.service"; +import { UserService } from "./services/user.service"; +import { Three60WhatsappService } from "./services/whatsapp/Three60WhatsappService"; +import { AuditSubscriber } from "./subscribers/audit.subscriber"; +import { ComputedEntityFieldSubscriber } from "./subscribers/computed-entity-field.subscriber"; +import { CreatedByUpdatedBySubscriber } from "./subscribers/created-by-updated-by.subscriber"; +import { DashboardQuestionSqlDatasetConfigSubscriber } from "./subscribers/dashboard-question-sql-dataset-config.subscriber"; +import { DashboardQuestionSubscriber } from "./subscribers/dashboard-question.subscriber"; +import { DashboardVariableSubscriber } from "./subscribers/dashboard-variable.subscriber"; +import { DashboardSubscriber } from "./subscribers/dashboard.subscriber"; +import { ListOfValuesSubscriber } from "./subscribers/list-of-values.subscriber"; +import { ScheduledJobSubscriber } from "./subscribers/scheduled-job.subscriber"; +import { SecurityRuleSubscriber } from "./subscribers/security-rule.subscriber"; +import { ViewMetadataSubsciber } from "./subscribers/view-metadata.subscriber"; +import { MediaStorageProviderMetadataRepository } from "./repository/media-storage-provider-metadata.repository"; +import { McpCommand } from "./commands/mcp.command"; +import { FixturesService } from "./services/fixtures.service"; +import { FixturesSetupCommand } from "./commands/fixtures/fixtures-setup.command"; +import { FixturesTearDownCommand } from "./commands/fixtures/fixtures-tear-down.command"; +import { DatabaseBootstrapService } from "./services/database/database-bootstrap.service"; +import { SequenceNumComputedFieldProvider } from "./services/computed-fields/entity/sequence-num-computed-field-provider"; +import { ModelSequence } from "./entities/model-sequence.entity"; +import { ModelSequenceService } from "./services/model-sequence.service"; +import { ModelSequenceController } from "./controllers/model-sequence.controller"; +import { ModelSequenceRepository } from "./repository/model-sequence.repository"; +import { CacheModule } from "@nestjs/cache-manager"; +import { CacheManagerOptions } from "./config/cache.options"; +import { SolidCoreDefaultSettingsProvider } from "./services/settings/default-settings-provider.service"; +import { SmsFactory } from "./factories/sms.factory"; +import { WhatsAppFactory } from "./factories/whatsapp.factory"; +import { GupshupWhatsappService } from "./services/whatsapp/GupshupWhatsappService"; +import { ImageEncodingService } from "./helpers/image-encoding.helper"; +import { SolidMicroserviceAdapter } from "./helpers/solid-microservice-adapter.service"; +import { InfoCommand } from "./commands/info.command"; +import { ListOfRolesSelectionProvider } from "./services/selection-providers/list-of-roles-selectionproviders.service"; +import { Entity } from "typeorm"; @Global() @Module({ @@ -441,13 +443,13 @@ import { Entity } from 'typeorm'; CacheModule.registerAsync(CacheManagerOptions), ScheduleModule.forRoot(), ServeStaticModule.forRoot({ - rootPath: join(process.cwd(), 'media-files-storage'), - serveRoot: '/media-files-storage', + rootPath: join(process.cwd(), "media-files-storage"), + serveRoot: "/media-files-storage", serveStaticOptions: { setHeaders: (res /*, path, stat*/) => { // Allow use of these files from a different origin (e.g., :3000 UI) // Use 'same-site' if both origins are on the same site (localhost:* counts as same-site) - res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin'); // or 'same-site' + res.setHeader("Cross-Origin-Resource-Policy", "cross-origin"); // or 'same-site' // If you need to load into without tainting or fetch images via XHR, // you can also expose CORS here (not needed for simple ): @@ -458,7 +460,7 @@ import { Entity } from 'typeorm'; MulterModule.registerAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ - dest: process.env.AB_MEDIA_UPLOAD_DIR ?? 'media-uploads', + dest: process.env.AB_MEDIA_UPLOAD_DIR ?? "media-uploads", }), inject: [ConfigService], }), @@ -509,6 +511,7 @@ import { Entity } from 'typeorm'; ServiceController, SettingController, InfoController, + WhatsappWebhookController, SmsTemplateController, TestController, TestQueueController, @@ -632,6 +635,7 @@ import { Entity } from 'typeorm'; Msg91WhatsappQueueSubscriberDatabase, Three60WhatsappQueuePublisher, Three60WhatsappQueueSubscriber, + GupshupWhatsappService, Three60WhatsappQueuePublisherDatabase, Three60WhatsappQueueSubscriberDatabase, Three60WhatsappService, @@ -889,9 +893,9 @@ export class SolidCoreModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer .apply( - express.json({ limit: '10mb' }), - express.urlencoded({ limit: '10mb', extended: true }), + express.json({ limit: "10mb" }), + express.urlencoded({ limit: "10mb", extended: true }), ) - .forRoutes('*'); + .forRoutes("*"); } }