import { ValidationArguments, ValidatorConstraintInterface } from 'class-validator'; import { Connection, EntitySchema, FindConditions, ObjectType } from 'typeorm'; interface UniqueValidationArguments extends ValidationArguments { constraints: [ ObjectType | EntitySchema | string, ((validationArguments: ValidationArguments) => FindConditions) | keyof E, ]; } export abstract class UniqueValidator implements ValidatorConstraintInterface { protected constructor(protected readonly connection: Connection) {} public async validate(value: string, args: UniqueValidationArguments) { const [EntityClass, findCondition = args.property] = args.constraints; return ( (await this.connection.getRepository(EntityClass).count({ where: typeof findCondition === 'function' ? findCondition(args) : { [findCondition || args.property]: value, }, })) <= 0 ); } public defaultMessage(args: ValidationArguments) { const [EntityClass] = args.constraints; const entity = EntityClass.name || 'Entity'; return `${entity} with the same '${args.property}' already exist`; } }