From e58f1d778e9db3d81fd2d5e3182102e6df08ce9e Mon Sep 17 00:00:00 2001 From: Diego Vieira Date: Tue, 19 Mar 2024 00:58:45 +0000 Subject: [PATCH] feat(endpoint): add setPresence endpoint --- src/validate/validate.schema.ts | 12 ++++++++++++ src/whatsapp/controllers/chat.controller.ts | 6 ++++++ src/whatsapp/dto/chat.dto.ts | 4 ++++ src/whatsapp/routers/chat.router.ts | 18 ++++++++++++++++++ .../services/whatsapp.baileys.service.ts | 13 ++++++++++++- .../services/whatsapp.business.service.ts | 3 +++ 6 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index faaf2fa1..82bb8902 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -161,6 +161,18 @@ export const presenceSchema: JSONSchema7 = { required: ['options', 'number'], }; +export const presenceOnlySchema: JSONSchema7 = { + $id: v4(), + type: 'object', + properties: { + presence: { + type: 'string', + enum: ['unavailable', 'available', 'composing', 'recording', 'paused'], + }, + }, + required: ['presence'], +}; + export const pollMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', diff --git a/src/whatsapp/controllers/chat.controller.ts b/src/whatsapp/controllers/chat.controller.ts index 1c16260d..64a9cc82 100644 --- a/src/whatsapp/controllers/chat.controller.ts +++ b/src/whatsapp/controllers/chat.controller.ts @@ -11,6 +11,7 @@ import { ProfileStatusDto, ReadMessageDto, SendPresenceDto, + SetPresenceDto, UpdateMessageDto, WhatsAppNumberDto, } from '../dto/chat.dto'; @@ -85,6 +86,11 @@ export class ChatController { return await this.waMonitor.waInstances[instanceName].sendPresence(data); } + public async setPresence({ instanceName }: InstanceDto, data: SetPresenceDto) { + logger.verbose('requested sendPresence from ' + instanceName + ' instance'); + return await this.waMonitor.waInstances[instanceName].setPresence(data); + } + public async fetchPrivacySettings({ instanceName }: InstanceDto) { logger.verbose('requested fetchPrivacySettings from ' + instanceName + ' instance'); return await this.waMonitor.waInstances[instanceName].fetchPrivacySettings(); diff --git a/src/whatsapp/dto/chat.dto.ts b/src/whatsapp/dto/chat.dto.ts index 24f04847..c97e1ae5 100644 --- a/src/whatsapp/dto/chat.dto.ts +++ b/src/whatsapp/dto/chat.dto.ts @@ -110,6 +110,10 @@ export class SendPresenceDto extends Metadata { }; } +export class SetPresenceDto { + presence: WAPresence; +} + export class UpdateMessageDto extends Metadata { number: string; key: proto.IMessageKey; diff --git a/src/whatsapp/routers/chat.router.ts b/src/whatsapp/routers/chat.router.ts index a0ce3216..8a1585a3 100644 --- a/src/whatsapp/routers/chat.router.ts +++ b/src/whatsapp/routers/chat.router.ts @@ -9,6 +9,7 @@ import { messageUpSchema, messageValidateSchema, presenceSchema, + presenceOnlySchema, privacySettingsSchema, profileNameSchema, profilePictureSchema, @@ -31,6 +32,7 @@ import { ProfileStatusDto, ReadMessageDto, SendPresenceDto, + SetPresenceDto, UpdateMessageDto, WhatsAppNumberDto, } from '../dto/chat.dto'; @@ -250,6 +252,22 @@ export class ChatRouter extends RouterBroker { return res.status(HttpStatus.CREATED).json(response); }) + .post(this.routerPath('setPresence'), ...guards, async (req, res) => { + logger.verbose('request received in setPresence'); + logger.verbose('request body: '); + logger.verbose(req.body); + + logger.verbose('request query: '); + logger.verbose(req.query); + const response = await this.dataValidate({ + request: req, + schema: presenceOnlySchema, + ClassRef: SetPresenceDto, + execute: (instance, data) => chatController.setPresence(instance, data), + }); + + return res.status(HttpStatus.CREATED).json(response); + }) // Profile routes .get(this.routerPath('fetchPrivacySettings'), ...guards, async (req, res) => { logger.verbose('request received in fetchPrivacySettings'); diff --git a/src/whatsapp/services/whatsapp.baileys.service.ts b/src/whatsapp/services/whatsapp.baileys.service.ts index a081b5b7..f7a50013 100644 --- a/src/whatsapp/services/whatsapp.baileys.service.ts +++ b/src/whatsapp/services/whatsapp.baileys.service.ts @@ -72,6 +72,7 @@ import { PrivacySettingDto, ReadMessageDto, SendPresenceDto, + SetPresenceDto, UpdateMessageDto, WhatsAppNumberDto, } from '../dto/chat.dto'; @@ -1830,7 +1831,6 @@ export class BaileysStartupService extends WAStartupService { } // Instance Controller - public async sendPresence(data: SendPresenceDto) { try { const { number } = data; @@ -1863,6 +1863,17 @@ export class BaileysStartupService extends WAStartupService { } } + // Presence Controller + public async setPresence(data: SetPresenceDto) { + try { + await this.client.sendPresenceUpdate(data.presence); + this.logger.verbose('Sending presence update: ' + data.presence); + } catch (error) { + this.logger.error(error); + throw new BadRequestException(error.toString()); + } + } + // Send Message Controller public async textMessage(data: SendTextDto, isChatwoot = false) { this.logger.verbose('Sending text message'); diff --git a/src/whatsapp/services/whatsapp.business.service.ts b/src/whatsapp/services/whatsapp.business.service.ts index 0d4f723c..874e75dc 100644 --- a/src/whatsapp/services/whatsapp.business.service.ts +++ b/src/whatsapp/services/whatsapp.business.service.ts @@ -1185,6 +1185,9 @@ export class BusinessStartupService extends WAStartupService { public async sendPresence() { throw new BadRequestException('Method not available on WhatsApp Business API'); } + public async setPresence() { + throw new BadRequestException('Method not available on WhatsApp Business API'); + } public async fetchPrivacySettings() { throw new BadRequestException('Method not available on WhatsApp Business API'); }