2026-02-28 17:57:28 +08:00

60 lines
1.5 KiB
JavaScript

const { sendEmailCode } = require('./email')
function generateCode() {
return Math.floor(100000 + Math.random() * 900000).toString()
}
async function sendVerificationCode(db, email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
if (!emailRegex.test(email)) {
return { success: false, error: '邮箱格式不正确' }
}
const codesCollection = db.collection('verification_codes')
const recentCode = await codesCollection.findOne({
email,
created_at: { $gt: new Date(Date.now() - 60000) }
})
if (recentCode) {
return { success: false, error: '验证码发送太频繁,请稍后再试' }
}
const code = generateCode()
const result = await sendEmailCode(email, code)
if (!result.success) {
return { success: false, error: '验证码发送失败: ' + result.message }
}
await codesCollection.deleteMany({ email })
await codesCollection.insertOne({
email,
code,
created_at: new Date(),
expires_at: new Date(Date.now() + 5 * 60 * 1000)
})
return { success: true }
}
async function verifyCode(db, email, code) {
const codesCollection = db.collection('verification_codes')
const record = await codesCollection.findOne({
email,
code,
expires_at: { $gt: new Date() }
})
if (!record) {
return { success: false, error: '验证码无效或已过期' }
}
await codesCollection.deleteMany({ email })
return { success: true }
}
module.exports = { sendVerificationCode, verifyCode, generateCode }