From a426a91cfa31161e4bc5401d61e3aef774aaea5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20M=C3=BCller?= Date: Thu, 23 Jul 2026 13:53:04 +0200 Subject: [PATCH] feat(community): add getAllMemberships() to MembershipService Add @Transactional(readOnly = true) method that uses findAllWithDetails() and batch-fetches users with the same lookup pattern as getPendingMemberships(). Returns List with all memberships (pending, active, inactive) for the admin overview tab. Tests: 3 new tests covering normal case, empty list, and missing user. --- .../community/service/MembershipService.java | 31 ++++++++++++++ .../service/MembershipServiceTest.java | 42 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/eeg_backend/src/main/java/at/mueller/eeg/backend/community/service/MembershipService.java b/eeg_backend/src/main/java/at/mueller/eeg/backend/community/service/MembershipService.java index 5b99652..aefb8c8 100644 --- a/eeg_backend/src/main/java/at/mueller/eeg/backend/community/service/MembershipService.java +++ b/eeg_backend/src/main/java/at/mueller/eeg/backend/community/service/MembershipService.java @@ -143,6 +143,37 @@ public class MembershipService { .toList(); } + @Transactional(readOnly = true) + public List getAllMemberships() { + List allMemberships = membershipRepository.findAllWithDetails(); + + List userIds = allMemberships.stream() + .map(m -> m.getMeteringPoint().getUserId()) + .distinct() + .toList(); + + Map usersById = userRepository.findAllById(userIds).stream() + .collect(Collectors.toMap(User::getId, user -> user)); + + return allMemberships.stream() + .map(m -> { + User user = usersById.get(m.getMeteringPoint().getUserId()); + return new PendingMembershipResponse( + m.getId(), + user != null ? user.getEmail() : "unknown", + user != null ? user.getFirstName() : "unknown", + user != null ? user.getLastName() : "unknown", + m.getMeteringPoint().getAtNumber(), + m.getEnergyCommunity().getName(), + m.getPriorityLevel(), + m.getStatus().name(), + m.getValidFrom(), + m.getValidTo() + ); + }) + .toList(); + } + @Transactional(readOnly = true) public List getPendingMemberships() { List pendingMemberships = membershipRepository.findPendingWithDetails(); diff --git a/eeg_backend/src/test/java/at/mueller/eeg/backend/community/service/MembershipServiceTest.java b/eeg_backend/src/test/java/at/mueller/eeg/backend/community/service/MembershipServiceTest.java index 5d59fb2..06ae4aa 100644 --- a/eeg_backend/src/test/java/at/mueller/eeg/backend/community/service/MembershipServiceTest.java +++ b/eeg_backend/src/test/java/at/mueller/eeg/backend/community/service/MembershipServiceTest.java @@ -259,6 +259,48 @@ class MembershipServiceTest { assertNull(result.get(0).validTo()); } + @Test + void getAllMemberships_returnsAllMemberships() { + when(membershipRepository.findAllWithDetails()).thenReturn(List.of(testMembership)); + when(userRepository.findAllById(List.of(testUserId))).thenReturn(List.of(testUser)); + + List result = membershipService.getAllMemberships(); + + assertEquals(1, result.size()); + assertEquals(testMembershipId, result.get(0).id()); + assertEquals("test@example.com", result.get(0).userEmail()); + assertEquals("Test", result.get(0).firstName()); + assertEquals("PENDING", result.get(0).status()); + } + + @Test + void getAllMemberships_returnsEmptyListWhenNoMemberships() { + when(membershipRepository.findAllWithDetails()).thenReturn(List.of()); + + List result = membershipService.getAllMemberships(); + + assertTrue(result.isEmpty()); + verify(userRepository).findAllById(List.of()); + } + + @Test + void getAllMemberships_handlesMissingUser() { + Membership membershipWithUnknownUser = new Membership(); + membershipWithUnknownUser.setId(UUID.randomUUID()); + membershipWithUnknownUser.setMeteringPoint(testMeteringPoint); + membershipWithUnknownUser.setEnergyCommunity(testCommunity); + membershipWithUnknownUser.setPriorityLevel(1); + membershipWithUnknownUser.setStatus(MembershipStatus.ACTIVE); + + when(membershipRepository.findAllWithDetails()).thenReturn(List.of(membershipWithUnknownUser)); + when(userRepository.findAllById(List.of(testUserId))).thenReturn(List.of()); + + List result = membershipService.getAllMemberships(); + + assertEquals(1, result.size()); + assertEquals("unknown", result.get(0).userEmail()); + } + @Test void getPendingMemberships_setsValidDatesFromEntity() { testMembership.setStatus(MembershipStatus.ACTIVE);