nest-project/src/email/email.service.ts

64 lines
2.0 KiB
TypeScript
Raw Normal View History

import { ConflictException, Inject, Injectable } from '@nestjs/common'
import { securityConfig, SecurityConfig } from 'src/common/configs'
2023-02-21 16:31:45 +08:00
import { MailerService } from '@nestjs-modules/mailer'
import { JwtService } from '@nestjs/jwt'
import { EmailScene } from './dto/email.dto'
import { PrismaService } from 'nestjs-prisma'
2023-02-21 16:31:45 +08:00
@Injectable()
export class EmailService {
2023-02-22 16:09:31 +08:00
private subjectMap = {
[EmailScene.register]: '注册账号',
[EmailScene.updatePassword]: '修改密码',
[EmailScene.updateEmail]: '修改邮箱',
2023-02-22 18:37:13 +08:00
[EmailScene.deleteUser]: '删除用户',
2023-02-22 16:09:31 +08:00
}
constructor(
private prismaService: PrismaService,
private mailerService: MailerService,
private jwtService: JwtService,
@Inject(securityConfig.KEY)
private secureConfig: SecurityConfig,
) {}
2023-02-22 16:09:31 +08:00
async sendEmailToken(email: string, scene: EmailScene) {
switch (scene) {
case EmailScene.register:
const user = await this.prismaService.user.findUnique({
where: { email },
})
if (user) {
throw new ConflictException(`邮箱${email}已注册`)
}
break
case EmailScene.updatePassword:
case EmailScene.updateEmail:
2023-02-22 18:37:13 +08:00
case EmailScene.deleteUser:
2023-02-22 16:09:31 +08:00
await this.prismaService.user.findUniqueOrThrow({
where: { email },
})
break
}
2023-02-22 16:09:31 +08:00
const verifyCode = this.generateVerifyCode()
const registerToken = this.jwtService.sign(
{ email, scene },
2023-02-22 16:09:31 +08:00
{ secret: this.getEmailJwtSecret(verifyCode, scene) },
)
await this.mailerService.sendMail({
to: email,
2023-02-22 16:09:31 +08:00
subject: `【qiuxu.site】${this.subjectMap[scene]}`,
html: `您正在qiuxu.site${this.subjectMap[scene]},验证码为 <strong>${verifyCode}</strong>30分钟内有效`,
})
2023-02-22 01:09:26 +08:00
return registerToken
}
2023-02-22 16:09:31 +08:00
getEmailJwtSecret(verifyCode: string, scene: EmailScene) {
return this.secureConfig.jwt_access_secret + verifyCode + scene
}
2023-02-22 16:09:31 +08:00
private generateVerifyCode() {
2023-02-22 01:09:26 +08:00
return Math.floor(Math.random() * 899999 + 100000).toString()
}
2023-02-21 16:31:45 +08:00
}