Files
sogandAsghary.Project09/app/Http/Controllers/Admin/FlightController.php
T

384 lines
10 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 = 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'),
'created_by' => auth('admin')->id(),
'updated_by' => auth('admin')->id(),
]);
logActivity('flights', $flight->id, 'created');
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)
{
$before = $flight->only([
'title', 'airline_id', 'flight_type', 'departure_time',
'departure_airport_id', 'arrival_airport_id', 'price',
'summary', 'capacity', 'description', 'status',
]);
$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',
],
]);
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'),
'updated_by' => auth('admin')->id(),
]);
logActivity('flights', $flight->id, 'updated', [
'before' => $before,
'after' => $flight->only(array_keys($before)),
]);
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' => 'این پرواز دارای رزرو است و قابل حذف نیست.'
]);
}
logActivity('flights', $flight->id, 'deleted');
$flight->delete();
return redirect()->route('admin.flights.index')->withErrors([
'success'=> 'پرواز با موفقیت حذف شد'
]);
}
}