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 @@
@@ -61,6 +56,7 @@ const canManageTeam = (team: Team) =>
Slug
Mitglieder
2FA
+
@@ -78,7 +74,7 @@ const canManageTeam = (team: Team) =>
{{
team.multi_factor_required ? 'Ja' : 'Nein'
}}
-
+
+
+
+
diff --git a/resources/js/types/models.ts b/resources/js/types/models.ts
index ce1dcff..9559406 100644
--- a/resources/js/types/models.ts
+++ b/resources/js/types/models.ts
@@ -6,7 +6,10 @@ export interface Team {
created_at: string;
}
-export type TeamMemberRole = 'admin' | 'member';
+export type TeamMemberRole =
+ |'owner'
+ | 'admin'
+ | 'member';
export interface User {
name: string;
diff --git a/routes/web.php b/routes/web.php
index ad62b79..3be4532 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -25,6 +25,7 @@ Route::middleware(['auth'])->group(function () {
Route::patch('/{team:slug}', 'update')->name('update')->can('manage', 'team');
Route::post('/name-to-slug', 'nameToSlug')->name('nameToSlug');
Route::get('/{team:slug}', 'show')->name('show')->can('view', 'team');
+ Route::delete('/{team:slug}', 'destroy')->name('destroy')->can('delete', 'team');
});
});
diff --git a/tests/Feature/TeamControllerTest.php b/tests/Feature/TeamControllerTest.php
index 4b6484c..31e1cc3 100644
--- a/tests/Feature/TeamControllerTest.php
+++ b/tests/Feature/TeamControllerTest.php
@@ -65,7 +65,7 @@ test('unverified users cannot create teams', function (string $method, string $r
$this->assertDatabaseCount('teams', 0);
})->with([['get', 'teams.create'], ['post', 'teams.store']]);
-test('team creation derives the slug and adds its creator as admin', function () {
+test('team creation derives the slug and adds its creator as owner', function () {
$user = User::factory()->create();
$this->actingAs($user)->post(route('teams.store'), [
@@ -73,7 +73,7 @@ test('team creation derives the slug and adds its creator as admin', function ()
])->assertSessionHasNoErrors()->assertRedirect(route('teams.index'));
$this->assertDatabaseHas('teams', ['name' => 'Test Team', 'slug' => 'test-team', 'require_2fa' => true]);
- $this->assertDatabaseHas('team_members', ['user_id' => $user->id, 'role' => 'admin']);
+ $this->assertDatabaseHas('team_members', ['user_id' => $user->id, 'role' => 'owner']);
$this->assertDatabaseMissing('teams', ['id' => 999]);
});