This commit is contained in:
rgrgogu
2026-05-23 14:03:38 +08:00
parent b39e7a2939
commit bf48c95467
5 changed files with 175 additions and 87 deletions
+39 -17
View File
@@ -28,6 +28,7 @@ const bcrypt = require('bcryptjs');
const sequelize = require('../config/db.config')
const mdl_Users = require('../models/users/users.mdl');
const mdl_UserSessions = require('../models/users/user_sessions.mdl');
const { mdl_UserGroups, mdl_UserGroupMembers } = require('../models/users/user_groups.mdl')
const { generateTokens, verifyRefreshToken, hashToken, shouldRotateRefreshToken } = require('../utils/token.util');
const { generateOTP, getOTPExpiry, isOTPExpired } = require('../utils/otp.util');
const sendEmail = require('../services/email.service');
@@ -53,32 +54,53 @@ const safeUser = (user, extraExclude = []) => {
// ─── Register ──────────────────────────────────────────────────────────────────
exports.register = async (req, res) => {
const transaction = await sequelize.transaction();
try {
const { email, password } = req.body;
const { email, password, personal_info, group_code } = req.body;
// ── Duplicate check ───────────────────────────────────────────────────────
const existing = await mdl_Users.findOne({ where: { email } });
if (existing) return R.error(res, 'Email is already registered.', 409);
// ── Validate group_code if provided ───────────────────────────────────────
let group = null;
if (group_code) {
group = await mdl_UserGroups.findOne({
where: { group_code: group_code.toUpperCase().trim(), is_active: true },
});
if (!group) return R.error(res, 'Invalid or inactive group code.', 400);
}
// ── Create user ───────────────────────────────────────────────────────────
const hashed = await bcrypt.hash(password, 12);
const otp = generateOTP();
const otp = generateOTP();
const user = await mdl_Users.create({
email,
password: hashed,
otp_code: otp,
password: hashed,
otp_code: otp,
otp_expires_at: getOTPExpiry(),
is_active: true,
is_verified: false,
reg_type: 'system',
acc_type: 'user',
createdBy: null,
is_active: true,
is_verified: false,
reg_type: 'system',
acc_type: 'user',
personal_info: personal_info ?? null,
createdBy: null,
}, { transaction });
await sendEmail({ to: email, type: "OTP", data: { otp } });
// ── Enroll into group ─────────────────────────────────────────────────────
if (group) {
await mdl_UserGroupMembers.create({
group_id: group.group_id,
user_id: user.user_id,
createdBy: null,
}, { transaction });
}
await sendEmail({ to: email, type: 'OTP', data: { otp } });
await transaction.commit();
return R.success(res, 'Registration successful. Please check your email for the OTP.', {
email: user.email,
}, 201);