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<PendingMembershipResponse> with all memberships (pending, active,
inactive) for the admin overview tab.

Tests: 3 new tests covering normal case, empty list, and missing user.
This commit is contained in:
Bernhard Müller 2026-07-23 13:53:04 +02:00
parent 72c29cfcc1
commit a426a91cfa
2 changed files with 73 additions and 0 deletions

View File

@ -143,6 +143,37 @@ public class MembershipService {
.toList(); .toList();
} }
@Transactional(readOnly = true)
public List<PendingMembershipResponse> getAllMemberships() {
List<Membership> allMemberships = membershipRepository.findAllWithDetails();
List<UUID> userIds = allMemberships.stream()
.map(m -> m.getMeteringPoint().getUserId())
.distinct()
.toList();
Map<UUID, User> 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) @Transactional(readOnly = true)
public List<PendingMembershipResponse> getPendingMemberships() { public List<PendingMembershipResponse> getPendingMemberships() {
List<Membership> pendingMemberships = membershipRepository.findPendingWithDetails(); List<Membership> pendingMemberships = membershipRepository.findPendingWithDetails();

View File

@ -259,6 +259,48 @@ class MembershipServiceTest {
assertNull(result.get(0).validTo()); 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<PendingMembershipResponse> 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<PendingMembershipResponse> 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<PendingMembershipResponse> result = membershipService.getAllMemberships();
assertEquals(1, result.size());
assertEquals("unknown", result.get(0).userEmail());
}
@Test @Test
void getPendingMemberships_setsValidDatesFromEntity() { void getPendingMemberships_setsValidDatesFromEntity() {
testMembership.setStatus(MembershipStatus.ACTIVE); testMembership.setStatus(MembershipStatus.ACTIVE);