60 lines
1.5 KiB
JavaScript
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 }
|