feat: add created_by field handling for flights
This commit is contained in:
@@ -46,6 +46,7 @@ class FlightController extends Controller
|
||||
|
||||
}
|
||||
|
||||
$data['created_by'] = auth('admin')->id();
|
||||
|
||||
Flight::create($data);
|
||||
|
||||
|
||||
@@ -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','تور حذف شد');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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');
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user