From 0ea78a621ad663ebba40f366bc5b7061f3be1331 Mon Sep 17 00:00:00 2001 From: Twyco Date: Tue, 29 Sep 2026 21:39:26 +0200 Subject: [PATCH] add team delte --- app/Enums/TeamMemberRole.php | 1 + app/Http/Controllers/TeamController.php | 13 +++++++- app/Policies/TeamPolicy.php | 12 +++++++- resources/js/pages/team/Index.vue | 41 ++++++++++++++++--------- resources/js/types/models.ts | 5 ++- routes/web.php | 1 + tests/Feature/TeamControllerTest.php | 4 +-- 7 files changed, 57 insertions(+), 20 deletions(-) diff --git a/app/Enums/TeamMemberRole.php b/app/Enums/TeamMemberRole.php index 905cda8..5ced803 100644 --- a/app/Enums/TeamMemberRole.php +++ b/app/Enums/TeamMemberRole.php @@ -4,6 +4,7 @@ namespace App\Enums; enum TeamMemberRole: string { + case Owner = 'owner'; case Admin = 'admin'; case Member = 'member'; diff --git a/app/Http/Controllers/TeamController.php b/app/Http/Controllers/TeamController.php index 47e98a3..8eacfd7 100644 --- a/app/Http/Controllers/TeamController.php +++ b/app/Http/Controllers/TeamController.php @@ -53,7 +53,7 @@ class TeamController extends Controller try { DB::transaction(function () use ($request): void { $team = Team::create($request->validated()); - $team->members()->attach($request->user(), ['role' => TeamMemberRole::Admin]); + $team->members()->attach($request->user(), ['role' => TeamMemberRole::Owner]); }); } catch (\Exception $exception) { report($exception); @@ -100,6 +100,17 @@ class TeamController extends Controller return to_route('teams.show', $team); } + public function destroy(Request $request, Team $team) + { + try { + $team->delete(); + } catch (\Exception $exception) { + report($exception); + Inertia::flash('error', 'Team could not be deleted.'); + } + + Inertia::flash('success', 'Team successfully deleted.'); + } public function nameToSlug(Request $request): JsonResponse { diff --git a/app/Policies/TeamPolicy.php b/app/Policies/TeamPolicy.php index c331fb5..0a6f867 100644 --- a/app/Policies/TeamPolicy.php +++ b/app/Policies/TeamPolicy.php @@ -28,6 +28,16 @@ class TeamPolicy return false; } - return $membership->pivot->role === TeamMemberRole::Admin; + return ($membership->pivot->role === TeamMemberRole::Admin) || ($membership->pivot->role === TeamMemberRole::Owner); + } + + public function delete(User $user, Team $team): bool + { + $membership = $team->members()->whereKey($user->id)->first(); + if (! $membership) { + return false; + } + + return $membership->pivot->role === TeamMemberRole::Owner; } } diff --git a/resources/js/pages/team/Index.vue b/resources/js/pages/team/Index.vue index 2d020ec..bf49f30 100644 --- a/resources/js/pages/team/Index.vue +++ b/resources/js/pages/team/Index.vue @@ -1,20 +1,12 @@