| import 'express-async-errors'; |
|
|
| import { GetParticipant, GroupInvite } from '@api/dto/group.dto'; |
| import { InstanceDto } from '@api/dto/instance.dto'; |
| import { Logger } from '@config/logger.config'; |
| import { BadRequestException } from '@exceptions'; |
| import { Request } from 'express'; |
| import { JSONSchema7 } from 'json-schema'; |
| import { validate } from 'jsonschema'; |
|
|
| type DataValidate<T> = { |
| request: Request; |
| schema: JSONSchema7; |
| ClassRef: any; |
| execute: (instance: InstanceDto, data: T) => Promise<any>; |
| }; |
|
|
| const logger = new Logger('Validate'); |
|
|
| export abstract class RouterBroker { |
| constructor() {} |
| public routerPath(path: string, param = true) { |
| let route = '/' + path; |
| param ? (route += '/:instanceName') : null; |
|
|
| return route; |
| } |
|
|
| public async dataValidate<T>(args: DataValidate<T>) { |
| const { request, schema, ClassRef, execute } = args; |
|
|
| const ref = new ClassRef(); |
| const body = request.body; |
| const instance = request.params as unknown as InstanceDto; |
|
|
| if (request?.query && Object.keys(request.query).length > 0) { |
| Object.assign(instance, request.query); |
| } |
|
|
| if (request.originalUrl.includes('/instance/create')) { |
| Object.assign(instance, body); |
| } |
|
|
| Object.assign(ref, body); |
|
|
| const v = schema ? validate(ref, schema) : { valid: true, errors: [] }; |
|
|
| if (!v.valid) { |
| const message: any[] = v.errors.map(({ stack, schema }) => { |
| let message: string; |
| if (schema['description']) { |
| message = schema['description']; |
| } else { |
| message = stack.replace('instance.', ''); |
| } |
| return message; |
| }); |
| logger.error(message); |
| throw new BadRequestException(message); |
| } |
|
|
| return await execute(instance, ref); |
| } |
|
|
| public async groupNoValidate<T>(args: DataValidate<T>) { |
| const { request, ClassRef, schema, execute } = args; |
|
|
| const instance = request.params as unknown as InstanceDto; |
|
|
| const ref = new ClassRef(); |
|
|
| Object.assign(ref, request.body); |
|
|
| const v = validate(ref, schema); |
|
|
| if (!v.valid) { |
| const message: any[] = v.errors.map(({ property, stack, schema }) => { |
| let message: string; |
| if (schema['description']) { |
| message = schema['description']; |
| } else { |
| message = stack.replace('instance.', ''); |
| } |
| return { |
| property: property.replace('instance.', ''), |
| message, |
| }; |
| }); |
| logger.error([...message]); |
| throw new BadRequestException(...message); |
| } |
|
|
| return await execute(instance, ref); |
| } |
|
|
| public async groupValidate<T>(args: DataValidate<T>) { |
| const { request, ClassRef, schema, execute } = args; |
|
|
| const instance = request.params as unknown as InstanceDto; |
| const body = request.body; |
|
|
| let groupJid = body?.groupJid; |
|
|
| if (!groupJid) { |
| if (request.query?.groupJid) { |
| groupJid = request.query.groupJid; |
| } else { |
| throw new BadRequestException('The group id needs to be informed in the query', 'ex: "groupJid=120362@g.us"'); |
| } |
| } |
|
|
| if (!groupJid.endsWith('@g.us')) { |
| groupJid = groupJid + '@g.us'; |
| } |
|
|
| Object.assign(body, { |
| groupJid: groupJid, |
| }); |
|
|
| const ref = new ClassRef(); |
|
|
| Object.assign(ref, body); |
|
|
| const v = validate(ref, schema); |
|
|
| if (!v.valid) { |
| const message: any[] = v.errors.map(({ property, stack, schema }) => { |
| let message: string; |
| if (schema['description']) { |
| message = schema['description']; |
| } else { |
| message = stack.replace('instance.', ''); |
| } |
| return { |
| property: property.replace('instance.', ''), |
| message, |
| }; |
| }); |
| logger.error([...message]); |
| throw new BadRequestException(...message); |
| } |
|
|
| return await execute(instance, ref); |
| } |
|
|
| public async inviteCodeValidate<T>(args: DataValidate<T>) { |
| const { request, ClassRef, schema, execute } = args; |
|
|
| const inviteCode = request.query as unknown as GroupInvite; |
|
|
| if (!inviteCode?.inviteCode) { |
| throw new BadRequestException( |
| 'The group invite code id needs to be informed in the query', |
| 'ex: "inviteCode=F1EX5QZxO181L3TMVP31gY" (Obtained from group join link)', |
| ); |
| } |
|
|
| const instance = request.params as unknown as InstanceDto; |
| const body = request.body; |
|
|
| const ref = new ClassRef(); |
|
|
| Object.assign(body, inviteCode); |
| Object.assign(ref, body); |
|
|
| const v = validate(ref, schema); |
|
|
| if (!v.valid) { |
| const message: any[] = v.errors.map(({ property, stack, schema }) => { |
| let message: string; |
| if (schema['description']) { |
| message = schema['description']; |
| } else { |
| message = stack.replace('instance.', ''); |
| } |
| return { |
| property: property.replace('instance.', ''), |
| message, |
| }; |
| }); |
| logger.error([...message]); |
| throw new BadRequestException(...message); |
| } |
|
|
| return await execute(instance, ref); |
| } |
|
|
| public async getParticipantsValidate<T>(args: DataValidate<T>) { |
| const { request, ClassRef, schema, execute } = args; |
|
|
| const getParticipants = request.query as unknown as GetParticipant; |
|
|
| if (!getParticipants?.getParticipants) { |
| throw new BadRequestException('The getParticipants needs to be informed in the query'); |
| } |
|
|
| const instance = request.params as unknown as InstanceDto; |
| const body = request.body; |
|
|
| const ref = new ClassRef(); |
|
|
| Object.assign(body, getParticipants); |
| Object.assign(ref, body); |
|
|
| const v = validate(ref, schema); |
|
|
| if (!v.valid) { |
| const message: any[] = v.errors.map(({ property, stack, schema }) => { |
| let message: string; |
| if (schema['description']) { |
| message = schema['description']; |
| } else { |
| message = stack.replace('instance.', ''); |
| } |
| return { |
| property: property.replace('instance.', ''), |
| message, |
| }; |
| }); |
| logger.error([...message]); |
| throw new BadRequestException(...message); |
| } |
|
|
| return await execute(instance, ref); |
| } |
| } |
|
|