From 1e985b71ec571dbfd2a9849b24d3873a9a493560 Mon Sep 17 00:00:00 2001 From: Gregor Vostrak Date: Tue, 21 Oct 2025 12:22:17 +0200 Subject: [PATCH] move Client visibleByEmployee logic from controller to model --- app/Http/Controllers/Api/V1/ClientController.php | 9 +-------- app/Models/Client.php | 13 +++++++++++++ tests/Unit/Endpoint/Api/V1/ClientEndpointTest.php | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/Api/V1/ClientController.php b/app/Http/Controllers/Api/V1/ClientController.php index 2fbe0363..8f657bac 100644 --- a/app/Http/Controllers/Api/V1/ClientController.php +++ b/app/Http/Controllers/Api/V1/ClientController.php @@ -12,7 +12,6 @@ use App\Http\Resources\V1\Client\ClientCollection; use App\Http\Resources\V1\Client\ClientResource; use App\Models\Client; use App\Models\Organization; -use App\Models\Project; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\JsonResponse; use Illuminate\Support\Carbon; @@ -47,13 +46,7 @@ class ClientController extends Controller ->orderBy('created_at', 'desc'); if (! $canViewAllClients) { - $projectsQuery = Project::query() - ->whereBelongsTo($organization, 'organization') - ->visibleByEmployee($user) - ->distinct() - ->select('client_id'); - - $clientsQuery->whereIn('id', $projectsQuery); + $clientsQuery->visibleByEmployee($user); } $filterArchived = $request->getFilterArchived(); diff --git a/app/Models/Client.php b/app/Models/Client.php index 6189fbf3..82ced395 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -7,6 +7,7 @@ namespace App\Models; use App\Models\Concerns\CustomAuditable; use App\Models\Concerns\HasUuids; use Database\Factories\ClientFactory; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -62,6 +63,18 @@ class Client extends Model implements AuditableContract return $this->hasMany(Project::class, 'client_id'); } + /** + * @param Builder $builder + * @return Builder + */ + public function scopeVisibleByEmployee(Builder $builder, User $user): Builder + { + return $builder->whereHas('projects', function (Builder $builder) use ($user): Builder { + /** @var Builder $builder */ + return $builder->visibleByEmployee($user); + }); + } + /** * @return Attribute */ diff --git a/tests/Unit/Endpoint/Api/V1/ClientEndpointTest.php b/tests/Unit/Endpoint/Api/V1/ClientEndpointTest.php index 38100969..f2cf0fce 100644 --- a/tests/Unit/Endpoint/Api/V1/ClientEndpointTest.php +++ b/tests/Unit/Endpoint/Api/V1/ClientEndpointTest.php @@ -62,7 +62,7 @@ class ClientEndpointTest extends ApiEndpointTestAbstract { // Arrange $data = $this->createUserWithPermission([ - 'clients:view' + 'clients:view', ]); $clients = Client::factory()->forOrganization($data->organization)->createMany(2);