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

69 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,
NotFoundException,
} 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.forgetPassword]: '找回密码',
[EmailScene.changeEmail]: '修改邮箱',
[EmailScene.deleteUser]: '删除用户',
}
constructor(
private prismaService: PrismaService,
private mailerService: MailerService,
private jwtService: JwtService,
@Inject(securityConfig.KEY)
private secureConfig: SecurityConfig,
) {}
async sendEmailToken(email: string, scene: EmailScene) {
const user = await this.prismaService.user.findUnique({
where: { email },
})
switch (scene) {
case EmailScene.register:
case EmailScene.changeEmail:
if (user) {
throw new ConflictException(`邮箱${email}已注册`)
}
break
case EmailScene.forgetPassword:
case EmailScene.deleteUser:
if (!user) {
throw new NotFoundException(`用户${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()
}
}