刘光辉
15 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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<PermissionGrantItemForm> items) {
        Map<DmsPrincipalType, Set<String>> 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<String> userIds) {
        Set<String> expected = userIds.stream().map(String::trim).collect(Collectors.toSet());
        Set<String> actual = ids(userApi.getUserName(new ArrayList<>(expected)), UserEntity::getId);
        Set<String> missing = new HashSet<>(expected);
        missing.removeAll(actual);
        if (!missing.isEmpty()) {
            throw DmsPermissionException.of(DmsPermissionError.PRINCIPAL_NOT_FOUND,
                    DmsPrincipalType.USER.name() + " 主体不存在或主体服务不可用: " + missing);
        }
    }
 
    private List<String> list(Map<DmsPrincipalType, Set<String>> values, DmsPrincipalType type) {
        Set<String> ids = values.get(type);
        return ids == null ? Collections.<String>emptyList() : new ArrayList<>(ids);
    }
 
    private <T> Set<String> ids(List<T> values, Function<T, String> 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<DmsPrincipalType, Set<String>> expected, DmsPrincipalType type,
                              Set<String> actual) {
        Set<String> missing = new HashSet<>(expected.getOrDefault(type, Collections.<String>emptySet()));
        missing.removeAll(actual);
        if (!missing.isEmpty()) {
            throw DmsPermissionException.of(DmsPermissionError.PRINCIPAL_NOT_FOUND,
                    type.name() + " 主体不存在或主体服务不可用: " + missing);
        }
    }
}