刘光辉
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
package jnpf.dmsPermission;
 
import jnpf.dmsEntity.permission.entity.DmsAccessExclusionEntity;
import jnpf.dmsEntity.permission.enums.DmsResourceType;
import jnpf.dmsEntity.permission.model.DmsResourcePath;
import jnpf.dmsMapper.DmsAccessExclusionMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
 
@Component
@RequiredArgsConstructor
public class DmsAccessExclusionResolver {
    private final DmsAccessExclusionMapper exclusionMapper;
 
    public Snapshot resolve(String tenantId, String userId, Collection<DmsResourcePath> paths) {
        LinkedHashSet<UUID> resourceIds = new LinkedHashSet<>();
        for (DmsResourcePath path : paths) {
            if (path.getDocumentId() != null) {
                resourceIds.add(path.getDocumentId());
            }
            if (DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType())) {
                resourceIds.add(path.getActualResourceId());
            }
        }
        if (resourceIds.isEmpty()) {
            return Snapshot.empty();
        }
        List<DmsAccessExclusionEntity> rows = exclusionMapper.selectActiveForResourceIds(
                tenantId, userId, new ArrayList<>(resourceIds));
        Set<UUID> documentIds = new HashSet<>();
        Set<UUID> versionIds = new HashSet<>();
        for (DmsAccessExclusionEntity row : rows == null
                ? Collections.<DmsAccessExclusionEntity>emptyList() : rows) {
            if (DmsResourceType.DOCUMENT.name().equals(row.getResourceType())) {
                documentIds.add(row.getResourceId());
            } else if (DmsResourceType.FILE_VERSION.name().equals(row.getResourceType())) {
                versionIds.add(row.getResourceId());
            }
        }
        return new Snapshot(documentIds, versionIds);
    }
 
    public boolean isExcluded(String tenantId, String userId, DmsResourcePath path) {
        return resolve(tenantId, userId, Collections.singletonList(path)).excludes(path);
    }
 
    public static final class Snapshot {
        private final Set<UUID> documentIds;
        private final Set<UUID> versionIds;
 
        public Snapshot(Set<UUID> documentIds, Set<UUID> versionIds) {
            this.documentIds = new HashSet<>(documentIds);
            this.versionIds = new HashSet<>(versionIds);
        }
 
        public static Snapshot empty() {
            return new Snapshot(Collections.<UUID>emptySet(), Collections.<UUID>emptySet());
        }
 
        public boolean excludes(DmsResourcePath path) {
            if (DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType())
                    && versionIds.contains(path.getActualResourceId())) {
                return true;
            }
            return path.getDocumentId() != null && documentIds.contains(path.getDocumentId());
        }
    }
}