FEAT_PASSWORD_LOGIN_API

This commit is contained in:
VENKATESHWARAN 2025-11-10 14:14:17 +05:30
parent 6a6087034c
commit 1b3270aae0
3 changed files with 203 additions and 188 deletions

View File

@ -506,6 +506,7 @@ $routes->post("/employeeRest/getVerifiedUserData", "RestAuthenticationController
$routes->post("/employeeRest/verifyEmployeeEmailId", "RestAuthenticationController::verifyEmployeeWithEmailId"); $routes->post("/employeeRest/verifyEmployeeEmailId", "RestAuthenticationController::verifyEmployeeWithEmailId");
$routes->post("/employeeRest/updateEmpOTP", "RestAuthenticationController::updateEmpOTP"); $routes->post("/employeeRest/updateEmpOTP", "RestAuthenticationController::updateEmpOTP");
// MPIN api's
$routes->post("employeeRest/saveMpin", "RestAuthenticationController::saveMpin"); $routes->post("employeeRest/saveMpin", "RestAuthenticationController::saveMpin");
$routes->post("employeeRest/updateMpin", "RestAuthenticationController::updateMpin"); $routes->post("employeeRest/updateMpin", "RestAuthenticationController::updateMpin");
$routes->post("/employeeRest/verifyMpin", "RestAuthenticationController::verifyMpin"); $routes->post("/employeeRest/verifyMpin", "RestAuthenticationController::verifyMpin");
@ -513,8 +514,12 @@ $routes->post("/employeeRest/checkMpin", "RestAuthenticationController::checkMpi
$routes->post("/employeeRest/updateEmpMPIN", "RestAuthenticationController::updateEmpMPIN"); $routes->post("/employeeRest/updateEmpMPIN", "RestAuthenticationController::updateEmpMPIN");
$routes->post("employeeRest/forgotMPIN", "RestAuthenticationController::forgotMPIN"); $routes->post("employeeRest/forgotMPIN", "RestAuthenticationController::forgotMPIN");
$routes->post("employeeRest/updateMobileNumber", "RestAuthenticationController::updateMobileNumber"); $routes->post("employeeRest/updateMobileNumber", "RestAuthenticationController::updateMobileNumber");
// $routes->post("/employeeRest/saveMpin", "RestAuthenticationController::saveMpin");
// PASSWORD api's
$routes->post("employeeRest/savePassword", "RestAuthenticationController::savePassword");
$routes->post("employeeRest/changePassword", "RestAuthenticationController::changePassword");
$routes->post("employeeRest/verifyPassword", "RestAuthenticationController::verifyPassword");
$routes->post("employeeRest/verifyOtp", "RestAuthenticationController::verifyOtp");
//HR login api's //HR login api's
$routes->post("/employeeRest/verifyHrWithMobileNumber", "RestAuthenticationController::verifyHrWithMobileNumber"); $routes->post("/employeeRest/verifyHrWithMobileNumber", "RestAuthenticationController::verifyHrWithMobileNumber");

View File

@ -1515,9 +1515,14 @@ class RestAuthenticationController extends AdminController
$email_id = $payload->email_id ?? null; $email_id = $payload->email_id ?? null;
$client_id = $payload->client_id ?? null; $client_id = $payload->client_id ?? null;
$plain_password = $payload->password ?? null; $plain_password = $payload->password ?? null;
$confirm_password = $payload->confirm_password ?? null;
if (empty($plain_password)) { if (empty($plain_password) || empty($confirm_password)) {
return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'Password cannot be empty'], 400); return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'Both password cannot be empty'], 400);
}
if($plain_password !== $confirm_password){
return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'Password and confirm password not matched'], 400);
} }
// Build employee query // Build employee query
@ -1555,6 +1560,7 @@ class RestAuthenticationController extends AdminController
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Last Executed Query: " . $lastQuery); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Last Executed Query: " . $lastQuery);
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: employeeData: " . json_encode($employeeData ?? [])); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: employeeData: " . json_encode($employeeData ?? []));
if ($employeeData) { if ($employeeData) {
$id = $employeeData['id']; $id = $employeeData['id'];
$hashedPassword = password_hash($plain_password, PASSWORD_DEFAULT); $hashedPassword = password_hash($plain_password, PASSWORD_DEFAULT);
@ -1581,135 +1587,132 @@ class RestAuthenticationController extends AdminController
} }
} catch (\Throwable $th) { } catch (\Throwable $th) {
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Exception: " . $th->getMessage() . " --- Line: " . $th->getLine() . " --- Trace: " . $th->getTraceAsString()); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Exception: " . $th->getMessage() . " --- Line: " . $th->getLine() . " --- Trace: " . $th->getTraceAsString());
return $this->respond(['status' => 'failed', 'code' => 500, 'message' => $th->getMessage()], 500); $errorData = [
'message' => $th->getMessage(),
'file' => $th->getFile(),
'line' => $th->getLine(),
'code' => $th->getCode(),
'trace' => $th->getTraceAsString(),
'trace_array' => $th->getTrace(), // full array version (optional)
'function' => $th->getTrace()[0]['function'] ?? null,
'class' => $th->getTrace()[0]['class'] ?? null,
];
return $this->respond(['status' => 'failed', 'code' => 500, 'message' => $th->getMessage(), 'errorData' => $errorData], 500);
} }
} }
public function changePassword() public function changePassword()
{ {
log_message('error', ' ');
log_message('error', ' ************************************* CHANGE PASSWORD START **************************************** ');
log_message('error', ' ');
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Function called");
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Received payload = " . json_encode($this->request->getJSON() ?? [])); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Received payload = " . json_encode($this->request->getJSON() ?? []));
try { try {
$payload = $this->request->getJSON(true);
$payload = $this->request->getJSON(true);
$mobile_number = $payload['mobile_number'] ?? null; $mobile_number = $payload['mobile_number'] ?? null;
$email_id = $payload['email_id'] ?? null; $email_id = $payload['email_id'] ?? null;
$client_id = $payload['client_id'] ?? null; $client_id = $payload['client_id'] ?? null;
$otp = $payload['otp'] ?? null; $old_password = $payload['old_password'] ?? null;
$new_password = $payload['new_password'] ?? null; $new_password = $payload['new_password'] ?? null;
$confirm_password = $payload['confirm_password'] ?? null;
if (empty($otp) || empty($new_password)) { if (!$mobile_number && !$email_id) {
return $this->respond([ return $this->respond(['status' => 'failed','code' => 400,'message' => 'Mobile number or Email ID is required'], 400);
'status' => 'failed',
'code' => 400,
'message' => 'OTP and new password are required'
], 400);
} }
// Fetch employee details if (empty($new_password) || empty($confirm_password) || empty($old_password)) {
return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'old_password , New password and Confirm password are required' ], 400);
}
if($new_password !== $confirm_password){
return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'New password and confirm password not matched'], 400);
}
// Build employee query
if ($mobile_number) {
$builder = $this->employeeModel $builder = $this->employeeModel
->select('employees.*') ->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id') ->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.mobile', $mobile_number)
->where('employees.relationship', 'Self') ->where('employees.relationship', 'Self')
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active'])
->where('employee_polices.is_active', 1) ->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active']); ->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active', 'expired']);
if (!empty($client_id)) $builder->where('employees.client_id', $client_id); if (!empty($client_id)) $builder->where('employees.client_id', $client_id);
if ($mobile_number) {
$builder->where('employees.mobile', $mobile_number);
} elseif ($email_id) {
$builder->where('employees.email_corporate', $email_id);
} else {
return $this->respond([
'status' => 'failed',
'code' => 400,
'message' => 'Mobile number or Email ID is required'
], 400);
}
$employeeData = $builder->orderBy('employees.id', 'desc')->first(); $employeeData = $builder->orderBy('employees.id', 'desc')->first();
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: employeeData: " . json_encode($employeeData ?? [])); } else {
$builder = $this->employeeModel
->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.email_corporate', $email_id)
->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active', 'expired']);
if (!empty($client_id)) $builder->where('employees.client_id', $client_id);
$employeeData = $builder->orderBy('employees.id', 'desc')->first();
if (!$employeeData) {
return $this->respond(['status' => 'failed', 'code' => 404, 'message' => 'User not found'], 404);
} }
// Check OTP validity (assuming fields: otp, otp_expiry exist) $lastQuery = $this->employeeModel->db->getLastQuery();
if (empty($employeeData['otp']) || $employeeData['otp'] != $otp) { $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Last Executed Query: " . $lastQuery);
return $this->respond(['status' => 'failed', 'code' => 401, 'message' => 'Invalid OTP'], 200); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: employeeData: " . json_encode($employeeData ?? []));
}
if (!empty($employeeData['otp_expiry']) && strtotime($employeeData['otp_expiry']) < time()) { if ($employeeData && password_verify($old_password, $employeeData['password'])) {
return $this->respond(['status' => 'failed', 'code' => 401, 'message' => 'OTP expired'], 200);
}
// Hash new password // Hash new password
$newHashedPassword = password_hash($new_password, PASSWORD_DEFAULT); // $newHashedPassword = password_hash($new_password, PASSWORD_DEFAULT);
$newHashedPassword = $new_password;
// Update password and clear OTP // Update password and clear OTP
$updated = $this->employeeModel->update($employeeData['id'], [ $updated = $this->employeeModel->update($employeeData['id'], [
'password' => $newHashedPassword, 'password' => $newHashedPassword,
'otp' => null,
]); ]);
if ($updated) { if ($updated) {
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Password updated successfully"); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Password updated successfully");
log_message('error', ' '); return $this->respond(['status' => 'success','code' => 200,'message' => 'Password changed successfully'], 200);
log_message('error', ' ************************************* CHANGE PASSWORD END **************************************** ');
log_message('error', ' ');
return $this->respond([
'status' => 'success',
'code' => 200,
'message' => 'Password changed successfully'
], 200);
} else { } else {
return $this->respond([ return $this->respond(['status' => 'failed','code' => 500,'message' => 'Failed to update password' ], 500);
'status' => 'failed', }
'code' => 500,
'message' => 'Failed to update password' }else{
], 500); return $this->respond(['status' => 'failed', 'code' => 404, 'message' => 'User not found'], 404);
} }
} catch (\Throwable $th) { } catch (\Throwable $th) {
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Exception: " . $th->getMessage()); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Exception: " . $th->getMessage());
log_message('error', ' ');
log_message('error', ' ************************************* CHANGE PASSWORD END **************************************** ');
log_message('error', ' ');
return $this->respond(['status' => 'failed', 'code' => 500, 'message' => $th->getMessage()], 500); return $this->respond(['status' => 'failed', 'code' => 500, 'message' => $th->getMessage()], 500);
} }
} }
public function verifyPassword() public function verifyPassword()
{ {
log_message('error', ' ');
log_message('error', ' ************************************* POST START **************************************** ');
log_message('error', ' ');
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - Verify Password: Function called");
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Received payload = " . json_encode($this->request->getJSON() ?? [])); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Received payload = " . json_encode($this->request->getJSON() ?? []));
try { try {
$requestData = $this->request->getJSON(true);
$requestData = $this->request->getJSON(true);
$mobile_number = $requestData['mobile_number'] ?? null; $mobile_number = $requestData['mobile_number'] ?? null;
$email_id = $requestData['email_id'] ?? null; $email_id = $requestData['email_id'] ?? null;
$password = $requestData['password'] ?? null; $password = $requestData['password'] ?? null;
$client_id = $requestData['client_id'] ?? null; $client_id = $requestData['client_id'] ?? null;
if(!$mobile_number && !$email_id){
return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Mobile number or Email ID is required'], 400);
}
if (!$password) { if (!$password) {
return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Password is required'], 400); return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Password is required'], 400);
} }
// 🔹 Fetch employee data // 🔹 Fetch employee data
if ($mobile_number) { if ($mobile_number) {
$builder = $this->employeeModel $builder = $this->employeeModel
->select('employees.*') ->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id') ->join('employee_polices', 'employees.id = employee_polices.employee_id')
@ -1725,7 +1728,9 @@ class RestAuthenticationController extends AdminController
} }
$employeeData = $builder->orderBy('employees.id', 'desc')->first(); $employeeData = $builder->orderBy('employees.id', 'desc')->first();
} elseif ($email_id) { } elseif ($email_id) {
$builder = $this->employeeModel $builder = $this->employeeModel
->select('employees.*') ->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id') ->join('employee_polices', 'employees.id = employee_polices.employee_id')
@ -1741,8 +1746,7 @@ class RestAuthenticationController extends AdminController
} }
$employeeData = $builder->orderBy('employees.id', 'desc')->first(); $employeeData = $builder->orderBy('employees.id', 'desc')->first();
} else {
return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Mobile number or Email ID is required'], 400);
} }
$lastQuery = $this->employeeModel->db->getLastQuery(); $lastQuery = $this->employeeModel->db->getLastQuery();
@ -1770,11 +1774,8 @@ class RestAuthenticationController extends AdminController
$employeeData['token_type'] = "post"; $employeeData['token_type'] = "post";
$token = JWTToken::encode($employeeData); $token = JWTToken::encode($employeeData);
log_message('error', ' ');
log_message('error', ' ************************************* POST END **************************************** ');
log_message('error', ' ');
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $token], 200); return $this->respond(['status' => 'success', 'code' => 200, 'data' => $token], 200);
} else { } else {
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Invalid password or employee not found"); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Invalid password or employee not found");
log_message('error', ' '); log_message('error', ' ');
@ -1783,6 +1784,7 @@ class RestAuthenticationController extends AdminController
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => "", 'message' => 'Invalid password'], 200); return $this->respond(['status' => 'failed', 'code' => 404, 'data' => "", 'message' => 'Invalid password'], 200);
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Exception: " . $e->getMessage() . " --- Line: " . $e->getLine()); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Exception: " . $e->getMessage() . " --- Line: " . $e->getLine());
log_message('error', ' '); log_message('error', ' ');
@ -1792,75 +1794,82 @@ class RestAuthenticationController extends AdminController
} }
} }
public function sendChangePasswordOTP() public function verifyOtp()
{ {
log_message('error', ' '); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyOtp: Received payload = " . json_encode($this->request->getJSON() ?? []));
log_message('error', ' ************************************* SEND OTP START **************************************** ');
log_message('error', ' ');
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - sendChangePasswordOTP: Function called");
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - sendChangePasswordOTP: Received payload = " . json_encode($this->request->getJSON() ?? []));
try { try {
$requestData = $this->request->getJSON(true);
$requestData = $this->request->getJSON(true);
$mobile_number = $requestData['mobile_number'] ?? null;
$email_id = $requestData['email_id'] ?? null; $email_id = $requestData['email_id'] ?? null;
$client_id = $requestData['client_id'] ?? null; $client_id = $requestData['client_id'] ?? null;
$otp = $requestData['otp'] ?? null;
if (!$email_id) { if(!$mobile_number && !$email_id){
return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Email ID is required'], 400); return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'Mobile number or Email ID is required'], 400);
} }
// Get employee details if (!$otp) {
return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'OTP is required'], 400);
}
// 🔹 Fetch employee data
if ($mobile_number) {
$builder = $this->employeeModel $builder = $this->employeeModel
->select('employees.id, employees.mobile, employees.email_corporate, employees.client_id') ->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id') ->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.is_active', 1) ->where('employees.mobile', $mobile_number)
->whereIn('employees.emp_status', ['active']) ->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1) ->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active']) ->whereIn('employee_polices.status', ['active'])
->where('employees.relationship', 'Self'); ->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active']);
if (!empty($client_id)) { if (!empty($client_id)) {
$builder->where('employees.client_id', $client_id); $builder->where('employees.client_id', $client_id);
} }
if ($email_id) { $employeeData = $builder->orderBy('employees.id', 'desc')->first();
$builder->where('employees.email_corporate', $email_id);
} else {
$builder = $this->employeeModel
->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.email_corporate', $email_id)
->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active']);
if (!empty($client_id)) {
$builder->where('employees.client_id', $client_id);
} }
$employeeData = $builder->orderBy('employees.id', 'desc')->first(); $employeeData = $builder->orderBy('employees.id', 'desc')->first();
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - sendChangePasswordOTP: Employee Data: " . json_encode($employeeData ?? []));
if (!$employeeData) {
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => "", 'message' => 'Employee not found'], 404);
} }
// Generate 6-digit OTP $lastQuery = $this->employeeModel->db->getLastQuery();
$otp = rand(100000, 999999); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Last Executed Query: " . $lastQuery);
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: employeeData: " . json_encode($employeeData ?? []));
// Save OTP to DB (assuming 'otp' and 'otp_expiry' columns exist) // 🔹 Verify otp
$this->employeeModel->update($employeeData['id'], [ if ($employeeData && $employeeData['otp'] == $otp) {
'otp' => $otp, $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyOtp: OTP Verified employee found");
]); $this->employeeModel->where('id', $employeeData['id'])->where('otp', $otp)->where('relationship', 'self')->set(['otp'=>null])->update();
return $this->respond(['status' => 'success', 'code' => 200, 'message' => "OTP verified succesfully"], 200);
} else {
// Send OTP via SMS or Email (you can replace with your actual helper) $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyOtp: OTP verification failed, OTP not found in the post db");
if ($email_id) { return $this->respond(['status' => 'failed', 'code' => 400, 'message' => "OTP verification failed"], 200);
// Example: MailHelper::sendMail($email_id, 'Password Change OTP', "Your OTP is {$otp}");
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - sendChangePasswordOTP: OTP {$otp} sent to email {$email_id}");
} }
log_message('error', ' ');
log_message('error', ' ************************************* SEND OTP END **************************************** ');
log_message('error', ' ');
return $this->respond(['status' => 'success', 'code' => 200, 'data' => ['otp_sent_to' => $email_id], 'message' => 'OTP sent successfully'], 200);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - sendChangePasswordOTP: Exception: " . $e->getMessage() . " --- Line: " . $e->getLine()); $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyOtp: Exception: " . $e->getMessage() . " --- Line: " . $e->getLine());
log_message('error', ' ');
log_message('error', ' ************************************* SEND OTP END **************************************** ');
log_message('error', ' ');
return $this->respond(['status' => 'failed', 'code' => 500, 'data' => "", 'message' => $e->getMessage()], 500); return $this->respond(['status' => 'failed', 'code' => 500, 'data' => "", 'message' => $e->getMessage()], 500);
} }
} }

View File

@ -45,6 +45,7 @@ class EmployeeModel extends Model
"mpin", "mpin",
"is_mpin_skipped", "is_mpin_skipped",
"is_biometric_enabled", "is_biometric_enabled",
"password",
]; ];
// Callbacks // Callbacks