From c24104ae75c865006a20f666e4fa03d82703adc0 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Wed, 5 Nov 2025 11:33:15 +0530 Subject: [PATCH] FEAT_EMP_SELF_MOBILE_NUMBER_UPDATE_API --- .../RestAuthenticationController.php | 457 ++++++++++++++++++ app/Views/layout/footer.php | 6 +- 2 files changed, 462 insertions(+), 1 deletion(-) diff --git a/app/Controllers/RestAuthenticationController.php b/app/Controllers/RestAuthenticationController.php index 24f22283..11b1a8fc 100755 --- a/app/Controllers/RestAuthenticationController.php +++ b/app/Controllers/RestAuthenticationController.php @@ -869,6 +869,7 @@ class RestAuthenticationController extends AdminController return $this->respond(['status' => 'failed','code' => 404,'data' => $result],200); } + } catch (\Throwable $th) { $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - saveMpin: Exception: " . $th->getMessage() . " --- Line: " . $th->getLine() . " --- Trace: " . $th->getTraceAsString()); log_message('error', ' '); @@ -1496,4 +1497,460 @@ class RestAuthenticationController extends AdminController return $this->fail("Invalid Token: " . $e->getMessage(), 401); } } + + // -------------- PASSWORD API'S ------------------------------------------------------------------------------------------------------------- + + public function savePassword() + { + log_message('error', ' '); + log_message('error', ' ************************************* POST START **************************************** '); + log_message('error', ' '); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Function called"); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Received payload = " . json_encode($this->request->getJSON() ?? [])); + + try { + + $payload = $this->request->getJSON(); + $mobile_number = $payload->mobile_number ?? null; + $email_id = $payload->email_id ?? null; + $client_id = $payload->client_id ?? null; + $plain_password = $payload->password ?? null; + + if (empty($plain_password)) { + return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'Password cannot be empty'], 400); + } + + // Build employee query + if ($mobile_number) { + + $builder = $this->employeeModel + ->select('employees.*') + ->join('employee_polices', 'employees.id = employee_polices.employee_id') + ->where('employees.mobile', $mobile_number) + ->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(); + + } 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(); + + } + + $lastQuery = $this->employeeModel->db->getLastQuery(); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Last Executed Query: " . $lastQuery); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: employeeData: " . json_encode($employeeData ?? [])); + + if ($employeeData) { + $id = $employeeData['id']; + $hashedPassword = password_hash($plain_password, PASSWORD_DEFAULT); + + $updateData = [ + 'password' => $hashedPassword, + ]; + + $updated = $this->employeeModel->where('id', $id)->set($updateData)->update(); + + if ($updated) { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Password saved successfully"); + $result = ['user_verification' => true, 'message' => "Password saved successfully"]; + return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200); + } else { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Password save failed"); + $result = ['user_verification' => true, 'message' => "Password not saved"]; + return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $result], 200); + } + } else { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - savePassword: Employee not found"); + $result = ['user_verification' => false, 'message' => "User not found"]; + return $this->respond(['status' => 'failed', 'code' => 404, 'data' => $result], 200); + } + } catch (\Throwable $th) { + $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); + } + } + + 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() ?? [])); + + try { + $payload = $this->request->getJSON(true); + + $mobile_number = $payload['mobile_number'] ?? null; + $email_id = $payload['email_id'] ?? null; + $client_id = $payload['client_id'] ?? null; + $otp = $payload['otp'] ?? null; + $new_password = $payload['new_password'] ?? null; + + if (empty($otp) || empty($new_password)) { + return $this->respond([ + 'status' => 'failed', + 'code' => 400, + 'message' => 'OTP and new password are required' + ], 400); + } + + // Fetch employee details + $builder = $this->employeeModel + ->select('employees.*') + ->join('employee_polices', 'employees.id = employee_polices.employee_id') + ->where('employees.relationship', 'Self') + ->where('employees.is_active', 1) + ->whereIn('employees.emp_status', ['active']) + ->where('employee_polices.is_active', 1) + ->whereIn('employee_polices.status', ['active']); + + 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(); + + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: employeeData: " . json_encode($employeeData ?? [])); + + if (!$employeeData) { + return $this->respond(['status' => 'failed', 'code' => 404, 'message' => 'User not found'], 404); + } + + // Check OTP validity (assuming fields: otp, otp_expiry exist) + if (empty($employeeData['otp']) || $employeeData['otp'] != $otp) { + return $this->respond(['status' => 'failed', 'code' => 401, 'message' => 'Invalid OTP'], 200); + } + + if (!empty($employeeData['otp_expiry']) && strtotime($employeeData['otp_expiry']) < time()) { + return $this->respond(['status' => 'failed', 'code' => 401, 'message' => 'OTP expired'], 200); + } + + // Hash new password + $newHashedPassword = password_hash($new_password, PASSWORD_DEFAULT); + + // Update password and clear OTP + $updated = $this->employeeModel->update($employeeData['id'], [ + 'password' => $newHashedPassword, + 'otp' => null, + ]); + + if ($updated) { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - changePassword: Password updated successfully"); + log_message('error', ' '); + log_message('error', ' ************************************* CHANGE PASSWORD END **************************************** '); + log_message('error', ' '); + + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'message' => 'Password changed successfully' + ], 200); + } else { + return $this->respond([ + 'status' => 'failed', + 'code' => 500, + 'message' => 'Failed to update password' + ], 500); + } + + } catch (\Throwable $th) { + $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); + } + } + + 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() ?? [])); + + try { + $requestData = $this->request->getJSON(true); + + $mobile_number = $requestData['mobile_number'] ?? null; + $email_id = $requestData['email_id'] ?? null; + $password = $requestData['password'] ?? null; + $client_id = $requestData['client_id'] ?? null; + + if (!$password) { + return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Password is required'], 400); + } + + // 🔹 Fetch employee data + if ($mobile_number) { + $builder = $this->employeeModel + ->select('employees.*') + ->join('employee_polices', 'employees.id = employee_polices.employee_id') + ->where('employees.mobile', $mobile_number) + ->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(); + } elseif ($email_id) { + $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(); + } else { + return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Mobile number or Email ID is required'], 400); + } + + $lastQuery = $this->employeeModel->db->getLastQuery(); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Last Executed Query: " . $lastQuery); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: employeeData: " . json_encode($employeeData ?? [])); + + // 🔹 Verify password hash + if ($employeeData && isset($employeeData['password']) && password_verify($password, $employeeData['password'])) { + + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Verified employee found"); + + // ✅ Log authentication info + $auth = HttpRequestHelper::getRequestInfo(); + if ($auth) { + $this->authHistoryModel->insert([ + 'user_id' => $employeeData['id'], + 'user_type' => 'employee', + 'ip' => $auth['ip'], + 'platform' => $auth['platform'], + 'broswer' => $auth['browser'], + ]); + } + + // ✅ Generate JWT token + $employeeData['token_type'] = "post"; + $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); + } else { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Invalid password or employee not found"); + log_message('error', ' '); + log_message('error', ' ************************************* POST END **************************************** '); + log_message('error', ' '); + + return $this->respond(['status' => 'failed', 'code' => 404, 'data' => "", 'message' => 'Invalid password'], 200); + } + } catch (\Exception $e) { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - verifyPassword: Exception: " . $e->getMessage() . " --- Line: " . $e->getLine()); + log_message('error', ' '); + log_message('error', ' ************************************* POST END **************************************** '); + log_message('error', ' '); + return $this->respond(['status' => 'failed', 'code' => 500, 'data' => "", 'message' => $e->getMessage()], 500); + } + } + + public function sendChangePasswordOTP() + { + log_message('error', ' '); + 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 { + $requestData = $this->request->getJSON(true); + + $email_id = $requestData['email_id'] ?? null; + $client_id = $requestData['client_id'] ?? null; + + if (!$email_id) { + return $this->respond(['status' => 'failed', 'code' => 400, 'data' => "", 'message' => 'Email ID is required'], 400); + } + + // Get employee details + $builder = $this->employeeModel + ->select('employees.id, employees.mobile, employees.email_corporate, employees.client_id') + ->join('employee_polices', 'employees.id = employee_polices.employee_id') + ->where('employees.is_active', 1) + ->whereIn('employees.emp_status', ['active']) + ->where('employee_polices.is_active', 1) + ->whereIn('employee_polices.status', ['active']) + ->where('employees.relationship', 'Self'); + + if (!empty($client_id)) { + $builder->where('employees.client_id', $client_id); + } + + if ($email_id) { + $builder->where('employees.email_corporate', $email_id); + } + + $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 + $otp = rand(100000, 999999); + + // Save OTP to DB (assuming 'otp' and 'otp_expiry' columns exist) + $this->employeeModel->update($employeeData['id'], [ + 'otp' => $otp, + ]); + + // Send OTP via SMS or Email (you can replace with your actual helper) + if ($email_id) { + // 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) { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - sendChangePasswordOTP: 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); + } + } + + // -------------- EMP MOBILE NUMBER UPDATE API'S ------------------------------------------------------------------------------------------------------------- + + public function updateMobileNumber() + { + log_message('error', ' '); + log_message('error', ' ************************************* UPDATE MOBILE START **************************************** '); + log_message('error', ' '); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateMobileNumber: Function called"); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateMobileNumber: Received payload = " . json_encode($this->request->getJSON() ?? [])); + + try { + + $payload = $this->request->getJSON(true); + + $email_id = $payload['email_id'] ?? null; + $client_id = $payload['client_id'] ?? null; + $new_mobile = $payload['new_mobile_number'] ?? null; + + if (empty($email_id) || empty($new_mobile)) { + return $this->respond([ + 'status' => 'failed', + 'code' => 400, + 'message' => 'Email ID and new mobile number are required' + ], 400); + } + + // Fetch employee by email + $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('employees.is_active', 1) + ->whereIn('employees.emp_status', ['active']) + ->where('employee_polices.is_active', 1) + ->whereIn('employee_polices.status', ['active']); + + if (!empty($client_id)) { + $builder->where('employees.client_id', $client_id); + } + + $employeeData = $builder->orderBy('employees.id', 'desc')->first(); + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateMobileNumber: employeeData: " . json_encode($employeeData ?? [])); + + if (!$employeeData) { + return $this->respond([ + 'status' => 'failed', + 'code' => 404, + 'message' => 'User not found with this Email ID' + ], 404); + } + + // Update mobile number + $updated = $this->employeeModel->update($employeeData['id'], [ + 'mobile' => $new_mobile, + ]); + + if ($updated) { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateMobileNumber: Mobile number updated successfully"); + log_message('error', ' '); + log_message('error', ' ************************************* UPDATE MOBILE END **************************************** '); + log_message('error', ' '); + + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'message' => 'Mobile number updated successfully' + ], 200); + } else { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateMobileNumber: Failed to update mobile number"); + return $this->respond([ + 'status' => 'failed', + 'code' => 500, + 'message' => 'Failed to update mobile number' + ], 500); + } + } catch (\Throwable $th) { + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateMobileNumber: Exception: " . $th->getMessage()); + log_message('error', ' '); + log_message('error', ' ************************************* UPDATE MOBILE END **************************************** '); + log_message('error', ' '); + return $this->respond([ + 'status' => 'failed', + 'code' => 500, + 'message' => $th->getMessage() + ], 500); + } + } } \ No newline at end of file diff --git a/app/Views/layout/footer.php b/app/Views/layout/footer.php index ab73284e..073a322f 100755 --- a/app/Views/layout/footer.php +++ b/app/Views/layout/footer.php @@ -1049,7 +1049,11 @@ $nav.find("li:first-child a").addClass("active active-tab"); // also need to find the tab name and show only active image - let tab_name = $nav.find("li:first-child a").attr('href').split('-')[0]; + // let tab_name = $nav.find("li:first-child a").attr('href').split('-')[0]; + + let href = $nav.find("li:first-child a").attr('href'); + let tab_name = href ? href.split('-')[0] : ''; + tab_name = tab_name.replace('#', '');