This is an automated email from the ASF dual-hosted git repository. dyankiv pushed a commit to branch DATALAB-2932 in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit 598c5107808365192d41583cbcae8240ed318334 Author: Denys Yankiv <[email protected]> AuthorDate: Thu Sep 22 17:01:44 2022 +0300 sort shared info for images, hide from non owners --- .../main/java/com/epam/datalab/dto/SharedWith.java | 8 +-- .../resources/ImageExploratoryResource.java | 5 +- .../{ImageInfoRecord.java => ImageInfoDTO.java} | 46 ++++++------- .../backendapi/resources/dto/ImageInfoRecord.java | 3 - .../resources/dto/ProjectImagesInfo.java | 2 +- .../service/ImageExploratoryService.java | 2 +- .../service/impl/ImageExploratoryServiceImpl.java | 77 +++++++++++++++------- 7 files changed, 86 insertions(+), 57 deletions(-) diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java index 21daa22e1..711043fb7 100644 --- a/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java +++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java @@ -20,15 +20,13 @@ package com.epam.datalab.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.AllArgsConstructor; import lombok.Data; -import java.util.HashSet; -import java.util.Set; +import java.util.TreeSet; @Data @JsonIgnoreProperties(ignoreUnknown = true) public class SharedWith { - private Set<String> users=new HashSet<>(); - private Set<String> groups=new HashSet<>(); + private TreeSet<String> users = new TreeSet<>(); + private TreeSet<String> groups = new TreeSet<>(); } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java index 3b3c92af9..c70885b83 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java @@ -79,9 +79,8 @@ public class ImageExploratoryResource { @QueryParam("project") String project, @QueryParam("endpoint") String endpoint) { log.debug("Getting images for user {}, project {}", ui.getName(), project); - final List<ImageInfoRecord> images = imageExploratoryService.getNotFailedImages(ui, dockerImage, - project, endpoint); - return Response.ok(images).build(); + return Response.ok(imageExploratoryService.getNotFailedImages(ui, dockerImage, + project, endpoint)).build(); } @GET diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoDTO.java similarity index 61% copy from services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java copy to services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoDTO.java index ca51fe771..f45085b00 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoDTO.java @@ -17,6 +17,7 @@ * under the License. */ + package com.epam.datalab.backendapi.resources.dto; import com.epam.datalab.cloud.CloudProvider; @@ -25,34 +26,35 @@ import com.epam.datalab.dto.aws.computational.ClusterConfig; import com.epam.datalab.dto.exploratory.ImageSharingStatus; import com.epam.datalab.dto.exploratory.ImageStatus; import com.epam.datalab.model.library.Library; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import java.util.Date; import java.util.List; import java.util.Map; - @Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class ImageInfoRecord { - private final String name; - private final Date timestamp; - private final String description; - private final String project; - private final String endpoint; - private final String user; - private final String application; - private final String templateName; - private final String instanceName; - private final CloudProvider cloudProvider; - private final String dockerImage; - private final String fullName; - private final ImageStatus status; +@Builder +@AllArgsConstructor +public class ImageInfoDTO { + private String name; + private Date timestamp; + private String description; + private String project; + private String endpoint; + private String user; + private String application; + private String templateName; + private String instanceName; + private CloudProvider cloudProvider; + private String dockerImage; + private String fullName; + private ImageStatus status; private ImageSharingStatus sharingStatus; private ImageUserPermissions imageUserPermissions; - private final SharedWith sharedWith; - private final List<ClusterConfig> clusterConfig; - private final String exploratoryURL; - private final List<Library> libraries; - private final Map<String, List<Library>> computationalLibraries; + private SharedWith sharedWith; + private List<ClusterConfig> clusterConfig; + private String exploratoryURL; + private List<Library> libraries; + private Map<String, List<Library>> computationalLibraries; } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java index ca51fe771..a4472e1d4 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java @@ -22,7 +22,6 @@ package com.epam.datalab.backendapi.resources.dto; import com.epam.datalab.cloud.CloudProvider; import com.epam.datalab.dto.SharedWith; import com.epam.datalab.dto.aws.computational.ClusterConfig; -import com.epam.datalab.dto.exploratory.ImageSharingStatus; import com.epam.datalab.dto.exploratory.ImageStatus; import com.epam.datalab.model.library.Library; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -48,8 +47,6 @@ public class ImageInfoRecord { private final String dockerImage; private final String fullName; private final ImageStatus status; - private ImageSharingStatus sharingStatus; - private ImageUserPermissions imageUserPermissions; private final SharedWith sharedWith; private final List<ClusterConfig> clusterConfig; private final String exploratoryURL; diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java index 8743214c4..46dfe6663 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java @@ -33,5 +33,5 @@ public class ProjectImagesInfo { @JsonProperty private String project; @JsonProperty - private List<ImageInfoRecord> images; + private List<ImageInfoDTO> images; } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java index a81e8f144..c1149fb42 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java @@ -36,7 +36,7 @@ public interface ImageExploratoryService { void finishImageCreate(Image image, String exploratoryName, String newNotebookIp); - List<ImageInfoRecord> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint); + List<ImageInfoDTO> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint); ImageInfoRecord getImage(String user, String name, String project, String endpoint); diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java index 67d8658cc..b1acbc270 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java @@ -184,7 +184,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { } @Override - public List<ImageInfoRecord> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint) { + public List<ImageInfoDTO> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint) { List<ImageInfoRecord> images = new ArrayList<>(); if (UserRoles.checkAccess(user, RoleType.PAGE, CREATE_NOTEBOOK_BASED_ON_OWN_IMAGES, user.getRoles())) { images.addAll(imageExploratoryDao.getImages(user.getName(), dockerImage, project, endpoint, ImageStatus.ACTIVE, ImageStatus.CREATING)); @@ -192,7 +192,8 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { if (UserRoles.checkAccess(user, RoleType.PAGE, CREATE_NOTEBOOK_BASED_ON_SHARED_IMAGES, user.getRoles())) { images.addAll(getSharedImages(user, dockerImage, project, endpoint)); } - return images; + List<ImageInfoDTO> imageInfoDTOs = images.stream().map(img -> toImageInfoDTO(img, user)).collect(Collectors.toList()); + return removeSharedWithIfNotOwner(user,imageInfoDTOs); } @Override @@ -216,29 +217,30 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { public ImagesPageInfo getImagesOfUser(UserInfo user, ImageFilter imageFilter) { log.debug("Loading list of images for user {}", user.getName()); List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName()); - images.forEach(img -> img.setSharingStatus(getImageSharingStatus(user.getName(), img))); - images.addAll(getSharedImages(user)); - ImageFilterFormData filterData = getDataForFilter(images); + + List<ImageInfoDTO> imagesDTOs = images.stream().map(img -> toImageInfoDTO(img, user)).collect(Collectors.toList()); + imagesDTOs.addAll(getSharedImages(user).stream().map(img -> toImageInfoDTO(img, user)).collect(Collectors.toList())); + ImageFilterFormData filterData = getDataForFilter(imagesDTOs); if (imageFilter == null) { if (userSettingsDAO.getImageFilter(user.getName()).isPresent()) { imageFilter = userSettingsDAO.getImageFilter(user.getName()).get(); - images = filterImages(images, imageFilter); + imagesDTOs = filterImages(imagesDTOs, imageFilter); } else { imageFilter = new ImageFilter(); userSettingsDAO.setUserImageFilter(user.getName(), imageFilter); } } else { - images = filterImages(images, imageFilter); + imagesDTOs = filterImages(imagesDTOs, imageFilter); userSettingsDAO.setUserImageFilter(user.getName(), imageFilter); } - images.forEach(img -> img.setImageUserPermissions(getUserImagePermissions(user, img))); - final List<ImageInfoRecord> finalImages = images; + // do not show sharing if not owner + final List<ImageInfoDTO> finalImages = removeSharedWithIfNotOwner(user, imagesDTOs); List<ProjectImagesInfo> projectImagesInfoList = projectService.getUserProjects(user, Boolean.FALSE) .stream() .map(p -> { - List<ImageInfoRecord> im = finalImages.stream().filter(img -> img.getProject().equals(p.getName())).collect(Collectors.toList()); + List<ImageInfoDTO> im = finalImages.stream().filter(img -> img.getProject().equals(p.getName())).collect(Collectors.toList()); return ProjectImagesInfo.builder() .project(p.getName()) .images(im) @@ -271,13 +273,10 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { @Override public List<ImageInfoRecord> getSharedImages(UserInfo userInfo) { - List<ImageInfoRecord> sharedImages = imageExploratoryDao.getAllImages().stream() + return imageExploratoryDao.getAllImages().stream() .filter(img -> !img.getUser().equals(userInfo.getName())) .filter(img -> hasAccess(userInfo.getName(), img.getSharedWith())) .collect(Collectors.toList()); - sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(), img))); - log.info("Shared with user {} images : {}", userInfo.getName(), sharedImages); - return sharedImages; } @Override @@ -288,7 +287,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { .filter(img -> img.getDockerImage().equals(dockerImage) && img.getProject().equals(project) && img.getEndpoint().equals(endpoint)) .filter(img -> hasAccess(userInfo.getName(), img.getSharedWith())) .collect(Collectors.toList()); - sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(), img))); + //sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(), img))); log.info("Found shared with user {} images {}", userInfo.getName(), sharedImages); return sharedImages; } @@ -391,7 +390,16 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { return ImageSharingStatus.RECEIVED; } - private List<ImageInfoRecord> filterImages(List<ImageInfoRecord> images, ImageFilter filter) { + private List<ImageInfoDTO> removeSharedWithIfNotOwner(UserInfo user, List<ImageInfoDTO> imageInfoDTOS){ + imageInfoDTOS.forEach(img -> { + if(!img.getUser().equals(user.getName())){ + img.setSharedWith(new SharedWith()); + } + }); + return imageInfoDTOS; + } + + private List<ImageInfoDTO> filterImages(List<ImageInfoDTO> images, ImageFilter filter) { return images.stream() .filter(img -> img.getName().toLowerCase().contains(filter.getImageName().toLowerCase())) .filter(img -> CollectionUtils.isEmpty(filter.getStatuses()) || filter.getStatuses().contains(img.getStatus())) @@ -402,13 +410,38 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { } - private ImageFilterFormData getDataForFilter(List<ImageInfoRecord> images) { + private ImageFilterFormData getDataForFilter(List<ImageInfoDTO> images) { ImageFilterFormData filterData = new ImageFilterFormData(); - filterData.setImageNames(images.stream().map(ImageInfoRecord::getName).collect(Collectors.toSet())); - filterData.setStatuses(images.stream().map(ImageInfoRecord::getStatus).collect(Collectors.toSet())); - filterData.setEndpoints(images.stream().map(ImageInfoRecord::getEndpoint).collect(Collectors.toSet())); - filterData.setTemplateNames(images.stream().map(ImageInfoRecord::getTemplateName).collect(Collectors.toSet())); - filterData.setSharingStatuses(images.stream().map(ImageInfoRecord::getSharingStatus).collect(Collectors.toSet())); + filterData.setImageNames(images.stream().map(ImageInfoDTO::getName).collect(Collectors.toSet())); + filterData.setStatuses(images.stream().map(ImageInfoDTO::getStatus).collect(Collectors.toSet())); + filterData.setEndpoints(images.stream().map(ImageInfoDTO::getEndpoint).collect(Collectors.toSet())); + filterData.setTemplateNames(images.stream().map(ImageInfoDTO::getTemplateName).collect(Collectors.toSet())); + filterData.setSharingStatuses(images.stream().map(ImageInfoDTO::getSharingStatus).collect(Collectors.toSet())); return filterData; } + + private ImageInfoDTO toImageInfoDTO(ImageInfoRecord imageInfoRecord, UserInfo userInfo){ + return ImageInfoDTO.builder() + .name(imageInfoRecord.getName()) + .timestamp(imageInfoRecord.getTimestamp()) + .description(imageInfoRecord.getDescription()) + .project(imageInfoRecord.getProject()) + .endpoint(imageInfoRecord.getEndpoint()) + .user(imageInfoRecord.getUser()) + .application(imageInfoRecord.getApplication()) + .templateName(imageInfoRecord.getTemplateName()) + .instanceName(imageInfoRecord.getInstanceName()) + .cloudProvider(imageInfoRecord.getCloudProvider()) + .dockerImage(imageInfoRecord.getDockerImage()) + .fullName(imageInfoRecord.getFullName()) + .status(imageInfoRecord.getStatus()) + .sharingStatus(getImageSharingStatus(userInfo.getName(), imageInfoRecord)) + .imageUserPermissions(getUserImagePermissions(userInfo, imageInfoRecord)) + .sharedWith(imageInfoRecord.getSharedWith()) + .clusterConfig(imageInfoRecord.getClusterConfig()) + .exploratoryURL(imageInfoRecord.getExploratoryURL()) + .libraries(imageInfoRecord.getLibraries()) + .computationalLibraries(imageInfoRecord.getComputationalLibraries()) + .build(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
