|
|
import User from '../models/User.js';
|
|
|
import bcrypt from 'bcrypt';
|
|
|
import TokenService from './TokenService.js';
|
|
|
import UserDto from '../dtos/UserDto.js';
|
|
|
import jwt from 'jsonwebtoken';
|
|
|
import config from "config";
|
|
|
import sendConfirm from '../messages/confirmEmail.js';
|
|
|
import ApiError from '../controllers/ErrorController.js';
|
|
|
class AuthService {
|
|
|
async register(user) {
|
|
|
const candidate = await User.findOne({email: user.email});
|
|
|
|
|
|
if(candidate) {
|
|
|
throw ApiError.BadRequest('Пользователь с введенным email уже существует');
|
|
|
}
|
|
|
|
|
|
const hashPassword = await bcrypt.hash(user.password, 5);
|
|
|
const createdUser = await User.create({...user, password: hashPassword});
|
|
|
await sendConfirm(createdUser.id, createdUser.email);
|
|
|
const userDto = new UserDto(createdUser);
|
|
|
const tokens = TokenService.generateTokens({...userDto});
|
|
|
await TokenService.saveToken(userDto._id, tokens.refreshToken);
|
|
|
|
|
|
return {...tokens, user: userDto};
|
|
|
}
|
|
|
|
|
|
async login(user) {
|
|
|
const getUser = await User.findOne({email: user.email});
|
|
|
|
|
|
if(!getUser) {
|
|
|
throw ApiError.BadRequest('Пользователя с введенным email не существует');
|
|
|
}
|
|
|
|
|
|
const isPasswordValid = bcrypt.compareSync(user.password , getUser.password);
|
|
|
if(!isPasswordValid) {
|
|
|
throw ApiError.BadRequest('Не верный пароль');
|
|
|
}
|
|
|
|
|
|
if(!getUser.verify) {
|
|
|
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 confirm( { id } ) {
|
|
|
const candidate = await User.findById(id);
|
|
|
|
|
|
if(!candidate) {
|
|
|
throw ApiError.BadRequest('Не верная ссылка для подтверждения аккаунта');
|
|
|
}
|
|
|
|
|
|
if(candidate.verify) {
|
|
|
throw ApiError.BadRequest('Этот аккаунт уже подтвержден');
|
|
|
}
|
|
|
|
|
|
candidate.verify = true;
|
|
|
await candidate.save();
|
|
|
|
|
|
return {message: "Аккаунт успешно подтвержден, вы можете перейти к форме авторизации"};
|
|
|
}
|
|
|
|
|
|
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(); |