From 470dd35fb73f7e40e16f6419280418b33a9618bf Mon Sep 17 00:00:00 2001 From: ashish aryal Date: Sat, 27 Sep 2025 13:24:11 +0200 Subject: [PATCH 1/6] icon and query optimization --- app/Http/Controllers/V1/TripController.php | 1 + resources/views/trips/show.blade.php | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/V1/TripController.php b/app/Http/Controllers/V1/TripController.php index e10b3ab..4b34c29 100644 --- a/app/Http/Controllers/V1/TripController.php +++ b/app/Http/Controllers/V1/TripController.php @@ -72,6 +72,7 @@ public function show(Trip $trip): View }, ]); }, + 'users:name' ]); return view('trips.show', compact('data')); diff --git a/resources/views/trips/show.blade.php b/resources/views/trips/show.blade.php index cbee6da..b43d713 100644 --- a/resources/views/trips/show.blade.php +++ b/resources/views/trips/show.blade.php @@ -76,14 +76,14 @@ class="inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent
- - + + {{ $suggestion->up_votes_count }} - + {{ $suggestion->down_votes_count }} @@ -92,12 +92,21 @@ class="inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent {{ $suggestion->description }}

@can('update', $data) -
+
- Approve + + + + + + - Reject + + + + +
@endcan From 4a29f85e6f867c68ad022347d339f5fdead7d938 Mon Sep 17 00:00:00 2001 From: ashish64 <312075+ashish64@users.noreply.github.com> Date: Sat, 27 Sep 2025 11:24:37 +0000 Subject: [PATCH 2/6] Apply automatic changes --- app/Http/Controllers/V1/TripController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/V1/TripController.php b/app/Http/Controllers/V1/TripController.php index 4b34c29..acff305 100644 --- a/app/Http/Controllers/V1/TripController.php +++ b/app/Http/Controllers/V1/TripController.php @@ -72,7 +72,7 @@ public function show(Trip $trip): View }, ]); }, - 'users:name' + 'users:name', ]); return view('trips.show', compact('data')); From 07cd472541d21c0e06e2bd482b6fbb0019a6d8db Mon Sep 17 00:00:00 2001 From: ashish aryal Date: Sat, 27 Sep 2025 14:12:12 +0200 Subject: [PATCH 3/6] cosmetics of UI is done --- .../Controllers/V1/SuggestionController.php | 11 +++++++ resources/views/trips/show.blade.php | 29 ++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/V1/SuggestionController.php b/app/Http/Controllers/V1/SuggestionController.php index 4cbbf58..2a7643f 100644 --- a/app/Http/Controllers/V1/SuggestionController.php +++ b/app/Http/Controllers/V1/SuggestionController.php @@ -41,4 +41,15 @@ public function vote(Suggestion $suggestion, Request $request): RedirectResponse return redirect()->back(); } + + public function status(Suggestion $suggestion, Request $request): RedirectResponse + { + $validated = $request->validate([ + 'type' => 'required|in:approved,rejected', + ]); + + $suggestion->update(['status' => $validated['type']]); + + return redirect()->back(); + } } diff --git a/resources/views/trips/show.blade.php b/resources/views/trips/show.blade.php index b43d713..8019140 100644 --- a/resources/views/trips/show.blade.php +++ b/resources/views/trips/show.blade.php @@ -72,16 +72,37 @@ class="inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent
@foreach($data->suggestions as $suggestion) -
+
is_null($suggestion->status), + 'p-2 flex gap-2 border-green-500 border rounded bg-green-100 hover:bg-green-300 font-bold shadow-lg shadow-green-500/50' => $suggestion->status == 'approved', + 'p-2 flex gap-2 border-red-500 border rounded bg-red-50 font-italic line-through opacity-50 shadow-lg shadow-red-500/50' => $suggestion->status == 'rejected' + ]) + > +{{--
--}} +{{--
--}} + + +
- + + status)) + href="{{ route('suggestions.vote', $suggestion) }}?type=up" + @endif + > - {{ $suggestion->up_votes_count }} - + {{ $suggestion->up_votes_count }} + status)) + href="{{ route('suggestions.vote', $suggestion) }}?type=down" + @endif + > From 731f00538c8027852f8db4ae8a1dc53d8f89f348 Mon Sep 17 00:00:00 2001 From: ashish64 <312075+ashish64@users.noreply.github.com> Date: Sat, 27 Sep 2025 12:12:39 +0000 Subject: [PATCH 4/6] Apply automatic changes --- app/Http/Controllers/V1/SuggestionController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/V1/SuggestionController.php b/app/Http/Controllers/V1/SuggestionController.php index 2a7643f..fb5d4fa 100644 --- a/app/Http/Controllers/V1/SuggestionController.php +++ b/app/Http/Controllers/V1/SuggestionController.php @@ -46,7 +46,7 @@ public function status(Suggestion $suggestion, Request $request): RedirectRespon { $validated = $request->validate([ 'type' => 'required|in:approved,rejected', - ]); + ]); $suggestion->update(['status' => $validated['type']]); From 6b3e004508d091d84ad38b907d49050e2868ec49 Mon Sep 17 00:00:00 2001 From: ashish aryal Date: Sat, 27 Sep 2025 15:56:47 +0200 Subject: [PATCH 5/6] added gates to necessary methods. can be done better --- app/Http/Controllers/V1/SuggestionController.php | 6 +++++- app/Http/Controllers/V1/TripController.php | 1 + app/Policies/TripPolicy.php | 11 +++++++++++ resources/views/trips/show.blade.php | 15 ++++----------- routes/web.php | 1 + 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/V1/SuggestionController.php b/app/Http/Controllers/V1/SuggestionController.php index fb5d4fa..8e4d54a 100644 --- a/app/Http/Controllers/V1/SuggestionController.php +++ b/app/Http/Controllers/V1/SuggestionController.php @@ -10,6 +10,7 @@ use App\Models\Trip; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; class SuggestionController extends Controller { @@ -18,6 +19,7 @@ class SuggestionController extends Controller */ public function store(Trip $trip, SuggestionRequest $suggestionRequest): RedirectResponse { + Gate::authorize('view', $trip); $suggestion = [ 'description' => $suggestionRequest['description'], 'user_id' => auth()->id(), @@ -30,6 +32,7 @@ public function store(Trip $trip, SuggestionRequest $suggestionRequest): Redirec public function vote(Suggestion $suggestion, Request $request): RedirectResponse { + Gate::authorize('view', $suggestion->trip); $validated = $request->validate([ 'type' => 'required|in:up,down', ]); @@ -42,8 +45,9 @@ public function vote(Suggestion $suggestion, Request $request): RedirectResponse return redirect()->back(); } - public function status(Suggestion $suggestion, Request $request): RedirectResponse + public function status(Suggestion $suggestion, Request $request) { + Gate::authorize('update', $suggestion->trip); $validated = $request->validate([ 'type' => 'required|in:approved,rejected', ]); diff --git a/app/Http/Controllers/V1/TripController.php b/app/Http/Controllers/V1/TripController.php index acff305..0a327e4 100644 --- a/app/Http/Controllers/V1/TripController.php +++ b/app/Http/Controllers/V1/TripController.php @@ -61,6 +61,7 @@ public function store(TripRequest $tripRequest): RedirectResponse */ public function show(Trip $trip): View { + Gate::authorize('view', $trip); $data = $trip->load([ 'suggestions' => function ($query) { $query->withCount([ diff --git a/app/Policies/TripPolicy.php b/app/Policies/TripPolicy.php index b59a11f..c4e429e 100644 --- a/app/Policies/TripPolicy.php +++ b/app/Policies/TripPolicy.php @@ -22,6 +22,17 @@ public function viewAny(User $user): bool */ public function view(User $user, Trip $trip): bool { + // if i own the trip, im allowed + if ($user->id === $trip->owner_id) { + return true; + } + + // if im part of the trip, i should also be allowed + if ($trip->users->contains(auth()->id())) { + return true; + } + + // else i have no business here return false; } diff --git a/resources/views/trips/show.blade.php b/resources/views/trips/show.blade.php index 8019140..73e631f 100644 --- a/resources/views/trips/show.blade.php +++ b/resources/views/trips/show.blade.php @@ -76,17 +76,11 @@ class="inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent @class([ 'p-2 flex border-gray-500 border rounded hover:bg-gray-100 flex gap-2' => is_null($suggestion->status), - 'p-2 flex gap-2 border-green-500 border rounded bg-green-100 hover:bg-green-300 font-bold shadow-lg shadow-green-500/50' => $suggestion->status == 'approved', - 'p-2 flex gap-2 border-red-500 border rounded bg-red-50 font-italic line-through opacity-50 shadow-lg shadow-red-500/50' => $suggestion->status == 'rejected' + 'p-2 flex gap-2 border-green-500 border rounded bg-green-100 hover:bg-green-300 font-bold shadow-lg shadow-green-500/50 text-green-950' => $suggestion->status == 'approved', + 'p-2 flex gap-2 border-red-500 border rounded bg-red-50 font-italic line-through opacity-50 shadow-lg shadow-red-500/50 text-red-950' => $suggestion->status == 'rejected' ]) > -{{--
--}} -{{--
--}} - - -
- status)) href="{{ route('suggestions.vote', $suggestion) }}?type=up" @@ -115,15 +109,14 @@ class="inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent @can('update', $data)
- + - - + diff --git a/routes/web.php b/routes/web.php index 40ab428..e977098 100644 --- a/routes/web.php +++ b/routes/web.php @@ -20,6 +20,7 @@ Route::resource('trips', TripController::class)->except(['destroy']); Route::resource('trips.suggestions', SuggestionController::class)->only(['store']); Route::get('/suggestions/{suggestion}/vote', [SuggestionController::class, 'vote'])->name('suggestions.vote'); + Route::get('/suggestions/{suggestion}/status', [SuggestionController::class, 'status'])->name('suggestions.status'); }); require __DIR__.'/auth.php'; From 35e661243b46eaf305d770277a519b374f9ea524 Mon Sep 17 00:00:00 2001 From: ashish aryal Date: Sat, 27 Sep 2025 16:16:56 +0200 Subject: [PATCH 6/6] furthur housekeeping --- app/Http/Controllers/V1/SuggestionController.php | 13 ++++++++++++- app/Http/Controllers/V1/TripController.php | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/V1/SuggestionController.php b/app/Http/Controllers/V1/SuggestionController.php index 8e4d54a..c7e76ec 100644 --- a/app/Http/Controllers/V1/SuggestionController.php +++ b/app/Http/Controllers/V1/SuggestionController.php @@ -8,6 +8,7 @@ use App\Http\Requests\SuggestionRequest; use App\Models\Suggestion; use App\Models\Trip; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -16,6 +17,8 @@ class SuggestionController extends Controller { /** * Store a newly created resource in storage. + * + * @throws AuthorizationException */ public function store(Trip $trip, SuggestionRequest $suggestionRequest): RedirectResponse { @@ -30,6 +33,11 @@ public function store(Trip $trip, SuggestionRequest $suggestionRequest): Redirec return redirect()->route('trips.show', ['trip' => $trip]); } + /** + * This can and should be moved to its own controller + * + * @throws AuthorizationException + */ public function vote(Suggestion $suggestion, Request $request): RedirectResponse { Gate::authorize('view', $suggestion->trip); @@ -45,7 +53,10 @@ public function vote(Suggestion $suggestion, Request $request): RedirectResponse return redirect()->back(); } - public function status(Suggestion $suggestion, Request $request) + /** + * @throws AuthorizationException + */ + public function status(Suggestion $suggestion, Request $request): RedirectResponse { Gate::authorize('update', $suggestion->trip); $validated = $request->validate([ diff --git a/app/Http/Controllers/V1/TripController.php b/app/Http/Controllers/V1/TripController.php index 0a327e4..a9e0254 100644 --- a/app/Http/Controllers/V1/TripController.php +++ b/app/Http/Controllers/V1/TripController.php @@ -8,6 +8,7 @@ use App\Http\Requests\TripRequest; use App\Models\Trip; use App\Models\User; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Gate; @@ -58,6 +59,8 @@ public function store(TripRequest $tripRequest): RedirectResponse /** * Display the specified resource. + * + * @throws AuthorizationException */ public function show(Trip $trip): View { @@ -81,6 +84,8 @@ public function show(Trip $trip): View /** * Show the form for editing the specified resource. + * + * @throws AuthorizationException */ public function edit(Trip $trip): View { @@ -96,6 +101,8 @@ public function edit(Trip $trip): View /** * Update the specified resource in storage. + * + * @throws AuthorizationException */ public function update(TripRequest $tripRequest, Trip $trip): RedirectResponse {