All files / auth auth.service.ts

100% Statements 65/65
75% Branches 9/12
100% Functions 4/4
100% Lines 65/65

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 651x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 4x 1x 1x 1x 1x 1x 4x 4x 4x 4x 4x 1x 1x 3x 3x 2x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 2x 1x 1x 1x 1x 1x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x
import { Inject, Injectable, forwardRef } from "@nestjs/common";
import { UserService, UserException } from "src/user/user.service";
import * as bcrypt from "bcrypt";
import { JwtService } from "@nestjs/jwt";
import { ConfigService } from "@nestjs/config";
import { instanceToPlain } from "class-transformer";
 
type AuthError =
    | "WRONG CREDENTIALS";
 
export class AuthException extends Error {
    name: AuthError;
 
    constructor(name: AuthError) {
        super();
        this.name = name;
    }
}
 
@Injectable()
export class AuthService {
    constructor(
        @Inject(forwardRef(() => UserService))
        private userService: UserService,
        private jwtService: JwtService,
        private configService: ConfigService,
    ) { }
 
    async signIn(email: string, password: string) {
        try {
            const user = await this.userService.findOneByEmail(email);
            
            if (!await bcrypt.compare(password, user.hashPassword)) {
                throw new AuthException("WRONG CREDENTIALS");
            }
            
            const payload = { sub: user.username };
 
            return {
                token: await this.jwtService.signAsync(payload, {
                    secret: this.configService.get("JWT_SECRET")
                }),
                user: instanceToPlain(user),
            };
        } catch (e) {
            if (e instanceof UserException) {
                throw new AuthException("WRONG CREDENTIALS");
            }
 
            throw e;
        }
    }
 
    async signUp(username: string, password: string) {
        const hash = await bcrypt.hash(password, 10);
        const payload = { sub: username };
 
        return {
            hash,
            jwt: await this.jwtService.signAsync(payload, {
                secret: this.configService.get("JWT_SECRET"),
            }),
        };
    }
}