From af447ce2c0798535bb75b7463a79b04f7fee6879 Mon Sep 17 00:00:00 2001 From: Constantin Graf Date: Wed, 24 Apr 2024 13:40:57 +0200 Subject: [PATCH] Send permission to client via inertia data --- app/Http/Middleware/ShareInertiaData.php | 3 +++ app/Service/PermissionStore.php | 29 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/app/Http/Middleware/ShareInertiaData.php b/app/Http/Middleware/ShareInertiaData.php index 39907fdc..2f730733 100644 --- a/app/Http/Middleware/ShareInertiaData.php +++ b/app/Http/Middleware/ShareInertiaData.php @@ -6,6 +6,7 @@ namespace App\Http\Middleware; use App\Models\Organization; use App\Models\User; +use App\Service\PermissionStore; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -23,7 +24,9 @@ class ShareInertiaData */ public function handle(Request $request, Closure $next): Response { + $permissions = app(PermissionStore::class); Inertia::share(array_filter([ + 'permissions' => $request->user() !== null ? $permissions->permissions($request->user()->currentTeam) : [], 'jetstream' => function () use ($request) { /** @var User|null $user */ $user = $request->user(); diff --git a/app/Service/PermissionStore.php b/app/Service/PermissionStore.php index 63025518..070b44e8 100644 --- a/app/Service/PermissionStore.php +++ b/app/Service/PermissionStore.php @@ -7,6 +7,8 @@ namespace App\Service; use App\Models\Organization; use App\Models\User; use Illuminate\Support\Facades\Auth; +use Laravel\Jetstream\Jetstream; +use Laravel\Jetstream\Role; class PermissionStore { @@ -40,4 +42,31 @@ class PermissionStore return in_array($permission, $permissions, true); } + + /** + * @return array + */ + public function getPermissions(Organization $organization): array + { + /** @var User|null $user */ + $user = Auth::user(); + if ($user === null) { + return []; + } + + if (! $user->belongsToTeam($organization)) { + return []; + } + + $role = $organization->users + ->where('id', $user->getKey()) + ->first() + ?->membership + ?->role; + + /** @var Role|null $roleObj */ + $roleObj = Jetstream::findRole($role); + + return $role !== null ? ($roleObj?->permissions ?? []) : []; + } }