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
}
}