import { Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcrypt'; import { UserDto } from '../users/user.dto'; import { PasswordResetTokensService } from '../users/password-reset-tokens.service'; import { MailerService } from '../mailer/mailer.service'; @Injectable() export class AuthService { constructor( private usersService: UsersService, private jwtService: JwtService, private passwordResetTokenService: PasswordResetTokensService, private mailerService: MailerService, ) {} async debugUserCreate(user: Omit) { const { username, email, passwordHash, role } = user; const result = await this.usersService.usersRepository.save({ username, email, passwordHash, role, }); return result; } async login(user: UserDto) { const payload = { ...user, sub: user.id }; const { username, email, role, id } = user; return { // eslint-disable-next-line @typescript-eslint/camelcase access_token: this.jwtService.sign(payload), user: { id, username, email, role }, }; } async validateUser(email: string, password: string) { const user = await this.usersService.findOne({ email, deletedAt: null }); if (user && (await bcrypt.compare(password, user.passwordHash))) { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { passwordHash, createdAt, updatedAt, deletedAt, version, ...result } = user; return result; } return null; } async forgotPassword(email: string) { const user = await this.usersService.findOne({ email, deletedAt: null }); if (user) { const token = await this.passwordResetTokenService.repository.save({ user, }); this.mailerService.sendResetPasswordEmail(user, token); } } async setPassword(passwordResetToken: string, passwordHash: string) { const resetToken = await this.passwordResetTokenService.findOne( { token: passwordResetToken, isUsed: false, deletedAt: null }, { relations: ['user'] }, ); if (resetToken) { const { user } = resetToken; user.passwordHash = passwordHash; resetToken.isUsed = true; const [updatedUser, t] = await Promise.all([ this.usersService.usersRepository.save(user), this.passwordResetTokenService.repository.save(resetToken), ]); return await this.login(updatedUser); } } }