axrising
@axrising

Как зарефакторить данный код?

Как можно предотвратить дублирования кода с ошибкой?
Буду благодарен за помощь

async login(email: string, password: string) {
    const user = await User.findOne({ where: { email } })

    if (!user) {
      throw ApiError.BadRequest('Your email or password was entered incorrectly.')
    }
    const isPassEquals = await bcrypt.compare(password, user.password)
    if (!isPassEquals) {
      throw ApiError.BadRequest('Your email or password was entered incorrectly.')
    }
    const userDto = new UserDto(user)
    const tokens = tokenService.generateTokens(userDto.id, userDto.email)
    await tokenService.saveToken(userDto.id, tokens.refreshToken)
    return { ...tokens, user: userDto }
  }
  • Вопрос задан
  • 91 просмотр
Решения вопроса 2
vabka
@vabka
Токсичный шарпист
Например можно вынести код по валидации в отдельную функцию:
async findUserByEmailAndPassword(email: string, password: string): User {
    const user = await User.findOne({ where: {email} });
    if(user) {
        const passwordValid = await bcrypt.compare(password, user.password);
        if(passwordValid)
            return user;
    }
    return null;
}

И потом в месте использования:
const user = await findUserByEmailAndPassword(email, password);
if(user === null)
  throw ApiError.BadRequest('Your email or password was entered incorrectly.');


Ну или можно await bcrypt.compare(password, user.password) затащить в if, но мне такой вариант не очень нравится.
Ответ написан
@AntonSazonov
async login(email: string, password: string) {
    const user = await User.findOne({ where: { email } })

    var isPassEquals = false;
    if (user) {
    	isPassEquals = await bcrypt.compare(password, user.password)
    }

    if (!user || !isPassEquals) {
      throw ApiError.BadRequest('Your email or password was entered incorrectly.')
    }
    const userDto = new UserDto(user)
    const tokens = tokenService.generateTokens(userDto.id, userDto.email)
    await tokenService.saveToken(userDto.id, tokens.refreshToken)
    return { ...tokens, user: userDto }
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы