368 lines
9.6 KiB
PHP
368 lines
9.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Airline;
|
|
use App\Models\Airport;
|
|
use App\Models\File;
|
|
use App\Models\Flight;
|
|
use DB;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class FlightController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$flights = Flight::query()
|
|
->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',
|
|
'after_or_equal:today',
|
|
],
|
|
|
|
'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')
|
|
->withErrors(['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',
|
|
'after_or_equal:today',
|
|
],
|
|
|
|
'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')
|
|
->withErrors(['success'=> 'پرواز با موفقیت ویرایش شد']);
|
|
}
|
|
|
|
public function destroy(Flight $flight)
|
|
{
|
|
if ($flight->bookings()->exists()) {
|
|
return back()->withErrors([
|
|
'error' => 'این پرواز دارای رزرو است و قابل حذف نیست.'
|
|
]);
|
|
}
|
|
|
|
$flight->delete();
|
|
|
|
return redirect()->route('admin.flights.index')->withErrors([
|
|
'success'=> 'پرواز با موفقیت حذف شد'
|
|
]);
|
|
}
|
|
}
|