From c194e3547b5c3a7b192f6e4aa37a7bf18539d476 Mon Sep 17 00:00:00 2001 From: Constantin Graf Date: Thu, 25 Apr 2024 16:26:42 +0200 Subject: [PATCH] Hide latestTeamActivity for members with employee role --- .../Controllers/Web/DashboardController.php | 9 ++- database/factories/UserFactory.php | 9 +++ .../Endpoint/Web/DashboardEndpointTest.php | 59 +++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Web/DashboardController.php b/app/Http/Controllers/Web/DashboardController.php index 56897496..c8a0322a 100644 --- a/app/Http/Controllers/Web/DashboardController.php +++ b/app/Http/Controllers/Web/DashboardController.php @@ -7,12 +7,13 @@ namespace App\Http\Controllers\Web; use App\Models\Organization; use App\Models\User; use App\Service\DashboardService; +use App\Service\PermissionStore; use Inertia\Inertia; use Inertia\Response; class DashboardController extends Controller { - public function dashboard(DashboardService $dashboardService): Response + public function dashboard(DashboardService $dashboardService, PermissionStore $permissionStore): Response { /** @var User $user */ $user = auth()->user(); @@ -24,10 +25,14 @@ class DashboardController extends Controller $totalWeeklyBillableTime = $dashboardService->totalWeeklyBillableTime($user, $organization); $totalWeeklyBillableAmount = $dashboardService->totalWeeklyBillableAmount($user, $organization); $weeklyProjectOverview = $dashboardService->weeklyProjectOverview($user, $organization); - $latestTeamActivity = $dashboardService->latestTeamActivity($organization); $latestTasks = $dashboardService->latestTasks($user, $organization); $lastSevenDays = $dashboardService->lastSevenDays($user, $organization); + $latestTeamActivity = null; + if ($permissionStore->has($organization, 'time-entries:view:all')) { + $latestTeamActivity = $dashboardService->latestTeamActivity($organization); + } + return Inertia::render('Dashboard', [ 'weeklyProjectOverview' => $weeklyProjectOverview, 'latestTasks' => $latestTasks, diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 1e94da5b..d0cf3afd 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -39,6 +39,15 @@ class UserFactory extends Factory ]; } + public function forCurrentOrganization(Organization $organization): static + { + return $this->state(function (array $attributes) use ($organization): array { + return [ + 'current_team_id' => $organization->getKey(), + ]; + }); + } + public function randomTimeZone(): static { return $this->state(function (array $attributes) { diff --git a/tests/Unit/Endpoint/Web/DashboardEndpointTest.php b/tests/Unit/Endpoint/Web/DashboardEndpointTest.php index 12156e7b..006d08cd 100644 --- a/tests/Unit/Endpoint/Web/DashboardEndpointTest.php +++ b/tests/Unit/Endpoint/Web/DashboardEndpointTest.php @@ -4,7 +4,10 @@ declare(strict_types=1); namespace Tests\Unit\Endpoint\Web; +use App\Enums\Role; +use App\Models\Organization; use App\Models\User; +use Inertia\Testing\AssertableInertia as Assert; class DashboardEndpointTest extends EndpointTestAbstract { @@ -19,5 +22,61 @@ class DashboardEndpointTest extends EndpointTestAbstract // Assert $response->assertSuccessful(); + $response->assertInertia(fn (Assert $page) => $page + ->has('weeklyProjectOverview') + ->has('latestTasks') + ->has('lastSevenDays') + ->has('latestTeamActivity') + ->has('dailyTrackedHours') + ->has('totalWeeklyTime') + ->has('totalWeeklyBillableTime') + ->has('totalWeeklyBillableAmount') + ->has('weeklyHistory') + ->whereNot('weeklyProjectOverview', null) + ->whereNot('latestTasks', null) + ->whereNot('lastSevenDays', null) + ->whereNot('latestTeamActivity', null) + ->whereNot('dailyTrackedHours', null) + ->whereNot('totalWeeklyTime', null) + ->whereNot('totalWeeklyBillableTime', null) + ->whereNot('totalWeeklyBillableAmount', null) + ->whereNot('weeklyHistory', null) + ->whereNot('latestTeamActivity', null) + ); + } + + public function test_showing_dashboard_succeeds_with_less_data_for_user_with_employee_role(): void + { + // Arrange + $organization = Organization::factory()->create(); + $user = User::factory()->forCurrentOrganization($organization)->create(); + $organization->users()->attach($user, ['role' => Role::Employee->value]); + $this->actingAs($user); + + // Act + $response = $this->get('/dashboard'); + + // Assert + $response->assertSuccessful(); + $response->assertInertia(fn (Assert $page) => $page + ->has('weeklyProjectOverview') + ->has('latestTasks') + ->has('lastSevenDays') + ->has('latestTeamActivity') + ->has('dailyTrackedHours') + ->has('totalWeeklyTime') + ->has('totalWeeklyBillableTime') + ->has('totalWeeklyBillableAmount') + ->has('weeklyHistory') + ->whereNot('weeklyProjectOverview', null) + ->whereNot('latestTasks', null) + ->whereNot('lastSevenDays', null) + ->where('latestTeamActivity', null) + ->whereNot('dailyTrackedHours', null) + ->whereNot('totalWeeklyTime', null) + ->whereNot('totalWeeklyBillableTime', null) + ->whereNot('totalWeeklyBillableAmount', null) + ->whereNot('weeklyHistory', null) + ); } }