changeEmail

This commit is contained in:
秦秋旭 2023-02-23 23:01:51 +08:00
parent 5bbefbcf4a
commit a00990b6d6
5 changed files with 45 additions and 9 deletions

View File

@ -10,6 +10,7 @@ import { MailerService } from '@nestjs-modules/mailer'
import { JwtService } from '@nestjs/jwt' import { JwtService } from '@nestjs/jwt'
import { PrismaService } from 'nestjs-prisma' import { PrismaService } from 'nestjs-prisma'
import { EmailSendDto, EmailScene } from 'src/email/dto/email.dto' import { EmailSendDto, EmailScene } from 'src/email/dto/email.dto'
import { UserEntity } from 'src/users/entities/user.entity'
@Injectable() @Injectable()
export class EmailService { export class EmailService {
@ -28,7 +29,7 @@ export class EmailService {
) {} ) {}
async sendEmailToken(email: string, scene: EmailScene) { async sendEmailToken(email: string, scene: EmailScene) {
const user = await this.prismaService.user.findUnique({ const user: UserEntity | null = await this.prismaService.user.findUnique({
where: { email }, where: { email },
}) })
switch (scene) { switch (scene) {
@ -47,7 +48,7 @@ export class EmailService {
} }
const verifyCode = this.generateVerifyCode() const verifyCode = this.generateVerifyCode()
const registerToken = this.jwtService.sign( const token = this.jwtService.sign(
{ email, scene }, { email, scene },
{ secret: this.getEmailJwtSecret(verifyCode, scene) }, { secret: this.getEmailJwtSecret(verifyCode, scene) },
) )
@ -56,7 +57,7 @@ export class EmailService {
subject: `【qiuxu.site】${this.subjectMap[scene]}`, subject: `【qiuxu.site】${this.subjectMap[scene]}`,
html: `您正在qiuxu.site${this.subjectMap[scene]},验证码为 <strong>${verifyCode}</strong>30分钟内有效`, html: `您正在qiuxu.site${this.subjectMap[scene]},验证码为 <strong>${verifyCode}</strong>30分钟内有效`,
}) })
return { registerToken, userId: user.id } return { token, userId: user?.id }
} }
// TODO: 做成守卫? // TODO: 做成守卫?

View File

@ -0,0 +1,13 @@
import { IsNotEmpty, IsEmail } from 'class-validator'
export class ChangeEmailDto {
@IsNotEmpty()
@IsEmail()
email: string
@IsNotEmpty()
verifyCode: string
@IsNotEmpty()
token: string
}

View File

@ -7,6 +7,7 @@ import {
Body, Body,
UseInterceptors, UseInterceptors,
BadRequestException, BadRequestException,
Query,
} from '@nestjs/common' } from '@nestjs/common'
import { MeService } from './me.service' import { MeService } from './me.service'
import { ApiTags, ApiOperation, ApiUnauthorizedResponse } from '@nestjs/swagger' import { ApiTags, ApiOperation, ApiUnauthorizedResponse } from '@nestjs/swagger'
@ -19,6 +20,7 @@ import { DeleteUserDto } from './dto/delete-user.dto'
import { ChangePassword } from './dto/change-password.dto' import { ChangePassword } from './dto/change-password.dto'
import { UpdateUserDto } from './dto/update-user.dto' import { UpdateUserDto } from './dto/update-user.dto'
import { TokenRefreshPayload } from './dto/token.dto' import { TokenRefreshPayload } from './dto/token.dto'
import { ChangeEmailDto } from './dto/change-email.dto'
@Controller('api/users/me') @Controller('api/users/me')
@ApiTags('Me') @ApiTags('Me')
@ -65,7 +67,7 @@ export class MeController {
return this.meService.deleteUser(userData, userId) return this.meService.deleteUser(userData, userId)
} }
@Patch('?field=password') @Patch('password')
@NeedAuth() @NeedAuth()
@ApiOperation({ summary: '修改密码' }) @ApiOperation({ summary: '修改密码' })
@UseInterceptors(PasswordInterceptor) @UseInterceptors(PasswordInterceptor)
@ -76,12 +78,17 @@ export class MeController {
return this.meService.changePassword(payload, userId) return this.meService.changePassword(payload, userId)
} }
@Patch('?field=email') @Patch('email')
@NeedAuth() @NeedAuth()
@ApiOperation({ summary: '修改邮箱(TODO)' }) @ApiOperation({ summary: '修改邮箱' })
@UseInterceptors(PasswordInterceptor) @UseInterceptors(PasswordInterceptor)
async updateEmail(@Body() payload: unknown) { async changeEmail(
return '修改邮箱' @Query() query,
@Body() payload: ChangeEmailDto,
@User('userId') userId: string,
): Promise<UserEntity> {
console.log(query)
return this.meService.changeEmail(payload, userId)
} }
@Put('token') @Put('token')

View File

@ -13,6 +13,7 @@ import { EmailService } from 'src/email/email.service'
import { DeleteUserDto } from './dto/delete-user.dto' import { DeleteUserDto } from './dto/delete-user.dto'
import { ChangePassword } from './dto/change-password.dto' import { ChangePassword } from './dto/change-password.dto'
import { TokenContnet } from './dto/token.dto' import { TokenContnet } from './dto/token.dto'
import { ChangeEmailDto } from './dto/change-email.dto'
@Injectable() @Injectable()
export class MeService { export class MeService {
@ -62,6 +63,20 @@ export class MeService {
}) })
} }
async changeEmail(payload: ChangeEmailDto, userId: string) {
const { email, token, verifyCode } = payload
await this.emailService.verifyEmail({
email,
token,
verifyCode,
scene: EmailScene.changeEmail,
})
return this.prismaService.user.update({
where: { id: userId },
data: { email },
})
}
async updateAccessToken(refreshToken: string) { async updateAccessToken(refreshToken: string) {
const { userId, iat } = this.jwtService.verify<TokenContnet>(refreshToken, { const { userId, iat } = this.jwtService.verify<TokenContnet>(refreshToken, {
secret: this.secureConfig.jwt_refresh_secret, secret: this.secureConfig.jwt_refresh_secret,

View File

@ -23,7 +23,7 @@ export class UsersController {
return this.usersService.loginByEmail(user.email, user.password) return this.usersService.loginByEmail(user.email, user.password)
} }
@Patch(':id/?field=password') @Patch(':id/password')
@ApiOperation({ summary: '找回密码' }) @ApiOperation({ summary: '找回密码' })
async forgetPassword( async forgetPassword(
@Body() payload: ResetPassword, @Body() payload: ResetPassword,