package jnpf.dmsPermission; import jnpf.dmsEntity.permission.enums.DmsPrincipalType; import jnpf.dmsEntity.permission.form.PermissionGrantItemForm; import jnpf.dmsMapper.DmsPermissionGroupMapper; import jnpf.permission.OrganizeApi; import jnpf.permission.PositionApi; import jnpf.permission.RoleApi; import jnpf.permission.UserApi; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.PermissionGroupEntity; import jnpf.permission.entity.PositionEntity; import jnpf.permission.entity.RoleEntity; import jnpf.permission.entity.UserEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.EnumMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @Component @RequiredArgsConstructor public class DmsPrincipalValidator { private final UserApi userApi; private final OrganizeApi organizeApi; private final PositionApi positionApi; private final RoleApi roleApi; private final DmsPermissionGroupMapper permissionGroupMapper; public void validate(List items) { Map> expected = new EnumMap<>(DmsPrincipalType.class); for (PermissionGrantItemForm item : items) { expected.computeIfAbsent(item.getPrincipalType(), key -> new HashSet<>()) .add(item.getPrincipalId().trim()); } if (expected.containsKey(DmsPrincipalType.USER)) { validateType(expected, DmsPrincipalType.USER, ids(userApi.getUserName(list(expected, DmsPrincipalType.USER)), UserEntity::getId)); } if (expected.containsKey(DmsPrincipalType.ORG)) { validateType(expected, DmsPrincipalType.ORG, ids(organizeApi.getListByIds(list(expected, DmsPrincipalType.ORG)), OrganizeEntity::getId)); } if (expected.containsKey(DmsPrincipalType.POSITION)) { validateType(expected, DmsPrincipalType.POSITION, ids(positionApi.getListByIds(list(expected, DmsPrincipalType.POSITION)), PositionEntity::getId)); } if (expected.containsKey(DmsPrincipalType.ROLE)) { validateType(expected, DmsPrincipalType.ROLE, ids(roleApi.getListByIds(list(expected, DmsPrincipalType.ROLE)), RoleEntity::getId)); } if (expected.containsKey(DmsPrincipalType.GROUP)) { validateType(expected, DmsPrincipalType.GROUP, ids(permissionGroupMapper.selectEnabledByIds(expected.get(DmsPrincipalType.GROUP)), PermissionGroupEntity::getId)); } } public void validateUsers(Collection userIds) { Set expected = userIds.stream().map(String::trim).collect(Collectors.toSet()); Set actual = ids(userApi.getUserName(new ArrayList<>(expected)), UserEntity::getId); Set missing = new HashSet<>(expected); missing.removeAll(actual); if (!missing.isEmpty()) { throw DmsPermissionException.of(DmsPermissionError.PRINCIPAL_NOT_FOUND, DmsPrincipalType.USER.name() + " 主体不存在或主体服务不可用: " + missing); } } private List list(Map> values, DmsPrincipalType type) { Set ids = values.get(type); return ids == null ? Collections.emptyList() : new ArrayList<>(ids); } private Set ids(List values, Function getter) { if (values == null) { return Collections.emptySet(); } return values.stream().filter(value -> value != null && getter.apply(value) != null) .map(getter).collect(Collectors.toSet()); } private void validateType(Map> expected, DmsPrincipalType type, Set actual) { Set missing = new HashSet<>(expected.getOrDefault(type, Collections.emptySet())); missing.removeAll(actual); if (!missing.isEmpty()) { throw DmsPermissionException.of(DmsPermissionError.PRINCIPAL_NOT_FOUND, type.name() + " 主体不存在或主体服务不可用: " + missing); } } }