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 paths) { LinkedHashSet 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 rows = exclusionMapper.selectActiveForResourceIds( tenantId, userId, new ArrayList<>(resourceIds)); Set documentIds = new HashSet<>(); Set versionIds = new HashSet<>(); for (DmsAccessExclusionEntity row : rows == null ? Collections.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 documentIds; private final Set versionIds; public Snapshot(Set documentIds, Set versionIds) { this.documentIds = new HashSet<>(documentIds); this.versionIds = new HashSet<>(versionIds); } public static Snapshot empty() { return new Snapshot(Collections.emptySet(), Collections.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()); } } }