UNPKG

generator-nest-js-boilerplate

Version:

This generator will help you to build your own Nest.js Mongodb API using TypeScript 4

118 lines (97 loc) 3.37 kB
import * as bcrypt from 'bcryptjs'; import { Injectable, NotFoundException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { Types } from 'mongoose'; import { ConfigService } from '@nestjs/config'; import UsersRepository from '@v1/users/users.repository'; import { UserDocument } from '@v1/users/schemas/users.schema'; import { UserInterface } from '@v1/users/interfaces/user.interface'; import { DecodedUser } from './interfaces/decoded-user.interface'; import JwtTokensDto from './dto/jwt-tokens.dto'; import { LoginPayload } from './interfaces/login-payload.interface'; import authConstants from './auth-constants'; import AuthRepository from './auth.repository'; @Injectable() export default class AuthService { constructor( private readonly jwtService: JwtService, private readonly usersRepository: UsersRepository, private readonly authRepository: AuthRepository, private readonly configService: ConfigService, ) { } public async validateUser( email: string, password: string, ): Promise<null | UserInterface> { const user = await this.usersRepository.getVerifiedUserByEmail(email) as UserDocument; if (!user) { throw new NotFoundException('The item does not exist'); } const passwordCompared = await bcrypt.compare(password, user.password); if (passwordCompared) { return { _id: user._id, email: user.email, roles: user.roles, }; } return null; } public async login(data: LoginPayload): Promise<JwtTokensDto> { const payload: LoginPayload = { _id: data._id, email: data.email, roles: data.roles, }; const accessToken = this.jwtService.sign(payload, { expiresIn: authConstants.jwt.expirationTime.accessToken, secret: this.configService.get<string>('ACCESS_TOKEN') || '<%= config.accessTokenSecret %>', }); const refreshToken = this.jwtService.sign(payload, { expiresIn: authConstants.jwt.expirationTime.refreshToken, secret: this.configService.get<string>('REFRESH_TOKEN') || '<%= config.refreshTokenSecret %>', }); await this.authRepository.addRefreshToken( payload.email as string, refreshToken, ); return { accessToken, refreshToken, }; } public getRefreshTokenByEmail(email: string): Promise<string | null> { return this.authRepository.getToken(email); } public deleteTokenByEmail(email: string): Promise<number> { return this.authRepository.removeToken(email); } public deleteAllTokens(): Promise<string> { return this.authRepository.removeAllTokens(); } public createVerifyToken(id: Types.ObjectId): string { return this.jwtService.sign( { id }, { expiresIn: authConstants.jwt.expirationTime.accessToken, secret: this.configService.get<string>('ACCESS_TOKEN') || '<%= config.accessTokenSecret %>', }, ); } public verifyEmailVerToken(token: string, secret: string) { return this.jwtService.verifyAsync(token, { secret }); } public async verifyToken( token: string, secret: string, ): Promise<DecodedUser | null> { try { const user = (await this.jwtService.verifyAsync(token, { secret, })) as DecodedUser | null; return user; } catch (error) { return null; } } }