Class Validator custom - PullRequest
       18

Class Validator custom

0 голосов
/ 26 апреля 2020

Привет, ребята, у меня вопрос о валидаторе классов. Я написал специальный валидатор класса, который проверяет, существует ли уже объект со свойством. Вот код

@Injectable()
@ValidatorConstraint({ async: true })
export class ExistsConstraint implements ValidatorConstraintInterface {
  constructor(@InjectConnection() private connection: Connection) {
  }

  defaultMessage(validationArguments?: ValidationArguments): string {
    return '';
  }

  validate(value: any, validationArguments?: ValidationArguments): Promise<boolean> | boolean {
    const entity = validationArguments.constraints[0];
    const isId = validationArguments.constraints[1];
    const property = validationArguments.property;

    const exists = (result) => {
      return !!result;
    };

    const repository: Repository<any> = this.connection.getRepository(entity);
    return isId ? repository.findOne(value).then(exists) : repository.findOne({[property]: value}).then(exists);
  }

}

export function Exists(entity, isObjectId?, validationOptions?: ValidationOptions) {
  return function(object: Object, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [entity, isObjectId],
      validator: ExistsConstraint,
    });
  };
}

Это полезно, когда я хочу получить пользователя с идентификатором, что-то вроде этого. зарегистрирован ли пользователь с таким адресом электронной почты при попытке создать пользователя. И вот в чем вопрос: этот валидатор возвращает true, когда сущность со свойством существует, как я могу (в некоторых ситуациях) получить! Validator. Я имею в виду, что он вернет истину, когда сущность НЕ СУЩЕСТВУЕТ? Есть ли способ достичь этого с помощью этого валидатора?

1 Ответ

0 голосов
/ 28 апреля 2020

К сожалению, такого способа нет, поэтому в их документации для каждого случая есть по 2 декоратора.

@Equals
@NotEquals
@IsEmpty
@IsNotEmpty
@IsIn
@IsNotIn

et c.

Что вы можете сделать - состоит в том, чтобы делиться базой кода, например, чтобы использовать этот класс в качестве базового класса для противоположного случая и просто инвертировать его результат из метода super.

...