import { RouterBroker } from '@api/abstract/abstract.router'; import { SendAudioDto, SendButtonsDto, SendContactDto, SendListDto, SendLocationDto, SendMediaDto, SendPollDto, SendPtvDto, SendReactionDto, SendStatusDto, SendStickerDto, SendTemplateDto, SendTextDto, } from '@api/dto/sendMessage.dto'; import { sendMessageController } from '@api/server.module'; import { audioMessageSchema, buttonsMessageSchema, contactMessageSchema, listMessageSchema, locationMessageSchema, mediaMessageSchema, pollMessageSchema, ptvMessageSchema, reactionMessageSchema, statusMessageSchema, stickerMessageSchema, templateMessageSchema, textMessageSchema, } from '@validate/validate.schema'; import { RequestHandler, Router } from 'express'; import multer from 'multer'; import { HttpStatus } from './index.router'; const upload = multer({ storage: multer.memoryStorage() }); export class MessageRouter extends RouterBroker { constructor(...guards: RequestHandler[]) { super(); this.router .post(this.routerPath('sendTemplate'), ...guards, async (req, res) => { const response = await this.dataValidate({ request: req, schema: templateMessageSchema, ClassRef: SendTemplateDto, execute: (instance, data) => sendMessageController.sendTemplate(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendText'), ...guards, async (req, res) => { 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, upload.single('file'), async (req, res) => { const bodyData = req.body; const response = await this.dataValidate({ request: req, schema: mediaMessageSchema, ClassRef: SendMediaDto, execute: (instance) => sendMessageController.sendMedia(instance, bodyData, req.file as any), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendPtv'), ...guards, upload.single('file'), async (req, res) => { const bodyData = req.body; const response = await this.dataValidate({ request: req, schema: ptvMessageSchema, ClassRef: SendPtvDto, execute: (instance) => sendMessageController.sendPtv(instance, bodyData, req.file as any), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendWhatsAppAudio'), ...guards, upload.single('file'), async (req, res) => { const bodyData = req.body; const response = await this.dataValidate({ request: req, schema: audioMessageSchema, ClassRef: SendMediaDto, execute: (instance) => sendMessageController.sendWhatsAppAudio(instance, bodyData, req.file as any), }); return res.status(HttpStatus.CREATED).json(response); }) // TODO: Revisar funcionamento do envio de Status .post(this.routerPath('sendStatus'), ...guards, upload.single('file'), async (req, res) => { const bodyData = req.body; const response = await this.dataValidate({ request: req, schema: statusMessageSchema, ClassRef: SendStatusDto, execute: (instance) => sendMessageController.sendStatus(instance, bodyData, req.file as any), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendSticker'), ...guards, upload.single('file'), async (req, res) => { const bodyData = req.body; const response = await this.dataValidate({ request: req, schema: stickerMessageSchema, ClassRef: SendStickerDto, execute: (instance) => sendMessageController.sendSticker(instance, bodyData, req.file as any), }); return res.status(HttpStatus.CREATED).json(response); }) .post(this.routerPath('sendLocation'), ...guards, async (req, res) => { 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('sendContact'), ...guards, async (req, res) => { 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) => { 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) => { 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('sendList'), ...guards, async (req, res) => { 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('sendButtons'), ...guards, async (req, res) => { const response = await this.dataValidate({ request: req, schema: buttonsMessageSchema, ClassRef: SendButtonsDto, execute: (instance, data) => sendMessageController.sendButtons(instance, data), }); return res.status(HttpStatus.CREATED).json(response); }); } public readonly router: Router = Router(); }