Использовать репозиторий в ограничении? - PullRequest
0 голосов
/ 08 февраля 2019

Преамбула


В настоящее время я работаю с коллегой по проекту NestJS, и цель этого проекта - создать систему голосования, то есть создать голосование, участвовать в нем, получать результаты...

Вы можете более подробно взглянуть на мой репозиторий github .

Проблема


В текущем состоянии в ядре / объектахмы не можем иметь 2 пользователей в базе данных с одинаковыми именем и фамилией: (firstname && lastname) из-за уникальных ограничений, наложенных на таблицу благодаря typeorm.

Но проблема в том, что в настоящее время create-user.dto.ts непроверьте, может ли пользователь быть вставлен в таблицу, или нет, проверив, существует ли уже пользователь в таблице с его комбинацией имени / фамилии.

Что я хочу сделать


В настоящее время в нашей системе мы используем class-validator во всех классах dtos для проверки параметров из http-запросов.Поэтому мы, естественно, изучили документацию для создания настраиваемого ограничения и декоратора, который будет проверять, находится ли комбинация имя / фамилия в настоящее время в базе данных, с помощью репозитория пользователя.1028 *

import {
    ValidatorConstraint,
    ValidatorConstraintInterface,
    ValidationArguments,
} from 'class-validator';

import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

import { User } from '../../../core/entities/user.entity';
import { CreateUserDto } from '../dto/create-user.dto';

// Constraint
@ValidatorConstraint({ async: true })
export class UniqueUserConstraint implements ValidatorConstraintInterface {
    constructor(
        @InjectRepository(User)
        private readonly userRepository: Repository<User>,
    ) { }

    async validate(param: any, args: ValidationArguments) {
        const user = args.object as CreateUserDto;
        return await this.userRepository.findOne({
            firstName: user.firstName,
            lastName: user.lastName,
        }).then(find => {
            if (find) return false;
            return true;
        });
    }
}

Дело в том, что мы не можем получить доступ к userRepository, так как это undefined (потому что конструктор не вызывается?) И мы не можем поместить @InjectRepository(User) в функцию validateпоскольку наш класс реализует validate.

Так что здесь мы не знаем, как заставить вещи работать.

Ожидаемое поведение


Ожидаемое поведение - я могу поставить свой декоратор UniqueUser насвойство my create-user.dto и выдает ошибку, как и другие ограничения, когда комбинация имени и фамилии уже существует в базе данных.

1 Ответ

0 голосов
/ 08 февраля 2019

Я думаю, вы немного усложняете это.Было бы лучше просто попытаться вставить, а затем поймать ошибку и сообщить о ней должным образом.В противном случае вы выполняете ненужные операции с вашей базой данных, один раз для первой проверки, а затем снова для вставки.В зависимости от трафика вашего приложения вы все равно можете столкнуться с состоянием гонки, когда вы заранее проверили другой запрос, вызвавший столкновение.

...