mirror of
https://github.com/OpenSignLabs/OpenSign.git
synced 2026-08-17 21:25:54 +02:00
44 lines
1.5 KiB
JavaScript
44 lines
1.5 KiB
JavaScript
import {
|
|
generateOtp,
|
|
msUntil,
|
|
sendDeleteOtpEmail,
|
|
OTP_EXPIRES_MIN,
|
|
RESEND_COOLDOWN_SEC,
|
|
} from './deleteUtils.js';
|
|
|
|
export const deleteUserOtp = async (req, res) => {
|
|
const { userId } = req.params;
|
|
|
|
const extUserQuery = new Parse.Query('contracts_Users');
|
|
extUserQuery.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: userId });
|
|
const extUser = await extUserQuery.first({ useMasterKey: true });
|
|
if (!extUser) return res.status(404).json({ error: 'User not found' });
|
|
|
|
const now = Date.now();
|
|
const lastSentAt = extUser.get('DeleteOTPSentAt')?.getTime?.() || 0;
|
|
const cooldownEndsAt = lastSentAt + RESEND_COOLDOWN_SEC * 1000;
|
|
const remainingMs = msUntil(now, cooldownEndsAt);
|
|
|
|
if (remainingMs > 0) {
|
|
return res
|
|
.status(429)
|
|
.json({ error: 'Cooldown not finished', retryAfterSec: Math.ceil(remainingMs / 1000) });
|
|
}
|
|
|
|
const otp = generateOtp();
|
|
const expiresAt = new Date(now + OTP_EXPIRES_MIN * 60 * 1000);
|
|
|
|
try {
|
|
const resp = await sendDeleteOtpEmail(extUser, otp);
|
|
extUser.set('DeleteOTP', otp);
|
|
extUser.set('DeleteOTPExpiry', expiresAt);
|
|
extUser.set('DeleteOTPSentAt', new Date(now));
|
|
extUser.set('DeleteOTPTries', 0); // reset tries on resend
|
|
await extUser.save(null, { useMasterKey: true });
|
|
return res.json({ ok: true, cooldownSec: RESEND_COOLDOWN_SEC, expiresInMin: OTP_EXPIRES_MIN });
|
|
} catch (err) {
|
|
console.log('Error sending delete OTP (POST /otp):', err?.response?.data || err);
|
|
return res.status(500).json({ error: 'Failed to send OTP' });
|
|
}
|
|
};
|