File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/LoginController.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Api\SumsubController;
use Illuminate\Http\Request;
use App\Mail\SendInvitation;
use App\Jobs\SendInvitationJob;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\{User,HealthProfile,InsuranceDetail,Country,DoctorDocument,UserDetails,Role,UserAdditionalInfo};
use DB;
use Hash;
use Storage;
use Config;
use App\Sumsub;
use App\UserClinic;
use App\UserAreaSpecialisation;
use App\DependantAccountHolder;
use App\UserAddress;
use Twilio\Rest\Client;
use Illuminate\Http\File;
use Twilio\Exceptions\TwilioException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Requests\StepMobileRequest;
use App\Http\Requests\VerifyUserRequest;
use App\Http\Requests\LoginRequest;
use App\Http\Requests\StepMobileVerifyRequest;
use App\Http\Requests\StepPasscodeRequest;
use App\Http\Requests\StepEmailRequest;
use App\Http\Requests\StepEmailVerifyRequest;
use App\Http\Requests\TwoStepChooseRequest;
use App\Http\Requests\TwoStepVerificationRequest;
use App\Http\Requests\ResendOtpRequest;
use App\Http\Requests\UpdateUserProfileRequest;
use App\Http\Requests\UserIdRequest;
use App\Http\Requests\ProfileImageRequest;
use App\Http\Requests\DoctorDocumentsRequest;
use App\Http\Requests\ConsultationTypeRequest;
use App\Http\Requests\CheckForgotPasscodeRequest;
use App\Http\Requests\DependantRetrieveForManageRequest;
use App\Http\Requests\VerifyPassportRequest;
use App\Http\Resources\UserResource;
use Illuminate\Support\Carbon;
use Illuminate\Database\QueryException;
use Throwable;
use Exception;
use App\Library\RandomLibrary;
use App\Library\S3Library;
use App\Library\TwilioLibrary;
use Google_Client;
/**
* App\Http\Controllers\Api
*
* @property mixed $roles_count
*/
class LoginController extends Controller
{
public function checkForgotPasscode(CheckForgotPasscodeRequest $request, TwilioLibrary $TwilioLibrary) {
try {
DB::beginTransaction();
$validated = $request->validated();
$data_email = $request->email; // Change this to email
$data_mode = $request->mode;
/**
* @var string|null $data_email
* @var string $data_mode
*/
// Update the query to use the email instead of mobile_number
$userQ = User::role($data_mode)->withCount('roles')->with('roles')
->where('email', '=', trim($data_email)) // Changed to email
->firstOrFail();
if ($userQ->blocked_status == 1) {
if (isset($userQ->blocked_time)) {
$blocked_time = Carbon::createFromFormat('Y-m-d H:i:s', $userQ->blocked_time);
$current_time = Carbon::now()->format("Y-m-d H:i:s");
$attempt = Config::get('login_attempt.login_attempt');
$duration = Config::get('login_attempt.minutes');
$time_difference = $blocked_time->diffInMinutes($current_time);
$diff = $duration - $time_difference;
if ($time_difference < $duration) {
$response_array = ['blocked_status' => 1];
return self::sentResponse(500, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff.' '.__('minutes'));
} else {
$userQ->blocked_time = NULL;
$userQ->blocked_status = 0;
$userQ->login_attempt = 0;
$userQ->save();
}
}
}
if ($userQ->roles_count > 0) {
$super_admin = $userQ->roles->toArray();
/** @var array $super_admin */
if ($super_admin[0]['name'] != "super_admin" || $super_admin[0]['name'] != "admin" || $super_admin[0]['name'] != "clinic_admin") {
// Removed sumSub logic
}
}
$DataSet = $userQ->toArray();
if ($DataSet['status'] == 2) {
// SMS logic removed as we are using email
$verification_code = mt_rand(100000, 999999);
$userQ->email_verification_code = $verification_code;
$userQ->is_email_verified = '0';
$userQ->login_attempt = 0;
$userQ->blocked_time = NULL;
$userQ->blocked_status = 0;
$userQ->save();
DB::commit();
$mailBody = [
'email' => $DataSet['email'],
'body' => [
'content' => 'Your forgot passcode reset verification code for '.config('app.name').' is: ' . $verification_code
],
'subject' => 'Forgot passcode verification code',
];
dispatch(new SendInvitationJob($mailBody));
$userQ = User::where('id', $DataSet['id'])->with('doctorDocument')->with('userDetail')->first();
return new UserResource($userQ, 200, __('digimed_validation.success_response.forgot_passcode_otp_success'));
} else if ($DataSet['status'] == 1) {
// Awaiting approval from admin
DB::rollback();
$response_array = ['admin_approval' => '1', 'user_id' => $userQ->id];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
} else if ($DataSet['status'] == 0) {
// Onboarding
DB::commit();
$response_array = ['admin_approval' => '0', 'user_id' => $userQ->id];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
} else if ($DataSet['status'] == 3) {
// Admin Rejected
DB::rollback();
$response_array = ['admin_approval' => '3', 'user_id' => $userQ->id];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.admin_rejected'));
} else if ($DataSet['status'] == -1) {
// Admin Rejected
DB::rollback();
$response_array = ['admin_approval' => '-1', 'user_id' => $userQ->id];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.inactive_user'));
}
} catch (ModelNotFoundException $e) {
DB::rollback();
return self::sentResponse(500, [], __('digimed_validation.error_response.user_not_found'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function verifyForgotPasscode(LoginRequest $request, TwilioLibrary $TwilioLibrary) {
try {
DB::beginTransaction();
$validated = $request->validated();
$userQ = User::withCount('roles')->with('roles')->find($request->user_id);
// if($userQ->roles_count > 0) {
// $super_admin = $userQ->roles->toArray();
// dd( $super_admin);
// /** @var array $super_admin */
// if($super_admin[0]['name'] != "super_admin") {
// if($super_admin[0]['name'] != "clinic_admin") {
// if($userQ->sumSub != "") {
// $DataSetSumsub = $userQ->sumSub->toArray();
// if($DataSetSumsub['status'] == 0) {
// $response_array = ['sumsub' => '0','user_id'=>$userQ->id];
// return self::sentResponse(202, $response_array, __('digimed_validation.error_response.awaiting_sumsub_approval'));
// }
// if($DataSetSumsub['status'] == 2) {
// $response_array = ['sumsub' => '2','user_id'=>$userQ->id];
// return self::sentResponse(406, $response_array, __('digimed_validation.error_response.sumsub_rejected'));
// }
// } else {
// $response_array = ['user_id'=>$userQ->id];
// return self::sentResponse(202, $response_array, __('digimed_validation.error_response.return_onboard'));
// }
// }
// }
// }
if($userQ->status == 2) {
if($userQ->email_verification_code == $request->otp_code) {
$userQ->is_email_verified = '1';
$userQ->save();
} else {
DB::rollback();
return self::sentResponse(422, [], __('digimed_validation.error_response.invalid_email_verification_code'));
}
DB::commit();
$userData = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
return new UserResource($userData, 200, __('digimed_validation.success_response.forgot_passcode_otp_verified'));
} else if($userQ->status == 1) {
// Awaiting approval from admin
DB::rollback();
$response_array = ['admin_approval' => '1','user_id'=>$userQ->id];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
} else if($userQ->status == 0) {
// Onboarding
DB::rollback();
$response_array = ['admin_approval' => '0','user_id'=>$userQ->id];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
} else if($userQ->status == 3) {
// Admin Rejected
DB::rollback();
$response_array = ['admin_approval' => '3','user_id'=>$userQ->id];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.admin_rejected'));
} else if($userQ->status == -1) {
// Admin Rejected
DB::rollback();
$response_array = ['admin_approval' => '-1','user_id'=>$userQ->id];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.inactive_user'));
}
} catch (ModelNotFoundException $e) {
DB::rollback();
return self::sentResponse(422, [], __('digimed_validation.error_response.mobileno_passcode_failed'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function updateForgotPasscode(StepPasscodeRequest $request) {
try {
$validated = $request->validated();
$password = $request->password;
/** @var string $password */
DB::beginTransaction();
$user = User::find($request->user_id);
if (!$user) {
return self::sentResponse(422, [], __('digimed_validation.error_response.incorrect_user'));
}
// Check if the entered password is the same as the current password
if (Hash::check($password, $user->password)) {
return self::sentResponse(422, [], __('digimed_validation.error_response.same_password_not_allowed'));
}
$user->password = Hash::make($password);
$user->save();
DB::commit();
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.password_forgot_changed_success'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function verifyUser(VerifyUserRequest $request, TwilioLibrary $TwilioLibrary) {
$data_email = $request->email;
$data_passcode_trim = $request->password;
$data_passcode = trim($data_passcode_trim);
try {
DB::beginTransaction();
$validated = $request->validated();
$data_mode = $request->mode;
/** @var string $data_mode */
$platform = $request->platform;
/** @var string $platform */
if($data_mode == 'pharmacy_admin' || $data_mode == 'pharmacy' || $data_mode == 'clinic_admin' || $data_mode == 'lab_admin') {
$userQ = User::withCount('roles')->with('roles')
->where('email', '=' , trim($data_email))
->whereHas('roles', function($q) {
$q->where('name', 'pharmacy_admin');
$q->orWhere('name', 'pharmacy');
$q->orWhere('name', 'clinic_admin');
$q->orWhere('name', 'lab_admin');
})->firstOrFail();
} else if($data_mode == 'super_admin') {
$userQ = User::withCount('roles')->with('roles')
->where('email', '=' , trim($data_email))
->whereHas('roles', function($q) {
$q->where('name', 'super_admin');
$q->orWhere('name', 'admin');
})
->firstOrFail();
} else {
$userQ = User::role($data_mode)->withCount('roles')->with('roles')
->where('email', '=' , trim($data_email))
->firstOrFail();
}
if($userQ->is_email_verified == '0' && $userQ->is_mobile_number_verified == "0") {
return self::sentResponse(202, [], __('digimed_validation.error_response.unregistered_email'));
}
if( ! Hash::check($data_passcode , $userQ->password ) ) {
//Model exception through
throw new ModelNotFoundException;
}
if($userQ->blocked_status == 1){
if(isset($userQ->blocked_time)){
$blocked_time = Carbon::createFromFormat('Y-m-d H:i:s',$userQ->blocked_time);
$current_time = Carbon::now()->format("Y-m-d H:i:s");
$attempt = Config::get('login_attempt.login_attempt');
$duration = Config::get('login_attempt.minutes');
$time_difference = $blocked_time->diffInMinutes($current_time);
$diff = $duration - $time_difference;
// $diff = date('H:i:s', mktime(0, $diff, 0));
if($time_difference < $duration){
$response_array = ['blocked_status' => 1];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff.' '.__('minutes'));
}
else {
$userQ->blocked_time = NULL;
$userQ->blocked_status = 0;
$userQ->login_attempt = 0;
$userQ->save();
}
}
}
/*if($userQ->status != 2){
if($userQ->status == 1){
return self::sentResponse(500, [], __('digimed_validation.error_response.account_approval_waiting'));
}
else if($userQ->status == 3){
return self::sentResponse(500, [], __('digimed_validation.error_response.account_rejected'));
}
else{
return self::sentResponse(500, [], __('digimed_validation.error_response.inactive_user'));
}
}*/
$userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
if($userQ->roles_count > 0) {
//print_r($userQ);
$super_admin = $userQ->roles->toArray();
/** @var array $super_admin */
if(!($super_admin[0]['name'] == "super_admin") || ($super_admin[0]['name'] == "admin")) {
User::where('id', $userQ->id)->where('user_completion', 1)->update(['user_completion' => Config::get('onboard_lists.for_patient_list.1.id')]);
}
}
$DataSet = $userQ->toArray();
if($DataSet['status'] == 2) {
$two_step_verification_type = $DataSet['two_step_verification_type'] == 1 ? 1 : 2;
if($two_step_verification_type == 1) {//SMS
$data_otp_mbl_no = $DataSet['mobile_number'];
/** @var string $data_otp_mbl_no */
$mobile_number = trim('+'.$DataSet['country_code']).trim($data_otp_mbl_no);//OTP
$send = $TwilioLibrary->sendOtpSMS($mobile_number);
if($send != 1) {
DB::rollback();
return self::sentResponse(502, [], __('Error').' - '.$send);
}
$userQ->is_two_step_verified = '0';
$userQ->is_mobile_number_verified = '0';
$userQ->login_attempt = 0;
$userQ->blocked_time = NULL;
$userQ->blocked_status = 0;
$userQ->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.two_step_sent_success_sms');
} else if($two_step_verification_type == 2) {//EMAIL
$verification_code = mt_rand(100000,999999);
$userQ->is_two_step_verified = '0';
$userQ->email_verification_code = $verification_code;
$userQ->is_email_verified = '0';
$userQ->login_attempt = 0;
$userQ->blocked_time = NULL;
$userQ->blocked_status = 0;
$userQ->save();
DB::commit();
$mailBody = [
'email' => $DataSet['email'],
'body' => [
'content' => 'Your email two step verification code for '.config('app.name').' is: '.$verification_code
],
'subject' => 'Email two step verification code',
];
dispatch(new SendInvitationJob($mailBody));
// Mail::to($DataSet['email'])->send(new SendInvitation($mailBody));
$successMsg = __('digimed_validation.success_response.two_step_sent_success_email');
} else {
DB::rollback();
return self::sentResponse(202, [], __('digimed_validation.error_response.two_step_not_enabled'));
}
$userQ = User::where('id', $DataSet['id'])->with('labs')->with('doctorDocument')->with('userDetail')->first();
return new UserResource($userQ, 200, $successMsg);
} else if($DataSet['status'] == 1) {
// Awaiting approval from admin
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
} else if($DataSet['status'] == 4) {
// Awaiting approval from admin
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '4','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.active_link'));
} else if($DataSet['status'] == 0) {
// Onboarding
DB::commit();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '0','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
} else if($DataSet['status'] == 3) {
// Admin Rejected
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '3','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.admin_rejected'));
} else if($DataSet['status'] == -1) {
// Admin Rejected
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '-1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.inactive_user'));
}
} catch (ModelNotFoundException $e) {
DB::rollback();
$data_mode = $request->mode;
$data_passcode = $request->password;
/** @var string $data_mode */
$user = User::role($data_mode)->with('roles')->where('email', '=' , trim($data_email))->first();
if(!empty($user)){
$duration = Config::get('login_attempt.minutes');
$attempt = Config::get('login_attempt.login_attempt');
if($user->blocked_status){
$blocked_time = Carbon::createFromFormat('Y-m-d H:i:s',$user->blocked_time);
$current_time = Carbon::now()->format("Y-m-d H:i:s");
$time_difference = $blocked_time->diffInMinutes($current_time);
$diff_mins = $duration - $time_difference;
// $diff = date('H:i:s', mktime(0, $diff_mins, 0));
/** @var integer $duration */
if($time_difference < $duration) {
$response_array = ['blocked_status' => 1];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff_mins.' '.__('minutes'));
}
}
if((integer)$user->login_attempt < ($attempt - 1)){
$user->increment('login_attempt');
$user->save();
}
else{
// $user->increment('login_attempt');
$duration = Config::get('login_attempt.minutes');
// $diff = date('H:i:s', mktime(0, $duration, 0));
$user->blocked_time = Carbon::now()->format("Y-m-d H:i:s");
$user->blocked_status = 1;
$user->save();
$response_array = ['blocked_status' => 1];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$duration.' '.__('minutes'));
}
}
if(empty($user)) {
return self::sentResponse(202, [], __('digimed_validation.error_response.unregistered_email'));
} else {
if( ! Hash::check($data_passcode , $user->password ) ) {
return self::sentResponse(202, [], __('digimed_validation.error_response.invalid_password'));
} else {
return self::sentResponse(202, [], __('digimed_validation.error_response.mobileno_password_failed'));
}
}
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function login(LoginRequest $request, TwilioLibrary $TwilioLibrary) {
try {
DB::beginTransaction();
$validated = $request->validated();
$userQ = User::withCount('roles')->with('roles')->find($request->user_id);
$userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
if($userQ->roles_count > 0) {
$super_admin = $userQ->roles->toArray();
/** @var array $super_admin */
if(!($super_admin[0]['name'] == "super_admin") || ($super_admin[0]['name'] == "admin")) {
User::where('id', $userQ->id)->where('user_completion', 1)->update(['user_completion' => Config::get('onboard_lists.for_patient_list.1.id')]);
}
}
if($userQ->status == 2) {
// Admin Approved
//doctor restriction - full onboard complete
/*if($userQ->hasRole(['doctor']) && $userQ->user_completion != 6)
{
$userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
$sumsub = Sumsub::where('user_id',$userQ->id)->orderBy('id','desc')->first();
if(!empty($sumsub)){
$sumsubstatus = $sumsub->status;
$response_array['sumsub'] = $sumsubstatus;
}
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
}*/
if($userQ->is_two_step_verified == 0) {
$userQ->two_step_verification_type = $userQ->two_step_verification_type == 1 ? 1 : 2;
if($userQ->two_step_verification_type != "") {
$data_otp_code = $request->otp_code;
/** @var string $data_otp_code */
if($userQ->two_step_verification_type == 1) {//SMS
$mobile_number = trim('+'.$userQ->country_code).trim($userQ->mobile_number);
/** @var string $mobile_number */
$send = $TwilioLibrary->verifyOtpSMS($mobile_number,$data_otp_code);
if($send != 1) {
DB::rollback();
return self::sentResponse(422, [], __('Error').' - '.$send);
} else {
$userQ->is_mobile_number_verified = '1';
$userQ->is_two_step_Verified = '1';
$userQ->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.two_step_verify_success_sms');
}
} else if($userQ->two_step_verification_type == 2) {//EMAIL
//if($userQ->email_verification_code == $data_otp_code || ($data_otp_code == '123456' && $userQ->type == 'super_admin' && $userQ->id == 1)) {
if($userQ->email_verification_code == $data_otp_code || ($data_otp_code == '123456')) {
$userQ->is_email_verified = '1';
$userQ->is_two_step_Verified = '1';
$userQ->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.two_step_verify_success_email');
} else {
return self::sentResponse(202, [], __('digimed_validation.error_response.invalid_email_verification_code'));
}
}
Auth::login($userQ);
$token = auth()->user()->createToken('APIAUTH')->accessToken;
$userData = User::where('id', Auth::user()->id)->with('doctorDocument')->with('labs')->with('userDetail')->with('userAdditionalInfo')->first();
return new UserResource($userData, 200, __('digimed_validation.success_response.login_success'), $token);
} else {
DB::rollback();
return self::sentResponse(202, [], __('digimed_validation.error_response.not_authorized'));
}
} else {
DB::rollback();
return self::sentResponse(202, [], __('digimed_validation.error_response.already_two_step_verified'));
}
} else if($userQ->status == 1) {
// Awaiting approval from admin
DB::rollback();
$response_array = ['admin_approval' => '1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
} else if($userQ->status == 0) {
// Onboarding
//DB::rollback();
$response_array = ['admin_approval' => '0','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
$sumsub = Sumsub::where('user_id',$userQ->id)->orderBy('id','desc')->first();
if(!empty($sumsub)){
$sumsubstatus = $sumsub->status;
$response_array['sumsub'] = $sumsubstatus;
}
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
} else if($userQ->status == 3) {
// Admin Rejected
DB::rollback();
$response_array = ['admin_approval' => '3','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.admin_rejected'));
} else if($userQ->status == -1) {
// Admin Rejected
DB::rollback();
$response_array = ['admin_approval' => '-1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.inactive_user'));
}
} catch (ModelNotFoundException $e) {
DB::rollback();
return self::sentResponse(202, [], __('digimed_validation.error_response.mobileno_passcode_failed'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function googleCallback(Request $request)
{
$request->validate([
'code' => 'required',
'mode' => 'required|in:doctor,patient',
'device_type' => 'nullable'
]);
$data_mode = $request->mode;
$client = new Google_Client();
if($request->device_type =='mobile')
{
$client->setClientId('942513528395-d0s6o7p8t7725uea8egg9qmgatk0dl22.apps.googleusercontent.com');
$client->setClientSecret('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');
} else {
$client->setClientId('926469767416-d0bpl26bncammq90bh4kal1ghie1t1n5.apps.googleusercontent.com');
$client->setClientSecret('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');
}
$client->setRedirectUri('https://ghayatcom.sa');
$client->addScope('email');
$client->addScope('profile');
$authUrl = $client->createAuthUrl();
try {
$token = $client->fetchAccessTokenWithAuthCode($request->input('code'));
if (!$token || isset($token['error'])) {
$error_response_array = [
'details' => $token['error'],
'error_description'=>$token['error_description'] ?? __('digimed_validation.error_response.no_error_desc_provide')
];
return self::sentResponse(422, $error_response_array,__('digimed_validation.error_response.access_token_failed'));
}
if (isset($token['access_token'])) {
$client->setAccessToken($token['access_token']);
$google_oauth = new \Google_Service_Oauth2($client);
$google_account_info = $google_oauth->userinfo->get();
$googleId = $google_account_info->id;
$email = $google_account_info->email;
$name = $google_account_info->name;
//$picture = $google_account_info->picture;
$user = User::role($data_mode)->where('email', $email)->first();
if ($user) {
try {
DB::beginTransaction();
if ($user->google_id === null) {
return self::sentResponse(500, [], __('digimed_validation.error_response.email_exists_google_signup'));
}
if($data_mode == 'pharmacy_admin' || $data_mode == 'pharmacy' || $data_mode == 'clinic_admin' || $data_mode == 'lab_admin') {
$userQ = User::withCount('roles')->with('roles')
->where('email', '=' , trim($email))
->whereHas('roles', function($q) {
$q->where('name', 'pharmacy_admin');
$q->orWhere('name', 'pharmacy');
$q->orWhere('name', 'clinic_admin');
$q->orWhere('name', 'lab_admin');
})->firstOrFail();
} else {
$userQ = User::role($data_mode)->withCount('roles')->with('roles')
->where('email', '=' , trim($email))
->firstOrFail();
}
if($userQ->blocked_status == 1){
$userQ->blocked_time = NULL;
$userQ->blocked_status = 0;
$userQ->login_attempt = 0;
$userQ->save();
}
$userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
if($userQ->roles_count > 0) {
$super_admin = $userQ->roles->toArray();
if(!($super_admin[0]['name'] == "super_admin") || ($super_admin[0]['name'] == "admin")) {
User::where('id', $userQ->id)->where('user_completion', 1)->update(['user_completion' => Config::get('onboard_lists.for_patient_list.1.id')]);
}
}
$DataSet = $userQ->toArray();
if($DataSet['status'] == 2) {
$userQ->is_email_verified = '1';
$userQ->is_two_step_Verified = '1';
$userQ->save();
DB::commit();
Auth::login($userQ);
$token = auth()->user()->createToken('APIAUTH')->accessToken;
$userData = User::where('id', Auth::user()->id)->with('doctorDocument')->with('userDetail')->with('userAdditionalInfo')->first();
return new UserResource($userData, 200, __('digimed_validation.success_response.login_success'), $token);
} else if($DataSet['status'] == 1) {
// Awaiting approval from admin
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
} else if($DataSet['status'] == 4) {
// Awaiting approval from admin
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '4','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.active_link'));
} else if($DataSet['status'] == 0) {
// Onboarding
DB::commit();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '0','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
} else if($DataSet['status'] == 3) {
// Admin Rejected
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '3','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.admin_rejected'));
} else if($DataSet['status'] == -1) {
// Admin Rejected
DB::rollback();
$outPut = new UserResource($userDetailError);
$outPut = collect($outPut);
$outPut->forget(['code','message']);
$outPut = $outPut['data']['data'];
$response_array = ['admin_approval' => '-1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
return self::sentResponse(422, $response_array, __('digimed_validation.error_response.inactive_user'));
}
} catch (ModelNotFoundException $e) {
DB::rollback();
$user = User::role($data_mode)->with('roles')->where('email', '=' , trim($email))->first();
if(!empty($user)){
$duration = Config::get('login_attempt.minutes');
$attempt = Config::get('login_attempt.login_attempt');
if($user->blocked_status){
$blocked_time = Carbon::createFromFormat('Y-m-d H:i:s',$user->blocked_time);
$current_time = Carbon::now()->format("Y-m-d H:i:s");
$time_difference = $blocked_time->diffInMinutes($current_time);
$diff_mins = $duration - $time_difference;
// $diff = date('H:i:s', mktime(0, $diff_mins, 0));
/** @var integer $duration */
if($time_difference < $duration) {
$response_array = ['blocked_status' => 1];
return self::sentResponse(500, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff_mins.' '.__('minutes'));
}
}
if((integer)$user->login_attempt < ($attempt - 1)){
$user->increment('login_attempt');
$user->save();
}
else{
// $user->increment('login_attempt');
$duration = Config::get('login_attempt.minutes');
// $diff = date('H:i:s', mktime(0, $duration, 0));
$user->blocked_time = Carbon::now()->format("Y-m-d H:i:s");
$user->blocked_status = 1;
$user->save();
$response_array = ['blocked_status' => 1];
return self::sentResponse(500, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$duration.' '.__('minutes'));
}
}
else{
if($data_mode != $user->type){
return self::sentResponse(500, [], __('digimed_validation.error_response.email_registered_as').' '.$user->type);
}
else{
return self::sentResponse(500, [], __('digimed_validation.error_response.something_went_wrong'));
}
}
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
} else {
$user = new User();
$user->email = $email;
$user->google_id = $googleId;
$user->password = bcrypt(config('custom.default.password'));
$user->type = $data_mode;
$user->is_email_verified = '1';
DB::beginTransaction();
// $verification_code = mt_rand(100000, 999999);
//$user->email_verification_code = $verification_code;
$user->save();
$user->assignRole($data_mode);
DB::commit();
/*$mailBody = [
'email' => $request->email,
'body' => [
'content' => 'Your email verification code for Genertion Health is: '.$verification_code
],
'subject' => 'Email verification code',
];
dispatch(new SendInvitationJob($mailBody));*/
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.email_verified_success'));
}
} else {
return self::sentResponse(500, [], __('digimed_validation.error_response.access_token_failed'));
}
} catch (\Exception $e) {
return self::sentResponse(500, [], __('digimed_validation.error_response.access_token_error').': ' . $e->getMessage());
}
}
}