NestJS - Проверка тела условно, на основе одного свойства

Я пытаюсь найти хороший способ проверить тело с помощью DTO (используя блестящий class-validator а также class-transformer библиотеки). Это работает очень хорошо, даже для вложенных структур, но в моем случае я бы хотел, чтобы свойство body основывалось на некоторых условиях.

Пример, который, вероятно, поможет понять:

Давайте представим, что мое тело всегда должно иметь selectedCategory, Исходя из этого поля, содержимое может быть из категории 1, которая содержит prop1 ИЛИ из категории 2, которая содержит prop2,

Я не хочу допустить нулевое значение для них обоих, я действительно хочу иметь либо prop1 определяется или prop2 на основе selectedCategory,

Я думаю, что я мог бы использовать канал, но тогда как я могу указать правильный DTO для использования?

Я создал "базовый" класс со всеми общими свойствами и несколькими другими классами, которые наследуются от него.

Я мог бы создать экземпляр трубы вручную на основе свойства selectedCategoryэто было бы идеально, но я понятия не имею, что передать в качестве второго аргумента канала (метаданных).

Спасибо за вашу помощь.

2 ответа

Решение

Вы пробовали использовать группы? Вместо нескольких DTO, вы просто создаете один DTO. Каждое свойство присваивается одной или нескольким группам:

@Min(12, {groups: ['registration', 'update']})
age: number;
@Length(2, 20, {groups: ['registration']})
name: string;

Затем вы можете условно передать группы преобразователю / валидатору класса:

@Injectable()
export class ConditionalValidationPipe implements PipeTransform {
  async transform(entity: any, metadata: ArgumentMetadata) {
    // Dynamically determine the groups
    const groups = [];
    if (entity.selectedCategory === 1) {
      groups.push('registration');
    }

    // Transform to class with groups
    const entityClass = plainToClass(EntityDto, entity, { groups })

    // Validate with groups
    const errors = await validate(entityClass, { groups });
    if (errors.length > 0) {
      throw this.createError(errors);
    }
    return entityClass;
  }
}

Вы пробовали инструкцию ValidateIf ?

У вас может быть несколько проверок для props1 или же props2 и применять их, если selectedCategory соответственно "категория 1" или "категория 2".

Другие вопросы по тегам