import { RequestHandler, Router } from 'express'; import { audioMessageSchema, buttonMessageSchema, contactMessageSchema, linkPreviewSchema, listMessageSchema, locationMessageSchema, mediaMessageSchema, pollMessageSchema, reactionMessageSchema, statusMessageSchema, stickerMessageSchema, textMessageSchema, } from '../../validate/validate.schema'; import { SendAudioDto, SendButtonDto, SendContactDto, SendLinkPreviewDto, SendListDto, SendLocationDto, SendMediaDto, SendPollDto, SendReactionDto, SendStatusDto, SendStickerDto, SendTextDto, } from '../dto/sendMessage.dto'; import { sendMessageController } from '../whatsapp.module'; import { RouterBroker } from '../abstract/abstract.router'; import { HttpStatus } from './index.router'; import { Logger } from '../../config/logger.config'; const logger = new Logger('MessageRouter'); export class MessageRouter extends RouterBroker { constructor(...guards: RequestHandler[]) { super(); this.router .post(this.routerPath('sendText'), ...guards, async (req, res) => { logger.verbose('request received in sendText'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: textMessageSchema, ClassRef: SendTextDto, execute: (instance, data) => sendMessageController.sendText(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendMedia'), ...guards, async (req, res) => { logger.verbose('request received in sendMedia'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: mediaMessageSchema, ClassRef: SendMediaDto, execute: (instance, data) => sendMessageController.sendMedia(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendWhatsAppAudio'), ...guards, async (req, res) => { logger.verbose('request received in sendWhatsAppAudio'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: audioMessageSchema, ClassRef: SendMediaDto, execute: (instance, data) => sendMessageController.sendWhatsAppAudio(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendButtons'), ...guards, async (req, res) => { logger.verbose('request received in sendButtons'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: buttonMessageSchema, ClassRef: SendButtonDto, execute: (instance, data) => sendMessageController.sendButtons(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendLocation'), ...guards, async (req, res) => { logger.verbose('request received in sendLocation'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: locationMessageSchema, ClassRef: SendLocationDto, execute: (instance, data) => sendMessageController.sendLocation(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendList'), ...guards, async (req, res) => { logger.verbose('request received in sendList'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: listMessageSchema, ClassRef: SendListDto, execute: (instance, data) => sendMessageController.sendList(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendContact'), ...guards, async (req, res) => { logger.verbose('request received in sendContact'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: contactMessageSchema, ClassRef: SendContactDto, execute: (instance, data) => sendMessageController.sendContact(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendReaction'), ...guards, async (req, res) => { logger.verbose('request received in sendReaction'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: reactionMessageSchema, ClassRef: SendReactionDto, execute: (instance, data) => sendMessageController.sendReaction(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendPoll'), ...guards, async (req, res) => { logger.verbose('request received in sendPoll'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: pollMessageSchema, ClassRef: SendPollDto, execute: (instance, data) => sendMessageController.sendPoll(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendStatus'), ...guards, async (req, res) => { logger.verbose('request received in sendStatus'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: statusMessageSchema, ClassRef: SendStatusDto, execute: (instance, data) => sendMessageController.sendStatus(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendLinkPreview'), ...guards, async (req, res) => { logger.verbose('request received in sendLinkPreview'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: linkPreviewSchema, ClassRef: SendLinkPreviewDto, execute: (instance, data) => sendMessageController.sendLinkPreview(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendSticker'), ...guards, async (req, res) => { logger.verbose('request received in sendSticker'); logger.verbose('request body: '); logger.verbose(req.body); logger.verbose('request query: '); logger.verbose(req.query); const response = await this.dataValidate({ request: req, schema: stickerMessageSchema, ClassRef: SendStickerDto, execute: (instance, data) => sendMessageController.sendSticker(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }); } public readonly router = Router(); }