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 { PrismaService } from 'nestjs-prisma'
import { EmailSendDto, EmailScene } from 'src/email/dto/email.dto'
import { UserEntity } from 'src/users/entities/user.entity'
@Injectable()
export class EmailService {
@ -28,7 +29,7 @@ export class EmailService {
) {}
async sendEmailToken(email: string, scene: EmailScene) {
const user = await this.prismaService.user.findUnique({
const user: UserEntity | null = await this.prismaService.user.findUnique({
where: { email },
})
switch (scene) {
@ -47,7 +48,7 @@ export class EmailService {
}
const verifyCode = this.generateVerifyCode()
const registerToken = this.jwtService.sign(
const token = this.jwtService.sign(
{ email, scene },
{ secret: this.getEmailJwtSecret(verifyCode, scene) },
)
@ -56,7 +57,7 @@ export class EmailService {
subject: `【qiuxu.site】${this.subjectMap[scene]}`,
html: `您正在qiuxu.site${this.subjectMap[scene]},验证码为 <strong>${verifyCode}</strong>30分钟内有效`,
})
return { registerToken, userId: user.id }
return { token, userId: user?.id }
}
// 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,
UseInterceptors,
BadRequestException,
Query,
} from '@nestjs/common'
import { MeService } from './me.service'
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 { UpdateUserDto } from './dto/update-user.dto'
import { TokenRefreshPayload } from './dto/token.dto'
import { ChangeEmailDto } from './dto/change-email.dto'
@Controller('api/users/me')
@ApiTags('Me')
@ -65,7 +67,7 @@ export class MeController {
return this.meService.deleteUser(userData, userId)
}
@Patch('?field=password')
@Patch('password')
@NeedAuth()
@ApiOperation({ summary: '修改密码' })
@UseInterceptors(PasswordInterceptor)
@ -76,12 +78,17 @@ export class MeController {
return this.meService.changePassword(payload, userId)
}
@Patch('?field=email')
@Patch('email')
@NeedAuth()
@ApiOperation({ summary: '修改邮箱(TODO)' })
@ApiOperation({ summary: '修改邮箱' })
@UseInterceptors(PasswordInterceptor)
async updateEmail(@Body() payload: unknown) {
return '修改邮箱'
async changeEmail(
@Query() query,
@Body() payload: ChangeEmailDto,
@User('userId') userId: string,
): Promise<UserEntity> {
console.log(query)
return this.meService.changeEmail(payload, userId)
}
@Put('token')

View File

@ -13,6 +13,7 @@ import { EmailService } from 'src/email/email.service'
import { DeleteUserDto } from './dto/delete-user.dto'
import { ChangePassword } from './dto/change-password.dto'
import { TokenContnet } from './dto/token.dto'
import { ChangeEmailDto } from './dto/change-email.dto'
@Injectable()
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) {
const { userId, iat } = this.jwtService.verify<TokenContnet>(refreshToken, {
secret: this.secureConfig.jwt_refresh_secret,

View File

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