/* eslint-disable prettier/prettier */ import { Injectable, UnauthorizedException } from '@nestjs/common' import { JwtService } from '@nestjs/jwt' import { Prisma, User } from '@prisma/client' import { UserDTO } from 'src/user/dtos/user.dto' import { UserService } from '../user/user.service' import { jwtConstants } from './guards/jwt.constants' import * as bcrypt from 'bcrypt' @Injectable() export class AuthService { constructor( private userService: UserService, private jwtService: JwtService ) {} //password 암호화 async getEcryptedPassword(password: string): Promise { // return await bcrypt // .hash(password, jwtConstants.password_saltorRounds) // .catch((e) => { // throw new Error('암호화 실패' + e) // }) return password } //app.controller.ts에서 AuthGuard('local') 또는 AuthGuard('jwt')용 async validateUser(where: Prisma.UserWhereInput): Promise { return await this.userService.fetchOne(where) } async login(user: User): Promise { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { password, ...result } = user return (result['access_token'] = await this.getAccessToken(user)) } async register(data: UserDTO): Promise { data.refresh_token = await this.getRefreshToken(data) data.password = await this.getEcryptedPassword(data.password) return await this.userService.add(data) } //Access Token 재발행 async reload(refresh_token): Promise { const user = await this.userService.fetchOne({ refresh_token: refresh_token }) return await this.getAccessToken(user) } //Access Token 및 refresh Token 재발행 async recreate(user: User): Promise { const tokens = await this.getTokens(user) await this.userService.update({ where: { id: user.id }, data: { refresh_token: tokens.refresh_token } }) return tokens } async getAccessToken(data: UserDTO): Promise { const token = await this.jwtService.sign( { email: data.email, name: data.name }, { secret: jwtConstants.access_secret, expiresIn: jwtConstants.access_expiresIn } ) return { token: token, expiresIn: jwtConstants.access_expiresIn } } async getRefreshToken(data: UserDTO): Promise { const token = await this.jwtService.sign( { email: data.email, name: data.name }, { secret: jwtConstants.access_secret, expiresIn: jwtConstants.refresh_expiresIn } ) return { token: token, expiresIn: jwtConstants.refresh_expiresIn } } async getTokens(data: UserDTO): Promise { return { access_token: await this.getAccessToken(data), refresh_token: await this.getRefreshToken(data) } } }