HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Transporter/RequestController.php
<?php

namespace App\Http\Controllers\Transporter;

use App\DataTables\Transporter\RequestDataTable;
use App\Enums\RideRequestStatus;
use App\Http\Controllers\Controller;
use App\Models\Booking;
use App\Models\BookingRide;
use App\Models\Driver;
use App\Models\RideRequest;
use App\Models\TransporterSetting;
use App\Models\Trip;
use App\Models\Vehicle;
use App\Services\FirebaseService;
use Illuminate\Http\Request;

class RequestController extends Controller
{
    public $user;
    public function __construct()
    {
        $this->user = auth()->guard('trans')->user();
    }

    public function index(RequestDataTable $dataTable)
    {
        // $bookings = Booking::with([
        //     'trips',
        //     'rideRequestsForTransporter' => function ($q) {
        //         $q->where('status', RideRequest::PENDING);
        //     }
        // ])
        //     ->whereHas('rideRequestsForTransporter', function ($q) {
        //         $q->where('status', RideRequest::PENDING);
        //     })
        $bookings = Booking::with([
            'trips.rideRequests',
            'rideRequestsForTransporter',
        ])
            ->get();
        // dd($bookings);
        return view('transporter.request.card_index', compact('bookings'));
    }

    public function create()
    {
        // Logic to show form for creating a new request
    }

    public function store(Request $request)
    {
        // Logic to store a new request
    }

    public function view($id)
    {
        $request = RideRequest::with(['booking.rides', 'booking.customer', 'trip'])
            ->where('transporter_id', $this->user->id)
            ->find(decrypt($id));

        if (!$request) {
            return redirect()->route('request.index')->with('error', 'Request not found.');
        }
        $trip = $request->trip;
        $transporterId = $this->user->id;

        $drivers = Driver::where('transporter_id', $transporterId)
            ->where('status', 'active')
            ->get();

        $vehicles = Vehicle::where('transporter_id', $transporterId)
            ->where('status', 'active')
            ->get();
        $canSeeCustomer = TransporterSetting::where('transporter_id', $request->transporter_id)
            ->where('key', 'can_see_customer')
            ->where('value', 1)
            ->exists();
        //  dd($trip);
        return view('transporter.request.view', compact(['request', 'trip', 'drivers', 'vehicles', 'canSeeCustomer']));
    }

    public function accept(Request $request, FirebaseService $service, $id)
    {
        try {
            $rideRequest = RideRequest::with('booking', 'trip')
                ->where('transporter_id', $this->user->id)
                ->where('id', decrypt($id))
                ->firstOrFail();

            if (!$rideRequest || !$rideRequest->booking) {
                return response()->json([
                    'status' => false,
                    'message' => 'Booking not found for this ride request.',
                ]);
            }

            $booking = $rideRequest->booking;
            $trip    = $rideRequest->trip;
            $transporterId = $this->user->id;
            if ($rideRequest->status !== RideRequest::PENDING || $booking->status !== Booking::REQUESTED) {
                return response()->json([
                    'status' => false,
                    'message' => 'Sorry! This ride request has already been processed.',
                ]);
            }

            // $booking->status = Booking::ACCEPTED;
            // $booking->transporter_id = $this->user->id;
            // $booking->save();

            // $booking->rides()->update([
            //     'transporter_id' => $this->user->id,
            // ]);

            $bookingRides = BookingRide::where('trip_id', $trip->id)
            ->where('status', BookingRide::PENDING)
            ->get();

            if ($bookingRides->isEmpty()) {
                return response()->json(['message' => 'No pending rides found for this trip.'], 404);
            }
            
            foreach ($bookingRides as $ride) {
                $ride->update([
                    'transporter_id' => $this->user->id,
                    'status'         => BookingRide::PENDING,
                ]);
            }
            if (!$trip->transporter_id) {
                $trip->update([
                    'transporter_id' => $transporterId,
                    'status'         => Trip::ACCEPTED, 
                ]);
            }
            if (!$rideRequest->trip->transporter_id) {
                $rideRequest->trip->update(['transporter_id' => $this->user->id]);
            }

            $rideRequest->update([
                'status' => RideRequestStatus::ACCEPTED,
            ]);

            RideRequest::where('trip_id', $rideRequest->trip->id)
                ->where('id', '!=', $rideRequest->id)
                ->where('status', RideRequest::PENDING)
                ->update(['status' => RideRequest::EXPIRED]);

            // $relatedRequests = RideRequest::where('booking_id', $booking->id)->get();
            // foreach ($relatedRequests as $request) {
            //     $path = "transporters/{$request->transporter_id}/requests/{$request->id}";
            //     $service->removeRequest($path);
            // }


            return response()->json([
                'status'  => true,
                'message' => 'Request accepted successfully',
                'data'    => [
                    'booking_id'    => $booking->id,
                    'ride_request'  => $rideRequest->id,
                ],
            ]);
        } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Invalid request ID.',
            ], 400);
        } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Request not found.',
            ], 404);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Something went wrong: ' . $e->getMessage(),
            ], 500);
        }
    }

    public function reject(Request $request, FirebaseService $service, $id)
    {
        try {
            $rideRequest = RideRequest::where('transporter_id', $this->user->id)->findOrFail(decrypt($id));
            // dd(decrypt($id));
            $rideRequest->status = RideRequestStatus::REJECTED;
            $rideRequest->save();

            // $path = "transporters/{$this->user->id}/requests/{$rideRequest->id}";
            // $service->removeRequest($path);

            return response()->json([
                'status' => true,
                'message' => 'Request rejected successfully',
            ]);
        } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Invalid request ID.',
            ], 400);
        } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Request not found.',
            ], 404);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Something went wrong: ' . $e->getMessage(),
            ], 500);
        }
    }


    public function update(Request $request, $id)
    {
        // Logic to update an existing request
    }

    public function destroy($id)
    {
        // Logic to delete a request
    }
}