From 0bd884a9fab25be1fc7149cc68c18682e7c4c90c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E7=A7=8B=E6=97=AD?= Date: Thu, 16 Feb 2023 10:40:03 +0800 Subject: [PATCH] login & register --- src/auth/auth.controller.ts | 4 +- src/auth/auth.module.ts | 3 +- src/auth/auth.service.ts | 58 +++++-------------------- src/auth/models/token.model.ts | 8 +--- src/users/entities/user.entity.ts | 7 +++ src/{auth => users}/password.service.ts | 0 src/users/users.module.ts | 5 ++- src/users/users.service.ts | 34 ++++++++++++++- 8 files changed, 58 insertions(+), 61 deletions(-) rename src/{auth => users}/password.service.ts (100%) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index a7b0d34..7edd377 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -9,9 +9,9 @@ import { LoginInputDto } from './dto/login-input.dto' export class AuthController { constructor(private readonly authService: AuthService) {} - @Post('api/signup') + @Post('api/register') async register(@Body() userData: CreateUserDto) { - return this.authService.createUser(userData) + return this.authService.register(userData) } @Post('api/login') diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 1e0596b..ea8f787 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -2,12 +2,11 @@ import { Module } from '@nestjs/common' import { AuthService } from './auth.service' import { AuthController } from './auth.controller' import { UsersModule } from 'src/users/users.module' -import { PasswordService } from './password.service' import { JwtService } from '@nestjs/jwt' @Module({ controllers: [AuthController], - providers: [AuthService, PasswordService, JwtService], + providers: [AuthService, JwtService], imports: [UsersModule], }) export class AuthModule {} diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 4ac0b4b..0b1c219 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,47 +1,26 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common' -import { PrismaService } from 'nestjs-prisma' -import { Prisma } from '@prisma/client' -import { PasswordService } from './password.service' -import { Token, UserToken } from './models/token.model' +import { Injectable, BadRequestException } from '@nestjs/common' +import { PasswordService } from 'src/users/password.service' +import { Token } from './models/token.model' import { JwtService } from '@nestjs/jwt' import { ConfigService } from '@nestjs/config' - +import { UsersService } from 'src/users/users.service' +import { CreateUserDto } from 'src/users/dto/create-user.dto' @Injectable() export class AuthService { constructor( - private prisma: PrismaService, private passwordService: PasswordService, private jwtService: JwtService, private configService: ConfigService, + private userService: UsersService, ) {} - async createUser(payload: Prisma.UserCreateInput): Promise { - const hashedPassword = await this.passwordService.hashPassword( - payload.password, - ) - const user = await this.prisma.user.create({ - data: { - ...payload, - password: hashedPassword, - }, - }) - - return { - ...this.generateTokens({ userId: user.id }), - ...this.exclude(user, ['password']), - } + async register(payload: CreateUserDto) { + const user = await this.userService.createUser(payload) + return this.generateTokens({ userId: user.id }) } - async login(email: string, password: string): Promise { - const user = await this.prisma.user.findUnique({ where: { email } }) - - if (!user) { - throw new NotFoundException(`No user found for email: ${email}`) - } + async login(email: string, password: string) { + const user = await this.userService.findUser({ email }) const passwordValid = await this.passwordService.validatePassword( password, @@ -52,20 +31,7 @@ export class AuthService { throw new BadRequestException('Invalid password') } - return { - ...this.generateTokens({ userId: user.id }), - ...this.exclude(user, ['password']), - } - } - - private exclude( - user: User, - keys: Key[], - ): Omit { - for (const key of keys) { - delete user[key] - } - return user + return this.generateTokens({ userId: user.id }) } private generateTokens(payload: { userId: string }): Token { diff --git a/src/auth/models/token.model.ts b/src/auth/models/token.model.ts index 20dff1f..5f3fd81 100644 --- a/src/auth/models/token.model.ts +++ b/src/auth/models/token.model.ts @@ -1,6 +1,5 @@ import '@nestjs/mapped-types' -import { IntersectionType, ApiProperty, OmitType } from '@nestjs/swagger' -import { UserEntity } from 'src/users/entities/user.entity' +import { ApiProperty } from '@nestjs/swagger' export class Token { @ApiProperty() @@ -8,8 +7,3 @@ export class Token { @ApiProperty() refreshToken: string } - -export class UserToken extends IntersectionType( - Token, - OmitType(UserEntity, ['password']), -) {} diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 6d5bc22..086c634 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,10 +1,17 @@ import { User } from '@prisma/client' +import { ApiProperty } from '@nestjs/swagger' export class UserEntity implements User { + @ApiProperty() id: string + @ApiProperty() email: string + @ApiProperty() username: string | null + @ApiProperty() password: string + @ApiProperty() createdAt: Date + @ApiProperty() updatedAt: Date } diff --git a/src/auth/password.service.ts b/src/users/password.service.ts similarity index 100% rename from src/auth/password.service.ts rename to src/users/password.service.ts diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 2ca0e52..68ad0e6 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common' import { UsersService } from './users.service' import { UsersController } from './users.controller' +import { PasswordService } from './password.service' @Module({ controllers: [UsersController], - providers: [UsersService], - exports: [UsersService], + providers: [UsersService, PasswordService], + exports: [UsersService, PasswordService], }) export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 8f6f0b6..dfd2368 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,7 +1,37 @@ -import { Injectable } from '@nestjs/common' +import { Injectable, NotFoundException } from '@nestjs/common' import { PrismaService } from 'nestjs-prisma' +import { CreateUserDto } from './dto/create-user.dto' +import { PasswordService } from './password.service' +import { Prisma } from '@prisma/client' @Injectable() export class UsersService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private passwordService: PasswordService, + ) {} + + async findUser(where: Prisma.UserWhereUniqueInput) { + const user = await this.prisma.user.findUnique({ + where, + }) + if (!user) { + throw new NotFoundException(`No user found`) + } + return user + } + + async createUser(payload: CreateUserDto) { + const hashedPassword = await this.passwordService.hashPassword( + payload.password, + ) + const user = await this.prisma.user.create({ + data: { + ...payload, + password: hashedPassword, + }, + }) + delete user.password + return user + } }