Files
sogandAsghary.Project09/app/Http/Controllers/Admin/TourController.php
T
2026-08-22 14:10:18 -07:00

251 lines
6.9 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Tours\tourStoreRequest;
use App\Http\Requests\Admin\Tours\tourUpdateRequest;
use App\Models\File;
use App\Models\Tour;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class TourController extends Controller
{
public function index(\Illuminate\Http\Request $request)
{
$tours = Tour::query()
->with('file')
->when($request->filled('search'), function (Builder $query) use ($request) {
$search = $request->input('search');
$query->whereAny([
'title',
'summary',
'description',
'origin',
'destination',
], 'LIKE', "%$search%");
})
->when($request->filled('sort'), function (Builder $query) use ($request) {
switch ($request->input('sort')) {
case 'price_asc':
$query->orderBy('price');
break;
case 'price_desc':
$query->orderByDesc('price');
break;
case 'duration_asc':
$query->orderBy('duration');
break;
case 'duration_desc':
$query->orderByDesc('duration');
break;
case 'created_at':
$query->orderByDesc('created_at');
break;
}
}, function (Builder $query) {
$query->orderByDesc('created_at');
})
->paginate();
return view('admin.tours.index', compact('tours'));
}
public function create()
{
return view('admin.tours.create');
}
public function store(tourStoreRequest $request)
{
try {
DB::beginTransaction();
$fileId = null;
if ($request->hasFile('image')) {
$file = $request->file('image');
$path = $file->store('tours', '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;
}
$tour = Tour::create([
'title' => $request->input('title'),
'summary' => $request->input('summary'),
'description' => $request->input('description'),
'origin' => $request->input('origin'),
'destination' => $request->input('destination'),
'file_id' => $fileId,
'duration' => $request->input('duration'),
'departure_time' => $request->input('departure_time'),
'price' => $request->input('price'),
'status' => $request->input('status'),
'created_by' => auth('admin')->id(),
'updated_by' => auth('admin')->id(),
]);
logActivity('tours', $tour->id, 'created');
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
Log::error($exception);
return back()
->withErrors([
'general' => 'خطایی رخ داده است'
])
->withInput();
}
return redirect()
->route('admin.tours.index')
->withErrors([
'success' => 'تور با موفقیت ایجاد شد'
]);
}
public function edit(Tour $tour)
{
$tour->load('file');
return view('admin.tours.edit', compact('tour'));
}
public function update(tourUpdateRequest $request, Tour $tour)
{
try {
$before = $tour->only([
'title', 'summary', 'description', 'origin',
'destination', 'file_id', 'duration', 'price',
'departure_time', 'status',
]);
DB::beginTransaction();
$fileId = $tour->file_id;
if ($request->hasFile('image')) {
$file = $request->file('image');
$path = $file->store('tours', '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;
}
$tour->update([
'title' => $request->input('title'),
'summary' => $request->input('summary'),
'description' => $request->input('description'),
'origin' => $request->input('origin'),
'destination' => $request->input('destination'),
'file_id' => $fileId,
'duration' => $request->input('duration'),
'departure_time' => $request->input('departure_time'),
'price' => $request->input('price'),
'status' => $request->input('status'),
'updated_by' => auth('admin')->id(),
]);
logActivity('tours', $tour->id , 'updated', [
'before' => $before,
'after' => $tour->only(array_keys($before)),
]);
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
Log::error($exception);
return back()
->withErrors([
'general' => 'خطایی رخ داده است'
])
->withInput();
}
return redirect()
->route('admin.tours.index')
->withErrors([
'success' => 'تور با موفقیت ویرایش شد'
]);
}
public function destroy(Tour $tour)
{
if ($tour->bookings()->exists()) {
return back()->withErrors(['error' => 'این پرواز دارای رزرو است و قابل حذف نیست.']);
}
logActivity('flights', $tour->id, 'deleted');
$tour->delete();
return redirect()->route('admin.flights.index')->withErrors(['success'=> 'پرواز با موفقیت حذف شد']);
}
}