From 64976738cb2d1093d7d8b41c6a891fa540abe736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Gro=C3=9F?= Date: Thu, 6 Nov 2025 22:46:10 +0100 Subject: [PATCH 1/2] Sort members by name --- .../Controllers/Api/V1/MemberController.php | 2 ++ .../Endpoint/Api/V1/MemberEndpointTest.php | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/app/Http/Controllers/Api/V1/MemberController.php b/app/Http/Controllers/Api/V1/MemberController.php index c4d55a50..4a4f6e32 100644 --- a/app/Http/Controllers/Api/V1/MemberController.php +++ b/app/Http/Controllers/Api/V1/MemberController.php @@ -60,6 +60,8 @@ public function index(Organization $organization, MemberIndexRequest $request): $members = Member::query() ->whereBelongsTo($organization, 'organization') ->with(['user']) + ->join('users', 'members.user_id', '=', 'users.id') + ->orderBy('users.name') ->paginate(config('app.pagination_per_page_default')); return MemberCollection::make($members); diff --git a/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php b/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php index 7981dbc8..323bae8a 100644 --- a/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php +++ b/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php @@ -52,6 +52,28 @@ public function test_index_returns_members_of_organization(): void $response->assertStatus(200); } + public function test_index_returns_members_of_organization_sorted_by_name(): void + { + // Arrange + $data = $this->createUserWithPermission([ + 'members:view', + ]); + $members = Member::factory()->forOrganization($data->organization)->createMany(4); + + Passport::actingAs($data->user); + + // Act + $response = $this->getJson(route('api.v1.members.index', $data->organization->getKey())); + + // Assert + $response->assertStatus(200); + // 2 members in $data, 4 members in $members. + $response->assertJsonCount(6, 'data'); + + $memberNames = $members->merge([$data->member, $data->ownerMember])->pluck('user.name')->sort()->values()->all(); + $this->assertEquals($memberNames, $response->json('data.*.name')); + } + public function test_update_member_fails_if_user_has_no_permission_to_update_members(): void { // Arrange From cf4837feb7470e58cec3d7be7fa588b36a150c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Gro=C3=9F?= Date: Fri, 7 Nov 2025 15:30:27 +0100 Subject: [PATCH 2/2] Ensure member id is not overwritten by user id --- app/Http/Controllers/Api/V1/MemberController.php | 1 + tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/Http/Controllers/Api/V1/MemberController.php b/app/Http/Controllers/Api/V1/MemberController.php index 4a4f6e32..efde792d 100644 --- a/app/Http/Controllers/Api/V1/MemberController.php +++ b/app/Http/Controllers/Api/V1/MemberController.php @@ -62,6 +62,7 @@ public function index(Organization $organization, MemberIndexRequest $request): ->with(['user']) ->join('users', 'members.user_id', '=', 'users.id') ->orderBy('users.name') + ->select('members.*') ->paginate(config('app.pagination_per_page_default')); return MemberCollection::make($members); diff --git a/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php b/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php index 323bae8a..4b312785 100644 --- a/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php +++ b/tests/Unit/Endpoint/Api/V1/MemberEndpointTest.php @@ -72,6 +72,8 @@ public function test_index_returns_members_of_organization_sorted_by_name(): voi $memberNames = $members->merge([$data->member, $data->ownerMember])->pluck('user.name')->sort()->values()->all(); $this->assertEquals($memberNames, $response->json('data.*.name')); + + $this->assertNotEquals($response->json('data.*.id'), $response->json('data.*.user_id')); } public function test_update_member_fails_if_user_has_no_permission_to_update_members(): void