import User from '../models/User.js'; import bcrypt from 'bcrypt'; import TokenService from './TokenService.js'; import UserDto from '../dtos/UserDto.js'; import ApiError from '../controllers/ErrorController.js'; class AuthService { async registration({login, password}) { const candidate = await User.findOne({login}); if(candidate) { throw ApiError.BadRequest('Пользователь с введенным логином уже существует'); } const hashPassword = await bcrypt.hash(password, 5); const createdUser = await User.create({login, password: hashPassword }); const userDto = new UserDto(createdUser); return {user: userDto}; } async login({login, password}) { const getUser = await User.findOne({login}); if(!getUser) { throw ApiError.BadRequest('Пользователя с введенным логином не существует'); } const isPasswordValid = bcrypt.compareSync(password, getUser.password); if(!isPasswordValid) { throw ApiError.BadRequest('Не верный пароль'); } const userDto = new UserDto(getUser); const tokens = TokenService.generateTokens({...userDto}); await TokenService.saveToken(userDto._id, tokens.refreshToken); return {...tokens, user: userDto}; } async logout(refreshToken) { const token = await TokenService.removeToken(refreshToken); return token; } async refresh(refreshToken) { if(!refreshToken) { throw ApiError.UnauthorizedError(); } const user = TokenService.validateRefreshToken(refreshToken); const getToken = await TokenService.findToken(refreshToken); if(!user || !getToken ) { throw ApiError.UnauthorizedError(); } const getUser = await User.findById(user._id) const userDto = new UserDto(getUser); const tokens = TokenService.generateTokens({...userDto}); await TokenService.saveToken(userDto._id, tokens.refreshToken); return {...tokens, user: userDto}; } } export default new AuthService();