From 1d6712da594274946ef2dd1fbfb58b018b4ca122 Mon Sep 17 00:00:00 2001 From: ashish aryal Date: Sun, 28 Sep 2025 11:27:37 +0200 Subject: [PATCH] all logic for trip moved to trip repository --- app/Http/Controllers/V1/TripController.php | 70 ++++++++---------- app/Providers/AppServiceProvider.php | 3 + .../Contracts/TripRepositoryContract.php | 30 ++++++++ app/Repositories/TripRepository.php | 73 +++++++++++++++++++ resources/views/trips/edit.blade.php | 10 +-- 5 files changed, 143 insertions(+), 43 deletions(-) create mode 100644 app/Repositories/Contracts/TripRepositoryContract.php create mode 100644 app/Repositories/TripRepository.php diff --git a/app/Http/Controllers/V1/TripController.php b/app/Http/Controllers/V1/TripController.php index a9e0254..a3edb1b 100644 --- a/app/Http/Controllers/V1/TripController.php +++ b/app/Http/Controllers/V1/TripController.php @@ -8,7 +8,9 @@ use App\Http\Requests\TripRequest; use App\Models\Trip; use App\Models\User; -use Illuminate\Auth\Access\AuthorizationException; +use App\Repositories\Contracts\TripRepositoryContract; +use App\Repositories\TripRepository; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Gate; @@ -16,17 +18,19 @@ class TripController extends Controller { + /** + * @param TripRepository $trip + */ + public function __construct( + protected TripRepositoryContract $trip + ) {} + /** * Display a listing of the resource. */ public function index(): View { - - $user = auth()->user()->load(['owns', 'trips']); - $trips = [ - 'owns' => $user->owns, - 'invited' => $user->trips, - ]; + $trips = $this->trip->findAll(); return view('trips.index', compact('trips')); @@ -38,9 +42,7 @@ public function index(): View public function create(): View { // - $users = Cache::remember('listableUsers', 3600, function () { - return User::get(['id', 'name']); - }); + $users = $this->getUsers(); return view('trips.create', compact('users')); } @@ -50,8 +52,8 @@ public function create(): View */ public function store(TripRequest $tripRequest): RedirectResponse { - $trip = auth()->user()->owns()->create($tripRequest->validated()); - $trip->users()->attach($tripRequest->users); + + $trip = $this->trip->create($tripRequest->all()); return redirect()->route('trips.show', ['trip' => $trip]); @@ -59,58 +61,50 @@ public function store(TripRequest $tripRequest): RedirectResponse /** * Display the specified resource. - * - * @throws AuthorizationException */ public function show(Trip $trip): View { Gate::authorize('view', $trip); - $data = $trip->load([ - 'suggestions' => function ($query) { - $query->withCount([ - 'vote as up_votes_count' => function ($q) { - $q->where('type', 'up'); - }, - 'vote as down_votes_count' => function ($q) { - $q->where('type', 'down'); - }, - ]); - }, - 'users:name', - ]); + + $data = $this->trip->findWithSuggestions($trip); return view('trips.show', compact('data')); } /** * Show the form for editing the specified resource. - * - * @throws AuthorizationException */ public function edit(Trip $trip): View { // Gate::authorize('update', $trip); - $trip = $trip->load('users:id,name'); - $users = Cache::remember('listableUsers', 3600, function () { - return User::get(['id', 'name']); - }); + $data = $this->trip->find($trip, 'users:id,name'); + $users = $this->getUsers(); - return view('trips.edit', compact('trip', 'users')); + return view('trips.edit', compact('data', 'users')); } /** * Update the specified resource in storage. - * - * @throws AuthorizationException */ public function update(TripRequest $tripRequest, Trip $trip): RedirectResponse { // Gate::authorize('update', $trip); - $trip->update($tripRequest->validated()); - $trip->users()->attach($tripRequest->users); + $this->trip->updateTrip($trip, $tripRequest->all()); return redirect()->route('trips.show', ['trip' => $trip]); } + + /** + * Caches users and retrieves them. + * + * @return Collection + */ + private function getUsers(): Collection + { + return Cache::remember('listableUsers', 3600, function () { + return User::get(['id', 'name']); + }); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..51cd16e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use App\Repositories\Contracts\TripRepositoryContract; +use App\Repositories\TripRepository; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -12,6 +14,7 @@ class AppServiceProvider extends ServiceProvider public function register(): void { // + $this->app->bind(TripRepositoryContract::class, TripRepository::class); } /** diff --git a/app/Repositories/Contracts/TripRepositoryContract.php b/app/Repositories/Contracts/TripRepositoryContract.php new file mode 100644 index 0000000..d8a8136 --- /dev/null +++ b/app/Repositories/Contracts/TripRepositoryContract.php @@ -0,0 +1,30 @@ +> + */ + public function findAll(): array; + + public function find(Trip $trip, string $relation = ''): Trip; + + public function findWithSuggestions(Trip $trip): Trip; + + /** + * @param array $data + */ + public function create(array $data): Trip; + + /** + * @param array $data + */ + public function updateTrip(Trip $trip, array $data): Trip; +} diff --git a/app/Repositories/TripRepository.php b/app/Repositories/TripRepository.php new file mode 100644 index 0000000..4d97d1a --- /dev/null +++ b/app/Repositories/TripRepository.php @@ -0,0 +1,73 @@ +> + */ + public function findAll(): array + { + $user = auth()->user()->load(['owns', 'trips']); + + return [ + 'owns' => $user->owns, + 'invited' => $user->trips, + ]; + } + + public function findWithSuggestions(Trip $trip): Trip + { + return $trip->load([ + 'suggestions' => function ($query) { + $query->withCount([ + 'vote as up_votes_count' => function ($q) { + $q->where('type', 'up'); + }, + 'vote as down_votes_count' => function ($q) { + $q->where('type', 'down'); + }, + ]); + }, + 'users:name', + ]); + } + + public function find(Trip $trip, string $relation = ''): Trip + { + if ($relation != '') { + return $trip->load($relation); + } + + return $trip; + } + + /** + * @param array $data + */ + public function create(array $data): Trip + { + $trip = auth()->user()->owns()->create($data); + $trip->users()->attach($data['users']); + + return $trip; + } + + /** + * @param array $data + */ + public function updateTrip(Trip $trip, array $data): Trip + { + $trip->update($data); + $trip->users()->sync($data['users']); + + return $trip; + } +} diff --git a/resources/views/trips/edit.blade.php b/resources/views/trips/edit.blade.php index 53ccb82..ffccf2e 100644 --- a/resources/views/trips/edit.blade.php +++ b/resources/views/trips/edit.blade.php @@ -8,7 +8,7 @@
-
+ @csrf @method('PUT')
@@ -17,7 +17,7 @@ @@ -28,7 +28,7 @@ - {{ old('description', $trip->description) }} + {{ old('description', $data->description) }} @@ -41,7 +41,7 @@ value="active" type="radio" name="status" - @checked(old('status', $trip->status)) + @checked(old('status', $data->status)) > users->contains('id',$user->id) + $data->users->contains('id',$user->id) || (is_array(old('user')) && in_array($user->id, old('user'))) ) />