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());
|
}
|
}
|
}
|