import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { validateHash } from '../../common/utils'; import { type RoleType, TokenType } from '../../constants'; import { IncorrectCredentialException } from '../../exceptions'; import { ApiConfigService } from '../../shared/services/api-config.service'; import { type UserEntity } from '../user/user.entity'; import { UserService } from '../user/user.service'; import { TokenPayloadDto } from './dto/token-payload.dto'; import { type UserLoginDto } from './dto/user-login.dto'; @Injectable() export class AuthService { constructor( private jwtService: JwtService, private configService: ApiConfigService, private userService: UserService, ) {} async createAccessToken(data: { role: RoleType; userId: Uuid; }): Promise { return new TokenPayloadDto({ expiresIn: this.configService.authConfig.jwtExpirationTime, accessToken: await this.jwtService.signAsync({ userId: data.userId, type: TokenType.ACCESS_TOKEN, role: data.role, }), }); } async validateUser(userLoginDto: UserLoginDto): Promise { const user = await this.userService.findOne({ username: userLoginDto.username, }); const isPasswordValid = await validateHash( userLoginDto.password, user?.password, ); if (!isPasswordValid) { throw new IncorrectCredentialException(); } return user!; } }