From 188c4435cb4ea52b88e075e9920012f4c4916b70 Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Mon, 22 Jun 2026 16:13:32 +0200 Subject: [PATCH] standardization of policies/permissions --- app/Http/Resources/MutationResource.php | 9 +- app/Policies/MutationPolicy.php | 6 +- resources/js/components/MutationList.vue | 13 +-- resources/js/pages/Dynamics/Create.vue | 26 +++--- resources/js/pages/Dynamics/Index.vue | 18 ++-- resources/js/pages/Dynamics/Invite.vue | 35 ++++---- resources/js/pages/Dynamics/Settings.vue | 35 ++++---- resources/js/pages/Dynamics/Show.vue | 12 --- resources/js/pages/Ledgers/Create.vue | 35 ++++---- resources/js/pages/Ledgers/Edit.vue | 109 ++++++++++++----------- resources/js/pages/Ledgers/Show.vue | 30 ++----- 11 files changed, 166 insertions(+), 162 deletions(-) diff --git a/app/Http/Resources/MutationResource.php b/app/Http/Resources/MutationResource.php index 31cb2a3..308f5c5 100644 --- a/app/Http/Resources/MutationResource.php +++ b/app/Http/Resources/MutationResource.php @@ -13,6 +13,13 @@ class MutationResource extends BaseResource */ public function toArray(Request $request): array { - return parent::toArray($request); + $data = parent::toArray($request); + + $data['can'] = [ + 'update' => $request->user()?->can('update', $this->resource) ?? false, + 'void' => $request->user()?->can('void', $this->resource) ?? false, + ]; + + return $data; } } diff --git a/app/Policies/MutationPolicy.php b/app/Policies/MutationPolicy.php index dd29e07..28f5b17 100644 --- a/app/Policies/MutationPolicy.php +++ b/app/Policies/MutationPolicy.php @@ -24,8 +24,9 @@ class MutationPolicy public function update(User $user, Mutation $mutation): bool { $dynamic = $mutation->ledger->dynamic; + $isOwner = $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); - return $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); + return $isOwner && $mutation->status === 'pending'; } /** @@ -34,7 +35,8 @@ class MutationPolicy public function void(User $user, Mutation $mutation): bool { $dynamic = $mutation->ledger->dynamic; + $isOwner = $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); - return $dynamic->participants()->where('user_id', $user->id)->where('role', 'owner')->exists(); + return $isOwner && $mutation->status !== 'voided'; } } diff --git a/resources/js/components/MutationList.vue b/resources/js/components/MutationList.vue index 30f62c8..68f5ebe 100644 --- a/resources/js/components/MutationList.vue +++ b/resources/js/components/MutationList.vue @@ -17,13 +17,16 @@ const props = defineProps<{ created_at: string; chat: any; media?: Array<{ id: number; url: string; mime_type: string }>; + can: { + update: boolean; + void: boolean; + }; }>; participants?: Array<{ id: number; name: string; pivot?: { role: string }; }>; - isOwner: boolean; }>(); const emit = defineEmits<{ @@ -167,25 +170,25 @@ function getAmountClass(amount: number): string {