From 249489e697a425653021bbe9d5896b9d852d3e49 Mon Sep 17 00:00:00 2001 From: w3nder Date: Tue, 20 Feb 2024 17:05:07 -0300 Subject: [PATCH 1/3] Add blockUser functionality --- src/validate/validate.schema.ts | 11 +++++++++++ src/whatsapp/controllers/chat.controller.ts | 6 ++++++ src/whatsapp/dto/chat.dto.ts | 5 +++++ src/whatsapp/routers/chat.router.ts | 19 +++++++++++++++++++ .../services/whatsapp.baileys.service.ts | 13 +++++++++++++ .../services/whatsapp.business.service.ts | 3 +++ 6 files changed, 57 insertions(+) diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index 01592b1e..cb8d8762 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -539,6 +539,17 @@ export const privacySettingsSchema: JSONSchema7 = { required: ['privacySettings'], }; +export const blockUserSchema: JSONSchema7 = { + $id: v4(), + type: 'object', + properties: { + number: { type: 'string' }, + status: { type: 'string', enum: ['block', 'unblock'] }, + }, + required: ['number', 'block'], + ...isNotEmpty('number', 'block'), +}; + export const archiveChatSchema: JSONSchema7 = { $id: v4(), type: 'object', diff --git a/src/whatsapp/controllers/chat.controller.ts b/src/whatsapp/controllers/chat.controller.ts index f9d77fce..1c16260d 100644 --- a/src/whatsapp/controllers/chat.controller.ts +++ b/src/whatsapp/controllers/chat.controller.ts @@ -1,6 +1,7 @@ import { Logger } from '../../config/logger.config'; import { ArchiveChatDto, + BlockUserDto, DeleteMessage, getBase64FromMediaMessageDto, NumberDto, @@ -123,4 +124,9 @@ export class ChatController { logger.verbose('requested updateMessage from ' + instanceName + ' instance'); return await this.waMonitor.waInstances[instanceName].updateMessage(data); } + + public async blockUser({ instanceName }: InstanceDto, data: BlockUserDto) { + logger.verbose('requested blockUser from ' + instanceName + ' instance'); + return await this.waMonitor.waInstances[instanceName].blockUser(data); + } } diff --git a/src/whatsapp/dto/chat.dto.ts b/src/whatsapp/dto/chat.dto.ts index 31f3dfe3..24f04847 100644 --- a/src/whatsapp/dto/chat.dto.ts +++ b/src/whatsapp/dto/chat.dto.ts @@ -115,3 +115,8 @@ export class UpdateMessageDto extends Metadata { key: proto.IMessageKey; text: string; } + +export class BlockUserDto { + number: string; + status: 'block' | 'unblock'; +} diff --git a/src/whatsapp/routers/chat.router.ts b/src/whatsapp/routers/chat.router.ts index e4161474..a0ce3216 100644 --- a/src/whatsapp/routers/chat.router.ts +++ b/src/whatsapp/routers/chat.router.ts @@ -3,6 +3,7 @@ import { RequestHandler, Router } from 'express'; import { Logger } from '../../config/logger.config'; import { archiveChatSchema, + blockUserSchema, contactValidateSchema, deleteMessageSchema, messageUpSchema, @@ -20,6 +21,7 @@ import { import { RouterBroker } from '../abstract/abstract.router'; import { ArchiveChatDto, + BlockUserDto, DeleteMessage, getBase64FromMediaMessageDto, NumberDto, @@ -384,6 +386,23 @@ export class ChatRouter extends RouterBroker { }); return res.status(HttpStatus.OK).json(response); + }) + .put(this.routerPath('updateBlockStatus'), ...guards, async (req, res) => { + logger.verbose('request received in updateBlockStatus'); + logger.verbose('request body: '); + logger.verbose(req.body); + + logger.verbose('request query: '); + logger.verbose(req.query); + + const response = await this.dataValidate({ + request: req, + schema: blockUserSchema, + ClassRef: BlockUserDto, + execute: (instance, data) => chatController.blockUser(instance, data), + }); + + return res.status(HttpStatus.CREATED).json(response); }); } diff --git a/src/whatsapp/services/whatsapp.baileys.service.ts b/src/whatsapp/services/whatsapp.baileys.service.ts index 0fc4f541..91dc0607 100644 --- a/src/whatsapp/services/whatsapp.baileys.service.ts +++ b/src/whatsapp/services/whatsapp.baileys.service.ts @@ -63,6 +63,7 @@ import { useMultiFileAuthStateDb } from '../../utils/use-multi-file-auth-state-d import { useMultiFileAuthStateRedisDb } from '../../utils/use-multi-file-auth-state-redis-db'; import { ArchiveChatDto, + BlockUserDto, DeleteMessage, getBase64FromMediaMessageDto, LastMessage, @@ -2796,6 +2797,18 @@ export class BaileysStartupService extends WAStartupService { } } + public async blockUser(data: BlockUserDto) { + this.logger.verbose('Blocking user: ' + data.number); + try { + const jid = this.createJid(data.number); + await this.client.updateBlockStatus(jid, data.status); + + return { block: 'success' }; + } catch (error) { + throw new InternalServerErrorException('Error blocking user', error.toString()); + } + } + public async updateMessage(data: UpdateMessageDto) { try { const jid = this.createJid(data.number); diff --git a/src/whatsapp/services/whatsapp.business.service.ts b/src/whatsapp/services/whatsapp.business.service.ts index 2b37f362..73b1c299 100644 --- a/src/whatsapp/services/whatsapp.business.service.ts +++ b/src/whatsapp/services/whatsapp.business.service.ts @@ -1159,6 +1159,9 @@ export class BusinessStartupService extends WAStartupService { public async removeProfilePicture() { throw new BadRequestException('Method not available on WhatsApp Business API'); } + public async blockUser() { + throw new BadRequestException('Method not available on WhatsApp Business API'); + } public async updateMessage() { throw new BadRequestException('Method not available on WhatsApp Business API'); } From a68b0b3878c5b6fd76596d19f7d4f998f9b20157 Mon Sep 17 00:00:00 2001 From: w3nder Date: Tue, 20 Feb 2024 17:47:32 -0300 Subject: [PATCH 2/3] Add check number and ignore Group or Broadcast --- src/whatsapp/services/whatsapp.baileys.service.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/whatsapp/services/whatsapp.baileys.service.ts b/src/whatsapp/services/whatsapp.baileys.service.ts index 91dc0607..91541604 100644 --- a/src/whatsapp/services/whatsapp.baileys.service.ts +++ b/src/whatsapp/services/whatsapp.baileys.service.ts @@ -2800,8 +2800,19 @@ export class BaileysStartupService extends WAStartupService { public async blockUser(data: BlockUserDto) { this.logger.verbose('Blocking user: ' + data.number); try { - const jid = this.createJid(data.number); - await this.client.updateBlockStatus(jid, data.status); + const { number } = data; + + this.logger.verbose(`Check if number "${number}" is WhatsApp`); + const isWA = (await this.whatsappNumber({ numbers: [number] }))?.shift(); + + this.logger.verbose(`Exists: "${isWA.exists}" | jid: ${isWA.jid}`); + if (!isWA.exists && !isJidGroup(isWA.jid) && !isWA.jid.includes('@broadcast')) { + throw new BadRequestException(isWA); + } + + const sender = isWA.jid; + + await this.client.updateBlockStatus(sender, data.status); return { block: 'success' }; } catch (error) { From fa513bf784ea12ac71f42fd53a36dde3539e8cc8 Mon Sep 17 00:00:00 2001 From: w3nder Date: Tue, 20 Feb 2024 17:47:38 -0300 Subject: [PATCH 3/3] Update blockUserSchema in validate.schema.ts --- src/validate/validate.schema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index cb8d8762..faaf2fa1 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -546,8 +546,8 @@ export const blockUserSchema: JSONSchema7 = { number: { type: 'string' }, status: { type: 'string', enum: ['block', 'unblock'] }, }, - required: ['number', 'block'], - ...isNotEmpty('number', 'block'), + required: ['number', 'status'], + ...isNotEmpty('number', 'status'), }; export const archiveChatSchema: JSONSchema7 = {