diff --git a/app/controllers/user.controller.js b/app/controllers/user.controller.js index 8da53bc..2005a43 100644 --- a/app/controllers/user.controller.js +++ b/app/controllers/user.controller.js @@ -11,6 +11,7 @@ const db = require("../models"); const { hashPassword } = require("../utils/hashPassword.util"); +const { validatePassword } = require("../utils/validation/validatePassword.util"); const { generateUserId, generateId } = require("../utils/idGen.util"); const { logActivity } = require("../services/activity.service"); const { sendMail } = require("../utils/mail.util"); @@ -26,15 +27,10 @@ exports.createNewUser = async (req, res) => { firstName, lastName, email, - role, - roleID, + password, accountType, - department, } = req.body; - const hashedPassword = await hashPassword(process.env.DEFAULT_PASSWORD); - const userID = generateUserId(); - const userExists = await User.findOne({ where: { email } }); if (userExists) { await transaction.rollback(); @@ -45,6 +41,29 @@ exports.createNewUser = async (req, res) => { }); } + let pass; + + if(accountType === "admin" || accountType === "superadmin" || accountType === "manager" || accountType === "support_agent") { + pass = process.env.DEFAULT_PASSWORD; + }else{ + pass = password; + } + + const validatePasswordResult = validatePassword(pass); + + if (!validatePasswordResult) { + await transaction.rollback(); + return res.status(400).send({ + success: false, + message: "Password does not meet the required criteria", + }); + } + + const hashedPassword = await hashPassword(pass); + const userID = generateUserId(); + + + const newUser = await User.create( { id: userID, @@ -53,12 +72,10 @@ exports.createNewUser = async (req, res) => { email, password: hashedPassword, accountType, - role, - roleID: roleID || "N/A", - department: department || null, }, { transaction }, ); + const newProfile = await Profile.create( { diff --git a/app/models/user/user.model.js b/app/models/user/user.model.js index 366f779..fba021d 100644 --- a/app/models/user/user.model.js +++ b/app/models/user/user.model.js @@ -36,20 +36,8 @@ module.exports = (sequelize, DataTypes) => { allowNull: false }, accountType: { - type: DataTypes.ENUM("admin", "management", "team_head", "user"), + type: DataTypes.ENUM("user", "admin", "superadmin", "manager", "business_customer", "rider", "customer","support_agent"), defaultValue: "user" - }, - role: { - type: DataTypes.STRING, - allowNull: false - }, - roleID:{ - type: DataTypes.STRING, - allowNull: false - }, - department: { - type: DataTypes.STRING, - allowNull: true } }, { diff --git a/app/utils/validation/validatePassword.util.js b/app/utils/validation/validatePassword.util.js new file mode 100644 index 0000000..51ce82b --- /dev/null +++ b/app/utils/validation/validatePassword.util.js @@ -0,0 +1,31 @@ +const validatePassword = (password) => { + // Check if password is a string + if (typeof password !== "string") { + return false; + } + + // At least 1 uppercase letter + const hasUppercase = /[A-Z]/.test(password); + + // At least 1 lowercase letter + const hasLowercase = /[a-z]/.test(password); + + // At least 1 symbol + const hasSymbol = /[^A-Za-z0-9]/.test(password); + + // At least 4 numbers + const numberCount = (password.match(/[0-9]/g) || []).length; + + const hasFourNumbers = numberCount >= 4; + + return ( + hasUppercase && + hasLowercase && + hasSymbol && + hasFourNumbers + ); +}; + +module.exports = { + validatePassword, +}; \ No newline at end of file