nest-project/src/email/email.service.ts
2023-02-22 18:37:13 +08:00

64 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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