nhance_partner_be/app/Controllers/StaffAuthController.php

243 lines
9.1 KiB
PHP

<?php
namespace App\Controllers;
use CodeIgniter\RESTful\ResourceController;
use App\Models\StaffModel;
use App\Models\StaffAttendanceModel;
class StaffAuthController extends ResourceController
{
protected $format = 'json';
protected $myLogger;
protected $StaffModel;
protected $StaffAttendanceModel;
public function __construct()
{
helper('jwt_helper');
helper('oauth_helper');
$this->myLogger = \Config\Services::mylogger();
$this->StaffModel = new StaffModel();
$this->StaffAttendanceModel = new StaffAttendanceModel();
}
public function verifyStaffWithMobileNumber()
{
try {
$mobile = $this->request->getJSON()->mobile;
$StaffData = $this->StaffModel->where('mobile', $mobile)->where('is_active', 1)->first();
if (isset($StaffData['id']))
{
if (env('CI_ENVIRONMENT') === 'development') {
$otp = 123456; // Static OTP for development
} else {
$otp = random_int(100000, 999999);
}
$update = $this->StaffModel->where('mobile', $mobile)->where('is_active', 1)->set(['email_otp' => $otp])->update();
if ($update) {
// Skip SMS in development
if (env('CI_ENVIRONMENT') === 'development') {
$result = ['Staff_verification' => true, 'message' => "Verified Successfully (DEV MODE - OTP: 123456)" ];
return $this->respond(['status' => 'success','code' => 200,'data' => $result], 200);
}
$SMSResult = sendOtpSms($mobile,$otp);
if ($SMSResult['status'] == 'success') {
$result = ['Staff_verification' => true, 'message' => "Verified Successfully"];
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200);
} else {
$result = ['Staff_verification' => false, 'message' => "Mail sending failed , try again"];
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => $result], 200);
}
} else {
$result = ['Staff_verification' => false, 'message' => "Verification failed , try again"];
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => $result], 200);
}
} else {
$result = ['Staff_verification' => false , 'message' => "User not found"];
return $this->respond(['status' => 'failed','code' => 404,'data' => $result],200);
}
} catch (\Throwable $th) {
return $this->respond(['status' => 'failed','code' => 500,'data' => $th],500);
}
}
public function verifyStaffWithEmailId()
{
try {
$email = $this->request->getJSON()->email;
$StaffData = $this->StaffModel->where('email', $email)->where('is_active', 1)->first();
if (isset($StaffData['id'])) {
if (env('CI_ENVIRONMENT') === 'development') {
$otp = 123456; // Static OTP for development
} else {
$otp = random_int(100000, 999999);
}
$update = $this->StaffModel->where('email', $email)->where('is_active', 1)->set(['email_otp' => $otp])->update();
if ($update) {
// Skip SMS in development
if (env('CI_ENVIRONMENT') === 'development') {
$result = ['Staff_verification' => true, 'message' => "Verified Successfully (DEV MODE - OTP: 123456)" ];
return $this->respond(['status' => 'success','code' => 200,'data' => $result], 200);
}
$EmailResult = trigger_email('login_otp',['email'=>$email, 'name'=>$StaffData['name'], 'otp'=>$otp, ]);
if ($EmailResult['status'] == 'success') {
$result = ['Staff_verification' => true, 'message' => "Verified Successfully"];
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result], 200);
} else {
$result = ['Staff_verification' => false, 'message' => "Mail sending failed , try again"];
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => $result], 200);
}
} else {
$result = ['Staff_verification' => false, 'message' => "Verification failed , try again"];
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => $result], 200);
}
} else {
$result = ['Staff_verification' => false, 'message' => "User not found"];
return $this->respond(['status' => 'failed', 'code' => 404, 'data' => $result], 200);
}
} catch (\Throwable $th) {
return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $th], 500);
}
}
public function getVerifiedStaffData()
{
try {
$mobile = isset($this->request->getJSON()->mobile) ? $this->request->getJSON()->mobile : null;
$email = isset($this->request->getJSON()->email) ? $this->request->getJSON()->email : null;
$otp = isset($this->request->getJSON()->otp) ? $this->request->getJSON()->otp : null;
if (isset($mobile))
{
$StaffData = $this->StaffModel->where('mobile', $mobile)->where('is_active', 1)->where('email_otp', $otp)->first();
} else {
$StaffData = $this->StaffModel->where('email', $email)->where('email_otp', $otp)->where('is_active', 1)->first();
}
if ($StaffData && isset($this->request->getJSON()->otp) ) {
$this->StaffModel->where('id', $StaffData['id'])->where('email_otp', $otp)->where('is_active', 1)->set(['email_otp'=>null])->update();
// Attendance check or insert
$today = date('Y-m-d');
$existingAttendance = $this->StaffAttendanceModel->where('staff_id', $StaffData['id'])->where('DATE(login_datetime)', $today)->first();
if (!$existingAttendance) {
// New login for today
$this->StaffAttendanceModel->insert(['staff_id' => $StaffData['id'],'login_datetime' => date('Y-m-d H:i:s'),'manager_id'=>$StaffData['manager_id']]);
$lastLoginTime = date('Y-m-d H:i:s');
} else {
// Already logged in today, reuse last login time
$lastLoginTime = $existingAttendance['login_datetime'];
}
// Add last login info to JWT
$StaffData['last_login_datetime'] = $lastLoginTime;
$result = generateJWT($StaffData);
return $this->respond(['status' => 'success','code' => 200,'data' => $result],200);
} else {
return $this->respond(['status' => 'failed','code' => 404,'data' => 'Please try again'],200);
}
} catch (\Exception $e) {
return $this->respond(['status' => 'failed','code' => 500,'data' =>[], 'error' => $e->getMessage()],500);
}
}
public function logout()
{
$header = $this->request->getHeaderLine('Authorization'); // Get the full header
if (!$header || !preg_match('/Bearer\s(\S+)/', $header, $matches)) {
return service('response')->setJSON(['status' => 401, 'message' => 'Token required'])->setStatusCode(401);
}
$decodedToken = validateJWT($matches[1]);
$userId = $decodedToken['data']->id ?? null;
$lastLogin = $decodedToken['data']->last_login_datetime ?? null;
if ($userId && $lastLogin) {
$lastLoginDate = date('Y-m-d', strtotime($lastLogin));
$todayDate = date('Y-m-d');
$attendanceModel = new \App\Models\StaffAttendanceModel();
// Find attendance record
$attendance = $attendanceModel
->where('staff_id', $userId)
->where('DATE(login_datetime)', $lastLoginDate)
->first();
if ($attendance) {
$attendanceModel->update($attendance['id'], [
'logout_datetime' => date('Y-m-d H:i:s')
]);
}
log_message('info', sprintf(
'logout triggered for Staff ID: %s. Previous login date: %s, Current date: %s, Logout time updated at: %s',
$userId,
$lastLoginDate,
$todayDate,
date('Y-m-d H:i:s')
));
}
return $this->respond([
'status' => 200,
'message' => 'Logout successful'
], 200);
}
}