handle those failed test cases

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-07-16 01:35:59 +08:00
parent 04baad0cac
commit 8827c1705d
+46 -2
View File
@@ -120,11 +120,55 @@ exports.register = async (req, res) => {
const transaction = await sequelize.transaction();
try {
const { email, password, personal_info, group_code } = req.body;
const { email, password, personal_info, group_code, confirm_resume } = req.body;
// ── Duplicate check ───────────────────────────────────────────────────────
// A verified account owns the email outright — hard block. An unverified
// one is just an abandoned attempt (e.g. dropped connection before the OTP
// step completed, or the client retried after a failed send) — the same
// person retrying should be able to resume it rather than dead-end here.
// The client must explicitly confirm_resume (after the user accepts a
// confirmation dialog) before we overwrite that abandoned attempt's data.
const existing = await mdl_Users.findOne({ where: { email } });
if (existing) return R.error(res, 'Email is already registered.', 409);
if (existing) {
if (existing.is_verified) {
await transaction.rollback();
return R.error(res, 'Email is already registered.', 409);
}
if (existing.reg_type !== 'system') {
await transaction.rollback();
return R.error(res, 'This email is linked to a Google account. Please sign in with Google instead.', 409, { google: true });
}
if (!confirm_resume) {
await transaction.rollback();
return R.error(
res,
'An account with this email already has a pending verification. Resend the code and continue?',
409,
{ pendingVerification: true },
);
}
const hashed = await bcrypt.hash(password, 12);
const otp = generateOTP();
await existing.update({
password: hashed,
personal_info: personal_info ?? existing.personal_info,
otp_code: otp,
otp_expires_at: getOTPExpiry(),
}, { transaction });
await transaction.commit();
sendEmail({ to: email, type: 'OTP', data: { otp } })
.catch(err => console.error('[AUTH] Failed to send OTP email:', err));
return R.success(res, 'Registration successful. Please check your email for the OTP.', {
email: existing.email,
}, 201);
}
// ── Validate group_code if provided ───────────────────────────────────────
let group = null;