@Ivan1331

Controller-Service-Repository паттерн, где должна происходить проверка на дубликат?

Вникаю в паттерн Controller-Service-Repository и пишу простенькое API на node. У меня есть регистрация пользователя и мне нужно проверить на уникальность никнейма и почты. Вопрос - в каком слое должна быть эта проверка?
Насколько я понял, вся бизнес логика должна быть в сервисе, и код должен выглядеть примерно так:
class UserService {
    createUser = async (userData) => {

        const isNicknameDuplicate = await userRepository.checkNicnameDuplicate(userData.nickname);
        const isMailDuplicate = await userRepository.checkMailDuplicate(userData.email);

        if (isNicknameDuplicate) {
            return `Nickname ${userData.nickname} already exists`;
        }

        if (isMailDuplicate) {
            return `User with email ${userData.email} already exists`
        }
        
        return await userRepository.createUser(userData);
    }
}

Или же проверку делать на уровне контроллера?
  • Вопрос задан
  • 854 просмотра
Решения вопроса 1
GeorgeGeorge
@GeorgeGeorge
Студент
Мне кажется это должен делать специальный middleware.

Example

class UsersMiddleware {
	async validateRequiredUserBodyFields(
		req: Request,
		res: Response,
		next: NextFunction
	) {
		if (req.body && req.body.email) {
			next();
		} else {
			res.status(400).send({
				error: `Missing required fields email`,
			});
		}
	}

	async validateSameEmailDoesntExist(
		req: Request,
		res: Response,
		next: NextFunction
	) {
		const user = await userService.getUserByEmail(req.body.email);
		if (user) {
			res.status(400).send({ error: `User email already exists` });
		} else {
			next();
		}
	}

	async validateSameEmailBelongToSameUser(
		req: Request,
		res: Response,
		next: NextFunction
	) {
		const user = await userService.getUserByEmail(req.body.email);
		if (user && user.id === +req.params.userId) {
			next();
		} else {
			res.status(400).send({ error: `Invalid email` });
		}
	}

	validatePatchEmail = async (
		req: Request,
		res: Response,
		next: NextFunction
	) => {
		if (req.body.email) {
			log("Validating email", req.body.email);

			this.validateSameEmailBelongToSameUser(req, res, next);
		} else {
			next();
		}
	};

	async validateUserExists(req: Request, res: Response, next: NextFunction) {
		const user = await userService.readById(req.params.userId);
		if (user) {
			next();
		} else {
			res.status(404).send({
				error: `User ${req.params.userId} not found`,
			});
		}
	}

	async extractUserId(req: Request, res: Response, next: NextFunction) {
		req.body.id = req.params.userId;
		next();
	}
}
export default new UsersMiddleware();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы