You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by dy...@apache.org on 2022/09/22 14:02:36 UTC

[incubator-datalab] 02/02: sort shared info for images, hide from non owners

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 <de...@gmail.com>
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: commits-unsubscribe@datalab.apache.org
For additional commands, e-mail: commits-help@datalab.apache.org