fix: User Name always be unique
feat : customer can login with user name or customer number
This commit is contained in:
@@ -9,10 +9,10 @@ const { setJson, getJson } = require('../config/redis');
|
|||||||
|
|
||||||
|
|
||||||
async function login(req, res) {
|
async function login(req, res) {
|
||||||
const { customerNo, password, otp } = req.body;
|
let { customerNo, userName, password, otp } = req.body;
|
||||||
const loginType = req.headers['x-login-type'] || 'standard';
|
const loginType = req.headers['x-login-type'] || 'standard';
|
||||||
|
|
||||||
if (!customerNo || !password) {
|
if ((!customerNo && !userName) || !password) {
|
||||||
return res.status(400).json({ error: 'customerNo and password are required' });
|
return res.status(400).json({ error: 'customerNo and password are required' });
|
||||||
}
|
}
|
||||||
const currentTime = new Date().toISOString();
|
const currentTime = new Date().toISOString();
|
||||||
@@ -22,6 +22,17 @@ async function login(req, res) {
|
|||||||
// --- Step 1: Check if user is already locked ---
|
// --- Step 1: Check if user is already locked ---
|
||||||
const blockedKey = `login:blocked:${customerNo}`;
|
const blockedKey = `login:blocked:${customerNo}`;
|
||||||
const attemptsKey = `login:attempts:${customerNo}`;
|
const attemptsKey = `login:attempts:${customerNo}`;
|
||||||
|
if (!customerNo && userName) {
|
||||||
|
const result = await db.query('SELECT * FROM users WHERE preferred_name = $1', [
|
||||||
|
userName,
|
||||||
|
]);
|
||||||
|
if (result.rows.length === 0) {
|
||||||
|
logger.error("Customer not found with this user name.");
|
||||||
|
return res.status(404).json({ error: 'No user found with this username.' });
|
||||||
|
}
|
||||||
|
logger.info("Customer found with user name.");
|
||||||
|
customerNo = result.rows[0].customer_no;
|
||||||
|
}
|
||||||
|
|
||||||
const userCheck = await authService.findUserByCustomerNo(customerNo);
|
const userCheck = await authService.findUserByCustomerNo(customerNo);
|
||||||
|
|
||||||
@@ -29,6 +40,7 @@ async function login(req, res) {
|
|||||||
// check DB locked flag
|
// check DB locked flag
|
||||||
if (userCheck && userCheck.locked) {
|
if (userCheck && userCheck.locked) {
|
||||||
await setJson(blockedKey, true, BLOCK_DURATION);
|
await setJson(blockedKey, true, BLOCK_DURATION);
|
||||||
|
logger.error("USER Account Locked");
|
||||||
return res.status(423).json({
|
return res.status(423).json({
|
||||||
error: 'Your account is locked. Please contact the administrator.',
|
error: 'Your account is locked. Please contact the administrator.',
|
||||||
});
|
});
|
||||||
@@ -275,6 +287,11 @@ async function setUserName(req, res) {
|
|||||||
}
|
}
|
||||||
const userNameIsExits = await authService.CheckUserName(customerNo);
|
const userNameIsExits = await authService.CheckUserName(customerNo);
|
||||||
const { user_name } = req.body;
|
const { user_name } = req.body;
|
||||||
|
|
||||||
|
if (!user_name) {
|
||||||
|
return res.status(400).json({ error: 'Username is required' });
|
||||||
|
}
|
||||||
|
|
||||||
if (!userNameIsExits) {
|
if (!userNameIsExits) {
|
||||||
await authService.setUserName(customerNo, user_name);
|
await authService.setUserName(customerNo, user_name);
|
||||||
logger.info('User name has been set for first time.');
|
logger.info('User name has been set for first time.');
|
||||||
@@ -292,7 +309,7 @@ async function setUserName(req, res) {
|
|||||||
// Cannot match last 2
|
// Cannot match last 2
|
||||||
const lastTwo = history.slice(0, 2);
|
const lastTwo = history.slice(0, 2);
|
||||||
if (lastTwo.includes(user_name.toLowerCase())) {
|
if (lastTwo.includes(user_name.toLowerCase())) {
|
||||||
return res.status(409).json({ error: "Preferred name cannot match last 2 preferred names"});
|
return res.status(409).json({ error: "Preferred name cannot match last 2 preferred names" });
|
||||||
}
|
}
|
||||||
await authService.setUserName(customerNo, user_name);
|
await authService.setUserName(customerNo, user_name);
|
||||||
logger.info('User name has been updated.');
|
logger.info('User name has been updated.');
|
||||||
|
|||||||
@@ -157,6 +157,9 @@ async function setUserName(customerNo, username) {
|
|||||||
);
|
);
|
||||||
logger.info("preferred_name_history table updated");
|
logger.info("preferred_name_history table updated");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
if (error.code === '23505') {
|
||||||
|
throw new Error('PREFERRED_NAME_ALREADY_EXISTS');
|
||||||
|
}
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`error occured while setting new preferred name ${error.message}`
|
`error occured while setting new preferred name ${error.message}`
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user