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
text/typescript
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';
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;
}
}
}