import { sign } from 'jsonwebtoken'; import { injectable, inject } from 'tsyringe'; import authConfig from '@config/auth'; import AppError from '@shared/errors/AppError'; import User from '@modules/users/infra/typeorm/entities/User'; import IUsersRepository from '@modules/users/repositories/IUsersRepository'; import IHashProvider from '@modules/users/providers/HashProvider/models/IHashProvider'; interface IRequest { email: string; password: string; } interface IResponse { user: User; token: string; } @injectable() class AuthenticateUserService { private usersRepository: IUsersRepository; private hashProvider: IHashProvider; constructor( @inject('UsersRepository') usersRepository: IUsersRepository, @inject('HashProvider') hashProvider: IHashProvider, ) { this.usersRepository = usersRepository; this.hashProvider = hashProvider; } public async execute({ email, password }: IRequest): Promise<IResponse> { const user = await this.usersRepository.findByEmail(email); if (!user) { throw new AppError('Incorrect Email/Password validation.', 401); } // user.password = senha criptografada if (!(await this.hashProvider.compareHash(password, user.password))) { throw new AppError('Incorrect Email/Password validation.', 401); } const token = sign({}, authConfig.secret, { subject: user.id, expiresIn: authConfig.expiresIn, }); return { user, token, }; } } export default AuthenticateUserService;