feat: add created_by field handling for flights

This commit is contained in:
2026-08-19 13:31:25 +03:30
parent 700bd38c20
commit 7cf68cc02f
103 changed files with 29226 additions and 18 deletions
@@ -46,6 +46,7 @@ class FlightController extends Controller
}
$data['created_by'] = auth('admin')->id();
Flight::create($data);
+139 -1
View File
@@ -3,9 +3,147 @@
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\TourStoreRequest;
use App\Models\Tour;
use App\Models\TravelType;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class TourController extends Controller
{
//
public function index(Request $request)
{
$tours = Tour::query()
->applySearch($request->all())
->filterType($request->travel_type_id)
->sort($request->sort)
->latest()
->paginate(4);
return view('admin.tours.index', compact('tours'));
}
public function create()
{
return view('admin.tours.create' );
}
public function store(TourStoreRequest $request)
{
DB::beginTransaction();
try {
$data = $request->validated();
if ($request->hasFile('image')) {
$data['image'] = $request
->file('image')
->store('tours','public');
}
$data['created_by'] = auth('admin')->id();
Tour::create($data);
DB::commit();
return redirect()
->route('admin.tours.index')
->with('success','تور ثبت شد');
} catch(\Exception $e) {
DB::rollBack();
dd($e->getMessage());
}
}
public function edit(Tour $tour)
{
return view('admin.tours.edit',compact('tour'));
}
public function update(TourStoreRequest $request, Tour $tour)
{
DB::beginTransaction();
try {
$data = $request->validated();
if ($request->hasFile('image')) {
if($tour->image){
Storage::disk('public')
->delete($tour->image);
}
$data['image'] = $request
->file('image')
->store('tours','public');
}
$tour->update($data);
DB::commit();
return redirect()
->route('admin.tours.index')
->with('success','تور ویرایش شد');
}catch(\Exception $e){
DB::rollBack();
dd($e->getMessage());
}
}
public function destroy(Tour $tour)
{
if($tour->image){
Storage::disk('public')
->delete($tour->image);
}
$tour->delete();
return back()
->with('success','تور حذف شد');
}
}
+92
View File
@@ -0,0 +1,92 @@
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class TourStoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => [
'required',
'string',
'max:255'
],
'summary' => [
'required',
'string',
'max:500'
],
'description' => [
'required',
'string'
],
'image' => [
'nullable',
'image',
'mimes:jpg,jpeg,png,webp',
'max:2048'
],
'views' => [
'nullable',
'integer',
'min:0'
],
'travel_type_id' => [
'required',
'integer'
],
'price' => [
'required',
'numeric',
'min:0'
],
'views'=>[
'nullable',
'integer',
'min:0'
],
'departure_date' => [
'required',
'date',
'after_or_equal:today',
],
'status' => [
'required',
'integer',
'in:0,1,2,3,4'
]
];
}
}
+46 -1
View File
@@ -7,6 +7,8 @@
namespace App\Models;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
@@ -20,6 +22,7 @@ use Illuminate\Database\Eloquent\Model;
* @property string $image
* @property string $views
* @property int $travel_type_id
* @property int $created_by
* @property float $price
* @property Carbon $departure_date
* @property int $status
@@ -50,6 +53,7 @@ class Tour extends Model
'views',
'travel_type_id',
'price',
'created_by',
'departure_date',
'status'
];
@@ -70,4 +74,45 @@ class Tour extends Model
{
return $this->morphMany(Reservation::class, 'reservable');
}
}
#[Scope]
public function applySearch(Builder $query, ?array $filters = []): void
{
$query->when($filters['search'] ?? null, function ($query, $search) {
$query->where(function ($q) use ($search) {
$q->where('title', 'like', "%{$search}%")
->orWhere('summary', 'like', "%{$search}%");
});
});
}
#[Scope]
public function filterType(Builder $query, $type = null): void
{
$query->when($type !== null && $type !== '', function($query) use ($type){
$query->where('travel_type_id', $type);
});
}
#[Scope]
public function sort(Builder $query, $sort = null): void
{
if ($sort == 'price_asc') {
$query->orderBy('price', 'asc');
}
if ($sort == 'price_desc') {
$query->orderBy('price', 'desc');
}
}
}
+3 -2
View File
@@ -21,14 +21,15 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
Paginator::useBootstrapFive();
\Illuminate\Support\Facades\View::composer('layouts.hero', function ($view) {
$provinces = Province::orderBy('name')->get();
$view->with('provinces', $provinces);
Paginator::useTailwind();
Paginator::useBootstrapFive();
});