import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, Validator, } from 'class-validator'; // check if input is null or valid uuid @ValidatorConstraint({ name: 'uuid', async: true }) export class Uuid implements ValidatorConstraintInterface { validate(uuid: string, args: ValidationArguments) { const validator = new Validator(); return validator.isUUID(uuid, '4') || uuid == null; // for async validations you must return a Promise<boolean> here } defaultMessage(args: ValidationArguments) { return 'Not valid uuid'; } } // checks if role is valid @ValidatorConstraint({ name: 'roleValidation', async: true }) export class RoleValidation implements ValidatorConstraintInterface { validate(role: string, args: ValidationArguments) { const validRoles = ['admin', 'soldier', 'factionleader']; return validRoles.includes(role); } defaultMessage(args: ValidationArguments) { return 'Not valid uuid'; } } // checks for valid JSON for center @ValidatorConstraint({ name: 'centerJSON', async: true }) export class CenterJSON implements ValidatorConstraintInterface { validate(center: JSON, args: ValidationArguments) { const validator = new Validator(); return ( validator.isNumber(center['lat']) && validator.isNumber(center['lng']) && validator.min(center['lat'], -90) && validator.max(center['lat'], 90) && validator.min(center['lng'], -180) && validator.max(center['lng'], 180) ); } defaultMessage(args: ValidationArguments) { return 'Error with center JSON'; } }