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/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',
        // ]);
        // echo "oksdsdss";
        // die;
        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);
        }
        // echo "<pre>";
        // print_r(JWTAuth::parseToken()->$token);
        // die;
        $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.');
            }
        }
    }
}