with([ 'departureAirport.city', 'arrivalAirport.city', 'airline', 'file', ]) ->when($request->filled('search'), function (Builder $query) use ($request) { $search = $request->input('search'); $query->whereAny([ 'title', 'summary', 'description', ], 'LIKE', "%$search%"); }) ->when($request->filled('sort'), function (Builder $query) use ($request) { $sort = $request->input('sort'); switch ($sort) { case 'price_asc': $query->orderBy('price'); break; case 'price_desc': $query->orderByDesc('price'); break; case 'departure_time': $query->orderBy('departure_time'); break; case 'created_at': $query->orderByDesc('created_at'); break; } }, function (Builder $query) { $query->orderByDesc('created_at'); }) ->paginate(); return view('admin.flights.index', compact('flights')); } public function create() { $airlines = Airline::all(); $airports = Airport::with('city')->get(); return view('admin.flights.create', compact( 'airlines', 'airports' )); } public function store(Request $request) { $request->validate([ 'title' => [ 'required', 'max:256', ], 'image' => [ 'nullable', 'image', 'mimes:jpg,jpeg,png,webp', 'max:5120', ], 'airline_id' => [ 'required', 'exists:airlines,id', ], 'flight_type' => [ 'required', 'in:0,1,2', ], 'departure_time' => [ 'required', 'date', ], 'departure_airport_id' => [ 'required', 'exists:airports,id', ], 'arrival_airport_id' => [ 'required', 'exists:airports,id', ], 'price' => [ 'required', 'numeric', ], 'summary' => [ 'required', 'max:512', ], 'capacity' => [ 'required', 'integer', ], 'description' => [ 'required', 'max:512', ], 'status' => [ 'required', 'in:0,1', ], ]); try { DB::beginTransaction(); $fileId = null; if ($request->hasFile('image')) { $file = $request->file('image'); $path = $file->store('flights', 'public'); $uploadedFile = File::create([ 'name' => pathinfo($file->hashName(), PATHINFO_FILENAME), 'extension' => $file->getClientOriginalExtension(), 'size' => $file->getSize(), 'original_name' => $file->getClientOriginalName(), 'path' => $path, ]); $fileId = $uploadedFile->id; } Flight::create([ 'title' => $request->input('title'), 'file_id' => $fileId, 'airline_id' => $request->input('airline_id'), 'flight_type' => $request->input('flight_type'), 'departure_time' => $request->input('departure_time'), 'departure_airport_id' => $request->input('departure_airport_id'), 'arrival_airport_id' => $request->input('arrival_airport_id'), 'price' => $request->input('price'), 'summary' => $request->input('summary'), 'capacity' => $request->input('capacity'), 'views' => 0, 'description' => $request->input('description'), 'status' => $request->input('status'), ]); DB::commit(); } catch (\Exception $exception) { DB::rollBack(); Log::error($exception); return back() ->withErrors([ 'general' => 'خطایی رخ داده است' ]) ->withInput(); } return redirect() ->route('admin.flights.index') ->with('success', 'پرواز با موفقیت ایجاد شد'); } public function edit(Flight $flight) { $flight->load([ 'departureAirport.city', 'arrivalAirport.city', 'airline', 'file', ]); $airlines = Airline::all(); $airports = Airport::with('city')->get(); return view('admin.flights.edit', compact( 'flight', 'airlines', 'airports' )); } public function update(Request $request, Flight $flight) { $request->validate([ 'title' => [ 'required', 'max:256', ], 'image' => [ 'nullable', 'image', 'mimes:jpg,jpeg,png,webp', 'max:5120', ], 'airline_id' => [ 'required', 'exists:airlines,id', ], 'flight_type' => [ 'required', 'in:0,1,2', ], 'departure_time' => [ 'required', 'date', ], 'departure_airport_id' => [ 'required', 'exists:airports,id', ], 'arrival_airport_id' => [ 'required', 'exists:airports,id', ], 'price' => [ 'required', 'numeric', ], 'summary' => [ 'required', 'max:512', ], 'capacity' => [ 'required', 'integer', ], 'description' => [ 'required', 'max:512', ], 'status' => [ 'required', 'in:0,1', ], ]); try { DB::beginTransaction(); $fileId = $flight->file_id; if ($request->hasFile('image')) { $file = $request->file('image'); $path = $file->store('flights', 'public'); $uploadedFile = File::create([ 'name' => pathinfo($file->hashName(), PATHINFO_FILENAME), 'extension' => $file->getClientOriginalExtension(), 'size' => $file->getSize(), 'original_name' => $file->getClientOriginalName(), 'path' => $path, ]); $fileId = $uploadedFile->id; } $flight->update([ 'title' => $request->input('title'), 'file_id' => $fileId, 'airline_id' => $request->input('airline_id'), 'flight_type' => $request->input('flight_type'), 'departure_time' => $request->input('departure_time'), 'departure_airport_id' => $request->input('departure_airport_id'), 'arrival_airport_id' => $request->input('arrival_airport_id'), 'price' => $request->input('price'), 'summary' => $request->input('summary'), 'capacity' => $request->input('capacity'), 'description' => $request->input('description'), 'status' => $request->input('status'), ]); DB::commit(); } catch (\Exception $exception) { DB::rollBack(); Log::error($exception); return back() ->withErrors([ 'general' => 'خطایی رخ داده است' ]) ->withInput(); } return redirect() ->route('admin.flights.index') ->with('success', 'پرواز با موفقیت ویرایش شد'); } public function destroy(Flight $flight) { if ($flight->bookings()->exists()) { return back()->withErrors([ 'error' => 'این پرواز دارای رزرو است و قابل حذف نیست.' ]); } $flight->delete(); return redirect()->route('admin.flights.index')->withErrors([ 'success'=> 'پرواز با موفقیت حذف شد' ]); } }