mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-07-14 01:41:24 -06:00
227 lines
6.0 KiB
TypeScript
227 lines
6.0 KiB
TypeScript
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);
|
|
}
|
|
}
|