HEX
Server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips PHP/5.6.40
System: Linux ip-172-31-40-18 4.14.146-93.123.amzn1.x86_64 #1 SMP Tue Sep 24 00:45:23 UTC 2019 x86_64
User: apache (48)
PHP: 5.6.40
Disabled: NONE
Upload Files
File: //var/www/html/punjabcabs/Original_Backup/app/Http/Controllers/ProviderAuth/TokenController.php
<?php

namespace App\Http\Controllers\ProviderAuth;

use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Controller;

use Tymon\JWTAuth\Exceptions\JWTException;
use App\Notifications\ResetPasswordOTP;

use Auth;
use Config;
use JWTAuth;
use Setting;
use Notification;
use Validator;
use Socialite;
use Twilio;
use Mail;

use App\Provider;
use App\ProviderDevice;
use App\ProviderService;
/*** for street ride.*/
use App\ServiceType;
use App\User;
use App\UserRequests;
use App\Helpers\Helper;
use Carbon\Carbon;
use App\RequestFilter;

class TokenController extends Controller
{
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function register(Request $request)
    {
        $this->validate($request, [
                'device_id' => 'required',
                'device_type' => 'required|in:android,ios',
                'device_token' => 'required',
                'first_name' => 'required|max:255',
                'last_name' => 'required|max:255',
                'email' => 'required|email|max:255|unique:providers',
                'mobile' => 'required',
                'password' => 'required|min:6',
            ]);

        try{

            $Provider = $request->all();
            $Provider['password'] = bcrypt($request->password);

            $Provider = Provider::create($Provider);

            // send welcome email here
            if(Setting::get('mail_enable', 0) == 1) {
                $user = $request->all();
                Mail::send('emails.driver-register', ['user' => $user], function ($message) use ($user){
                    $message->to($user['email'], $user['first_name'])->subject(config('app.name').' Driver Registration');
                });
            }

            return $Provider;


        } catch (QueryException $e) {
            if ($request->ajax() || $request->wantsJson()) {
                return response()->json(['error' => 'Something went wrong, Please try again later!'], 500);
            }
            return abort(500);
        }
        
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function authenticate(Request $request)
    {
        $this->validate($request, [
                'device_id' => 'required',
                'device_type' => 'required|in:android,ios',
                'device_token' => 'required',
                'email' => 'required|email',
                'password' => 'required|min:6',
            ]);

        Config::set('auth.providers.users.model', 'App\Provider');

        $credentials = $request->only('email', 'password');

        try {
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['error' => 'The email address or password you entered is incorrect.'], 401);
            }
        } catch (JWTException $e) {
            return response()->json(['error' => 'Something went wrong, Please try again later!'], 500);
        }

        $User = Provider::with('service', 'device')->find(Auth::user()->id);
        $User->access_token = $token;
        $User->currency = Setting::get('currency', '$');
        $User->sos = Setting::get('sos_number', '911');

        if($User->device) {
            /*$checker = ProviderService::where('provider_id',Auth::user()->id)->get()->first();
            if($checker->status !='offline'){
                return response()->json(['error' => 'You are Already logged In'], 401);
            }*/
            ProviderDevice::where('id',$User->device->id)->update([
                'udid' => $request->device_id,
                'token' => $request->device_token,
                'type' => $request->device_type,
            ]);
            
        } else {
            ProviderDevice::create([
                    'provider_id' => $User->id,
                    'udid' => $request->device_id,
                    'token' => $request->device_token,
                    'type' => $request->device_type,
                ]);
        }
    Provider::where('id',$User->id)->update(['login_at' => Carbon::now(),'login_status' =>1]);
        return response()->json($User);
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function logout(Request $request)
    {
        try {
            ProviderDevice::where('provider_id', $request->id)->update(['udid'=> '', 'token' => '']);
            ProviderService::where('provider_id',$request->id)->update(['status' => 'offline']);
            Provider::where('id', $request->id)->update(['logout_at' => Carbon::now(),'login_status' =>0]);
            return response()->json(['message' => trans('api.logout_success')]);
        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }

 /**
     * Forgot Password.
     *
     * @return \Illuminate\Http\Response
     */


    public function forgot_password(Request $request){

        $this->validate($request, [
                'email' => 'required|email|exists:providers,email',
            ]);

        try{  
            
            $provider = Provider::where('email' , $request->email)->first();

            $otp = mt_rand(100000, 999999);

            $provider->otp = $otp;
            $provider->save();

            Notification::send($provider, new ResetPasswordOTP($otp));

            //sms
            if(Setting::get('sms_enable', 0) == 1) {
                $mobile = $provider->mobile;
                $message = 'Kindly note your OTP : '.$otp.' Regards '.config('app.name'); 
                try {
                        Twilio::message($mobile, $message);
                    } catch ( \Services_Twilio_RestException $e ) {
                        //return $e->getMessage();  
                    }
            }
            return response()->json([
                'message' => 'OTP sent to your email and Mobile!',
                'provider' => $provider
            ]);

        }catch(Exception $e){
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }


    /**
     * Reset Password.
     *
     * @return \Illuminate\Http\Response
     */

    public function reset_password(Request $request){

        $this->validate($request, [
                'password' => 'required|confirmed|min:6',
                'id' => 'required|numeric|exists:providers,id'
            ]);

        try{

            $Provider = Provider::findOrFail($request->id);
            $Provider->password = bcrypt($request->password);
            $Provider->save();

            if($request->ajax()) {
                return response()->json(['message' => 'Password Updated']);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function facebookViaAPI(Request $request) { 

        $validator = Validator::make(
            $request->all(),
            [
                'device_type' => 'required|in:android,ios',
                'device_token' => 'required',
                'accessToken'=>'required',
                'device_id' => 'required',
                'login_by' => 'required|in:manual,facebook,google'
            ]
        );
        
        if($validator->fails()) {
            return response()->json(['status'=>false,'message' => $validator->messages()->all()]);
        }
        $user = Socialite::driver('facebook')->stateless();
        $FacebookDrive = $user->userFromToken( $request->accessToken);
       
        try{
            $FacebookSql = Provider::where('social_unique_id',$FacebookDrive->id);
            if($FacebookDrive->email !=""){
                $FacebookSql->orWhere('email',$FacebookDrive->email);
            }
            $AuthUser = $FacebookSql->first();
            if($AuthUser){ 
                $AuthUser->social_unique_id=$FacebookDrive->id;
                $AuthUser->login_by="facebook";
                $AuthUser->save();  
            }else{   
                $AuthUser["email"]=$FacebookDrive->email;
                $name = explode(' ', $FacebookDrive->name, 2);
                $AuthUser["first_name"]=$name[0];
                $AuthUser["last_name"]=isset($name[1]) ? $name[1] : '';
                $AuthUser["password"]=bcrypt($FacebookDrive->id);
                $AuthUser["social_unique_id"]=$FacebookDrive->id;
                $AuthUser["avatar"]=$FacebookDrive->avatar;
                $AuthUser["login_by"]="facebook";
                $AuthUser = Provider::create($AuthUser);

                if(Setting::get('demo_mode', 0) == 1) {
                    $AuthUser->update(['status' => 'approved']);
                    ProviderService::create([
                        'provider_id' => $AuthUser->id,
                        'service_type_id' => '1',
                        'status' => 'active',
                        'service_number' => '4pp03ets',
                        'service_model' => 'Audi R8',
                    ]);
                }
            }    
            if($AuthUser){ 
                $userToken = JWTAuth::fromUser($AuthUser);
                $User = Provider::with('service', 'device')->find($AuthUser->id);
                if($User->device) {
                    ProviderDevice::where('id',$User->device->id)->update([
                        
                        'udid' => $request->device_id,
                        'token' => $request->device_token,
                        'type' => $request->device_type,
                    ]);
                    
                } else {
                    ProviderDevice::create([
                        'provider_id' => $User->id,
                        'udid' => $request->device_id,
                        'token' => $request->device_token,
                        'type' => $request->device_type,
                    ]);
                }
                return response()->json([
                            "status" => true,
                            "token_type" => "Bearer",
                            "access_token" => $userToken,
                            'currency' => Setting::get('currency', '$'),
                            'sos' => Setting::get('sos_number', '911')
                        ]);
            }else{
                return response()->json(['status'=>false,'message' => "Invalid credentials!"]);
            }  
        } catch (Exception $e) {
            return response()->json(['status'=>false,'message' => trans('api.something_went_wrong')]);
        }
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function googleViaAPI(Request $request) { 

        $validator = Validator::make(
            $request->all(),
            [
                'device_type' => 'required|in:android,ios',
                'device_token' => 'required',
                'accessToken'=>'required',
                'device_id' => 'required',
                'login_by' => 'required|in:manual,facebook,google'
            ]
        );
        
        if($validator->fails()) {
            return response()->json(['status'=>false,'message' => $validator->messages()->all()]);
        }
        $user = Socialite::driver('google')->stateless();
        $GoogleDrive = $user->userFromToken( $request->accessToken);
       
        try{
            $GoogleSql = Provider::where('social_unique_id',$GoogleDrive->id);
            if($GoogleDrive->email !=""){
                $GoogleSql->orWhere('email',$GoogleDrive->email);
            }
            $AuthUser = $GoogleSql->first();
            if($AuthUser){
                $AuthUser->social_unique_id=$GoogleDrive->id;  
                $AuthUser->login_by="google";
                $AuthUser->save();
            }else{   
                $AuthUser["email"]=$GoogleDrive->email;
                $name = explode(' ', $GoogleDrive->name, 2);
                $AuthUser["first_name"]=$name[0];
                $AuthUser["last_name"]=isset($name[1]) ? $name[1] : '';
                $AuthUser["password"]=($GoogleDrive->id);
                $AuthUser["social_unique_id"]=$GoogleDrive->id;
                $AuthUser["avatar"]=$GoogleDrive->avatar;
                $AuthUser["login_by"]="google";
                $AuthUser = Provider::create($AuthUser);

                if(Setting::get('demo_mode', 0) == 1) {
                    $AuthUser->update(['status' => 'approved']);
                    ProviderService::create([
                        'provider_id' => $AuthUser->id,
                        'service_type_id' => '1',
                        'status' => 'active',
                        'service_number' => '4pp03ets',
                        'service_model' => 'Audi R8',
                    ]);
                }
            }    
            if($AuthUser){
                $userToken = JWTAuth::fromUser($AuthUser);
                $User = Provider::with('service', 'device')->find($AuthUser->id);
                if($User->device) {
                    ProviderDevice::where('id',$User->device->id)->update([
                        
                        'udid' => $request->device_id,
                        'token' => $request->device_token,
                        'type' => $request->device_type,
                    ]);
                    
                } else {
                    ProviderDevice::create([
                        'provider_id' => $User->id,
                        'udid' => $request->device_id,
                        'token' => $request->device_token,
                        'type' => $request->device_type,
                    ]);
                }
                return response()->json([
                            "status" => true,
                            "token_type" => "Bearer",
                            "access_token" => $userToken,
                            'currency' => Setting::get('currency', '$'),
                            'sos' => Setting::get('sos_number', '911')
                        ]);
            }else{
                return response()->json(['status'=>false,'message' => "Invalid credentials!"]);
            }  
        } catch (Exception $e) {
            return response()->json(['status'=>false,'message' => trans('api.something_went_wrong')]);
        }
    }


    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function refresh_token(Request $request)
    {

        Config::set('auth.providers.users.model', 'App\Provider');

        $Provider = Provider::with('service', 'device')->find(Auth::user()->id);

        try {
            if (!$token = JWTAuth::fromUser($Provider)) {
                return response()->json(['error' => 'Unauthenticated'], 401);
            }
        } catch (JWTException $e) {
            return response()->json(['error' => 'Something went wrong'], 500);
        }

        $Provider->access_token = $token;

        return response()->json($Provider);
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function streetride_fare(Request $request){
    
        $this->validate($request,[
                's_latitude' => 'required|numeric',
                's_longitude' => 'required|numeric',
                'd_latitude' => 'required|numeric',
                'd_longitude' => 'required|numeric',
                'service_type' => 'required|numeric|exists:service_types,id',
            ]);

        try{

            $details = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$request->s_latitude.",".$request->s_longitude."&destinations=".$request->d_latitude.",".$request->d_longitude."&mode=driving&sensor=false&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);

            $details = json_decode($json, TRUE);
                
            $meter = $details['rows'][0]['elements'][0]['distance']['value'];
            $time = $details['rows'][0]['elements'][0]['duration']['text'];
            $seconds = $details['rows'][0]['elements'][0]['duration']['value'];

            $unit =Setting::get('distance_unit');
            
            if($unit =='km'){
                $kilometer = $meter/1000;
            }else{
                $base = $meter/1000;
                $kilometer = $base * 0.62137119;
            }

            $kilometer = round($kilometer,2);
            $minutes = $seconds/60;

            $tax_percentage = Setting::get('tax_percentage');
            $sro_levy = Setting::get('sro_levy');
            
            $service_type = ServiceType::findOrFail($request->service_type);
            $current = Carbon::now()->toTimeString();
            $today = Carbon::now();
            if(($today->day == '25' && $today->month == '12') || ($today->day == '26' && $today->month == '12') || ($today->day == '1' && $today->month == '1') || ($today->day == '31' && $today->month == '12' && $current > '18:00:00')){
                $fare_flag = $service_type->p_flag;
                $fare_distance = $service_type->p_distance;
                $fare_booking = $service_type->p_booking;
                $fare_waiting = $service_type->p_waiting;
            }else{
                $currentday = Carbon::now()->format('l');
                if($service_type->p_enable ==2 && ($current > $service_type->p_stime || $current < $service_type->p_etime )){
                    $fare_flag = $service_type->p_flag;
                    $fare_distance = $service_type->p_distance;
                    $fare_booking = $service_type->p_booking;
                    $fare_waiting = $service_type->p_waiting;
                    
                }elseif((($currentday =='Friday' || $currentday=='Saturday') && $current > $service_type->p_stime) || (($currentday=='Saturday' || $currentday=='Sunday') && $current < $service_type->p_etime)){
                    $fare_flag = $service_type->p_flag;
                    $fare_distance = $service_type->p_distance;
                    $fare_booking = $service_type->p_booking;
                    $fare_waiting = $service_type->p_waiting;
                    
                }elseif($current > $service_type->n_stime || $current > $service_type->n_etime){
                    $fare_flag = $service_type->n_flag;
                    $fare_distance = $service_type->n_distance;
                    $fare_booking = $service_type->n_booking;
                    $fare_waiting = $service_type->n_waiting;
                   
                }else{
                    $fare_flag = $service_type->d_flag;
                    $fare_distance = $service_type->d_distance;
                    $fare_booking = $service_type->d_booking;
                    $fare_waiting = $service_type->d_waiting;
                
                } 
            }

            $price = $fare_flag;
            if($kilometer > 1){
                $kilometer1 = $kilometer - 1;
                $price += ($kilometer1 * $fare_distance); 
            }   
            $tax_price = $tax_percentage;
            $total = $price + $sro_levy + $fare_booking;
            
            
            return response()->json([
                    'estimated_fare' => round($total,2), 
                    'distance' => $kilometer,
                    'distance_unit' => $unit,
                    'time' => $time,
                    'tax_price' => $tax_price,
                    'sro_levy' => $sro_levy,
                    'booking_fare' => $fare_booking,
                    'base_price' => $fare_flag,
                    'wallet_balance' => Auth::user()->wallet_balance,
                ]);

        } catch(Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')], 500);
        }
    }

/**
     * Show the Street ride trip send.
     *
     * @return \Illuminate\Http\Response
     */

    public function streetride_request(Request $request) {

        $this->validate($request, [
                's_latitude' => 'required|numeric',
                'd_latitude' => 'required|numeric',
                's_longitude' => 'required|numeric',
                'd_longitude' => 'required|numeric',
                'service_type' => 'required|numeric|exists:service_types,id',
                'distance' => 'required|numeric',
                'provider_id' => 'required|numeric',
                   
            ]);

            if(!empty($request->mobile) || !empty($request->email)){
                $mobile = Setting::get('country_code', '+91').$request->mobile;
                $checkmobile = User::where('mobile', $mobile)->first();
                
                if($request->email !=''){
                    $checkemail = User::where('email', $request->email)->first();
                }else{
                    $checkemail = User::where('email', 'sdfasdfdf')->first();
                }

                $mobilecheckcount = count($checkmobile);
                $emailcheckcount = count($checkemail);
                if($mobilecheckcount > 0){
                    $currentuser = $checkmobile;
                }elseif($emailcheckcount > 0){
                    $currentuser = $checkemail;
                }else{
                    $User['email'] = null;
                    $User['mobile'] = null;
                    if(!empty($request->email)){
                        $User['email'] = $request->email;
                    }
                    if(!empty($request->mobile)){
                        $User['mobile'] = Setting::get('country_code', '+91').$request->mobile;
                    }
                    $User['first_name'] = $request->first_name ? : 'Street Ride';
                    $User['last_name'] = $request->last_name ? : 'Client';
                    $User['password'] = null;
                    $User['payment_mode'] = 'CASH';
                    $User['login_by'] = 'manual';
                    $User = User::create($User);
                    $currentuser = $User;
                }
            }else{
                $mobile = Setting::get('country_code', '+91').Setting::get('contact_number', '');
                $User = User::where('mobile', $mobile)->first();
                if($User !=null){
                    $currentuser = $User;
                }else{
                    $currentuser = User::create([
                        'first_name' => 'Street Ride',
                        'last_name' => 'Client',
                        'email' => Setting::get('contact_email', ''),
                        'mobile' => Setting::get('country_code', '+91').Setting::get('contact_number', ''),
                        'password' => '123456789',
                        'payment_mode' => 'CASH',
                        'login_by' => 'manual',
                        'created_by' =>'Street Ride(Driver)'
                    ]);
                }
            }
            
        $checkonline = ProviderService::where('provider_id',$request->provider_id)->first();
        if($checkonline->status == 'offline'){
            return response()->json(['error' => 'Go Online to take trip.'], 500);
        }

       $ActiveDriverRequests = UserRequests::where('provider_id', $request->provider_id)
                ->whereNotIn('status' , ['CANCELLED', 'COMPLETED', 'SCHEDULED'])->count();

        if($ActiveDriverRequests > 0) {
            return response()->json(['error' => 'Already in Trip, Cannot make multiple trip at a time.'], 500);
        }
        
        $latitude = $request->s_latitude;
        $longitude = $request->s_longitude;
        $service_type = $request->service_type;

        try{

            $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$request->s_latitude.",".$request->s_longitude."&destination=".$request->d_latitude.",".$request->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');
            $json = curl($details);
            $details = json_decode($json, TRUE);
            $route_key = $details['routes'][0]['overview_polyline']['points'];
            $UserRequest = new UserRequests;
            $UserRequest->booking_id = Helper::generate_booking_id();
            $UserRequest->user_id = $currentuser['id'];
            $UserRequest->current_provider_id = $request->provider_id;
            $UserRequest->service_type_id = $request->service_type;
            $UserRequest->payment_mode = 'CASH';
            
            $UserRequest->status = 'SEARCHING';
            $UserRequest->booking_by = 'STREET';
            $UserRequest->s_address = $request->s_address ? : "";
            $UserRequest->d_address = $request->d_address ? : "";

            $UserRequest->s_latitude = $request->s_latitude;
            $UserRequest->s_longitude = $request->s_longitude;

            $UserRequest->d_latitude = $request->d_latitude;
            $UserRequest->d_longitude = $request->d_longitude;
            $UserRequest->distance = $request->distance;

            $UserRequest->assigned_at = Carbon::now();
            $UserRequest->route_key = '';

            $UserRequest->surge = 0;
            
            $UserRequest->save();

            ProviderService::where('provider_id',$request->provider_id)->update(['status' =>'riding']);
            
            $Filter = new RequestFilter;
            $Filter->request_id = $UserRequest->id;
            $Filter->provider_id = $request->provider_id;
            $Filter->save();

            if($request->ajax()) {
                return response()->json([
                        'message' => 'New request Created!',
                        'request_id' => $UserRequest->id,
                        'current_provider' => $UserRequest->current_provider_id,
                    ]);
            }else{
                return redirect('dashboard');
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')], 500);
            }else{
                return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
            }
        }
    }

}