fix:角色列表

This commit is contained in:
waner 2026-04-27 11:00:56 +08:00
parent 4ecda99001
commit b9b70a0dd5
3 changed files with 25 additions and 16 deletions

View File

@ -34,6 +34,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -129,12 +130,14 @@ public class AuthAdminServiceImpl implements AuthAdminService {
String normalizedRoleFilter = normalizeRoleFilter(roleCode, rolesByCode); String normalizedRoleFilter = normalizeRoleFilter(roleCode, rolesByCode);
String normalizedStatusFilter = normalizeStatusFilter(status); String normalizedStatusFilter = normalizeStatusFilter(status);
List<AuthUserListItemResponse> filteredItems = accounts.stream() List<AuthUserListItemResponse> filteredItems = accounts.stream()
.map(account -> toUserListItem(account, rolesByCode.get(account.getRoleCode()))) .flatMap(account -> toUserListItems(account, rolesByCode.get(account.getRoleCode())))
.filter(item -> normalizedRoleFilter == null || normalizedRoleFilter.equals(item.getRoleCode())) .filter(item -> normalizedRoleFilter == null || normalizedRoleFilter.equals(item.getRoleCode()))
.filter(item -> normalizedStatusFilter == null || normalizedStatusFilter.equals(item.getStatus())) .filter(item -> normalizedStatusFilter == null || normalizedStatusFilter.equals(item.getStatus()))
.sorted(Comparator .sorted(Comparator
.comparingInt((AuthUserListItemResponse item) -> roleOrder(item.getRoleCode())) .comparingInt((AuthUserListItemResponse item) -> roleOrder(item.getRoleCode()))
.thenComparing(AuthUserListItemResponse::getUid, Comparator.nullsLast(Integer::compareTo))) .thenComparing(AuthUserListItemResponse::getUid, Comparator.nullsLast(Integer::compareTo))
.thenComparing(AuthUserListItemResponse::getUkeyBindingId, Comparator.nullsLast(Long::compareTo))
.thenComparing(AuthUserListItemResponse::getUkeySerialNo, Comparator.nullsLast(String::compareTo)))
.toList(); .toList();
int fromIndex = Math.min((normalizedPage - 1) * normalizedPageSize, filteredItems.size()); int fromIndex = Math.min((normalizedPage - 1) * normalizedPageSize, filteredItems.size());
@ -171,14 +174,18 @@ public class AuthAdminServiceImpl implements AuthAdminService {
authFullAccountRepository.update(account); authFullAccountRepository.update(account);
} }
private AuthUserListItemResponse toUserListItem(AuthFullAccountEntity account, RoleAccountEntity role) { private Stream<AuthUserListItemResponse> toUserListItems(AuthFullAccountEntity account, RoleAccountEntity role) {
List<String> ukeySerials = roleUkeyBindingRepository List<RoleUkeyBindingEntity> bindings = roleUkeyBindingRepository
.findActiveByRoleCodeAndUid(account.getRoleCode(), account.getUid()) .findActiveByRoleCodeAndUid(account.getRoleCode(), account.getUid())
.stream() .stream()
.map(RoleUkeyBindingEntity::getUkeySerial)
.filter(Objects::nonNull)
.distinct()
.toList(); .toList();
if (bindings.isEmpty()) {
return Stream.of(toUserListItem(account, role, null));
}
return bindings.stream().map(binding -> toUserListItem(account, role, binding));
}
private AuthUserListItemResponse toUserListItem(AuthFullAccountEntity account, RoleAccountEntity role, RoleUkeyBindingEntity binding) {
String effectiveStatus = effectiveStatus(role, account); String effectiveStatus = effectiveStatus(role, account);
AuthUserListItemResponse item = new AuthUserListItemResponse(); AuthUserListItemResponse item = new AuthUserListItemResponse();
item.setRoleCode(account.getRoleCode()); item.setRoleCode(account.getRoleCode());
@ -191,8 +198,8 @@ public class AuthAdminServiceImpl implements AuthAdminService {
item.setLastLoginAt(account.getLastLoginAt()); item.setLastLoginAt(account.getLastLoginAt());
item.setPasswordChangedAt(account.getPasswordChangedAt()); item.setPasswordChangedAt(account.getPasswordChangedAt());
item.setFailedCount(account.getFailedCount() == null ? 0 : account.getFailedCount()); item.setFailedCount(account.getFailedCount() == null ? 0 : account.getFailedCount());
item.setUkeySerials(ukeySerials); item.setUkeyBindingId(binding == null ? null : binding.getId());
item.setUkeySerialNo(String.join(",", ukeySerials)); item.setUkeySerialNo(binding == null ? null : binding.getUkeySerial());
return item; return item;
} }

View File

@ -262,8 +262,8 @@ class AuthControllerTest {
item.setUsername("super-admin-full-01"); item.setUsername("super-admin-full-01");
item.setStatus("ACTIVE"); item.setStatus("ACTIVE");
item.setStatusName("正常"); item.setStatusName("正常");
item.setUkeySerials(java.util.List.of("UK-PRIMARY", "UK-BACKUP")); item.setUkeyBindingId(1001L);
item.setUkeySerialNo("UK-PRIMARY,UK-BACKUP"); item.setUkeySerialNo("UK-PRIMARY");
AuthUserListResponse response = new AuthUserListResponse(); AuthUserListResponse response = new AuthUserListResponse();
response.setPage(1); response.setPage(1);
response.setPageSize(10); response.setPageSize(10);
@ -286,7 +286,8 @@ class AuthControllerTest {
.andExpect(status().isOk()) .andExpect(status().isOk())
.andExpect(content().string(containsString("\"roleCode\":\"SUPER_ADMIN\""))) .andExpect(content().string(containsString("\"roleCode\":\"SUPER_ADMIN\"")))
.andExpect(content().string(containsString("\"username\":\"super-admin-full-01\""))) .andExpect(content().string(containsString("\"username\":\"super-admin-full-01\"")))
.andExpect(content().string(containsString("\"ukeySerialNo\":\"UK-PRIMARY,UK-BACKUP\""))); .andExpect(content().string(containsString("\"ukeyBindingId\":1001")))
.andExpect(content().string(containsString("\"ukeySerialNo\":\"UK-PRIMARY\"")));
Mockito.verify(authAdminService).listUsers("SUPER_ADMIN", "ACTIVE", 1, 10); Mockito.verify(authAdminService).listUsers("SUPER_ADMIN", "ACTIVE", 1, 10);
} }

View File

@ -187,7 +187,7 @@ class AuthAdminServiceTest {
} }
@Test @Test
void shouldListUsersWithEffectiveStatusAndUkeySerials() { void shouldListUsersExpandedByUkeyBindingWithEffectiveStatus() {
InMemoryRoleAccountRepository roles = new InMemoryRoleAccountRepository(); InMemoryRoleAccountRepository roles = new InMemoryRoleAccountRepository();
InMemoryAuthFullAccountRepository accounts = new InMemoryAuthFullAccountRepository(); InMemoryAuthFullAccountRepository accounts = new InMemoryAuthFullAccountRepository();
InMemoryRoleUkeyBindingRepository bindings = new InMemoryRoleUkeyBindingRepository(); InMemoryRoleUkeyBindingRepository bindings = new InMemoryRoleUkeyBindingRepository();
@ -217,14 +217,14 @@ class AuthAdminServiceTest {
Assertions.assertEquals(1, response.getPage()); Assertions.assertEquals(1, response.getPage());
Assertions.assertEquals(10, response.getPageSize()); Assertions.assertEquals(10, response.getPageSize());
Assertions.assertEquals(1, response.getTotal()); Assertions.assertEquals(2, response.getTotal());
Assertions.assertEquals("SUPER_ADMIN", response.getItems().get(0).getRoleCode()); Assertions.assertEquals("SUPER_ADMIN", response.getItems().get(0).getRoleCode());
Assertions.assertEquals(1, response.getItems().get(0).getUid()); Assertions.assertEquals(1, response.getItems().get(0).getUid());
Assertions.assertEquals("超级管理员", response.getItems().get(0).getRoleName()); Assertions.assertEquals("超级管理员", response.getItems().get(0).getRoleName());
Assertions.assertEquals("super-admin-full-01", response.getItems().get(0).getUsername()); Assertions.assertEquals("super-admin-full-01", response.getItems().get(0).getUsername());
Assertions.assertEquals("正常", response.getItems().get(0).getStatusName()); Assertions.assertEquals("正常", response.getItems().get(0).getStatusName());
Assertions.assertEquals(List.of("UK-PRIMARY", "UK-BACKUP"), response.getItems().get(0).getUkeySerials()); Assertions.assertEquals("UK-BACKUP", response.getItems().get(0).getUkeySerialNo());
Assertions.assertEquals("UK-PRIMARY,UK-BACKUP", response.getItems().get(0).getUkeySerialNo()); Assertions.assertEquals("UK-PRIMARY", response.getItems().get(1).getUkeySerialNo());
var disabledResponse = service(roles, accounts, bindings, Mockito.mock(LmkService.class)) var disabledResponse = service(roles, accounts, bindings, Mockito.mock(LmkService.class))
.listUsers(null, "未启用", 1, 10); .listUsers(null, "未启用", 1, 10);
@ -232,6 +232,7 @@ class AuthAdminServiceTest {
Assertions.assertEquals(1, disabledResponse.getTotal()); Assertions.assertEquals(1, disabledResponse.getTotal());
Assertions.assertEquals("AUDIT_ADMIN", disabledResponse.getItems().get(0).getRoleCode()); Assertions.assertEquals("AUDIT_ADMIN", disabledResponse.getItems().get(0).getRoleCode());
Assertions.assertEquals("UNENABLED", disabledResponse.getItems().get(0).getStatus()); Assertions.assertEquals("UNENABLED", disabledResponse.getItems().get(0).getStatus());
Assertions.assertNull(disabledResponse.getItems().get(0).getUkeySerialNo());
} }
private static AuthAdminService service( private static AuthAdminService service(