From 28eba02746a80f0086736e0afe18ff2b6f981880 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Fri, 23 Apr 2021 12:51:39 +0200
Subject: [PATCH] Added recursive flag to share modal

---
 .../it/inaf/ia2/vospace/ui/client/VOSpaceClient.java     | 4 ++--
 .../java/it/inaf/ia2/vospace/ui/data/ShareRequest.java   | 9 +++++++++
 .../it/inaf/ia2/vospace/ui/service/SharingService.java   | 2 +-
 .../inaf/ia2/vospace/ui/service/SharingServiceTest.java  | 3 ++-
 vospace-ui-frontend/src/components/modal/ShareModal.vue  | 7 +++++--
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java
index e023156..a524967 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java
@@ -126,11 +126,11 @@ public class VOSpaceClient {
         call(request, BodyHandlers.ofInputStream(), 200, res -> null);
     }
 
-    public Node setNode(Node node) {
+    public Node setNode(Node node, boolean recursive) {
 
         String path = node.getUri().substring(("vos://" + authority).length());
 
-        HttpRequest request = getRequest("/nodes" + urlEncodePath(path))
+        HttpRequest request = getRequest("/nodes" + urlEncodePath(path) + "?recursive=" + recursive)
                 .header("Accept", useJson ? "application/json" : "text/xml")
                 .header("Content-Type", useJson ? "application/json" : "text/xml")
                 .POST(HttpRequest.BodyPublishers.ofString(marshal(node)))
diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/ShareRequest.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/ShareRequest.java
index 360a3f1..5870f9a 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/ShareRequest.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/ShareRequest.java
@@ -9,6 +9,7 @@ public class ShareRequest {
     private List<String> groupWrite;
     private List<String> userRead;
     private List<String> userWrite;
+    private boolean recursive;
 
     public String getPath() {
         return path;
@@ -49,4 +50,12 @@ public class ShareRequest {
     public void setUserWrite(List<String> userWrite) {
         this.userWrite = userWrite;
     }
+
+    public boolean isRecursive() {
+        return recursive;
+    }
+
+    public void setRecursive(boolean recursive) {
+        this.recursive = recursive;
+    }
 }
diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/SharingService.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/SharingService.java
index 8abb1a9..8551303 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/SharingService.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/SharingService.java
@@ -94,7 +94,7 @@ public class SharingService {
         getNodeProperty(node, NodeProperties.GROUP_READ_URI).setValue(groupRead);
         getNodeProperty(node, NodeProperties.GROUP_WRITE_URI).setValue(groupWrite);
 
-        vospaceClient.setNode(node);
+        vospaceClient.setNode(node, shareRequest.isRecursive());
     }
 
     private Property getNodeProperty(Node node, String uri) {
diff --git a/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/service/SharingServiceTest.java b/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/service/SharingServiceTest.java
index 23fd9da..dbb67b8 100644
--- a/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/service/SharingServiceTest.java
+++ b/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/service/SharingServiceTest.java
@@ -22,6 +22,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
@@ -114,7 +115,7 @@ public class SharingServiceTest {
             assertTrue(groupWrite.contains("people.bianca\\.verdi"));
             assertTrue(groupWrite.contains("group2"));
             return true;
-        }));
+        }), anyBoolean());
     }
 
     private List<RapUser> getRapUsers() {
diff --git a/vospace-ui-frontend/src/components/modal/ShareModal.vue b/vospace-ui-frontend/src/components/modal/ShareModal.vue
index 421986f..dc2d29f 100644
--- a/vospace-ui-frontend/src/components/modal/ShareModal.vue
+++ b/vospace-ui-frontend/src/components/modal/ShareModal.vue
@@ -6,6 +6,7 @@
   <h5 class="mt-3">Write permissions</h5>
   <ShareInputGroup id="user-write" :values="userWrite" :options="people" label="Users" placeholder="Search user..." buttonText="Add user" />
   <ShareInputGroup id="group-write" :values="groupWrite" :options="groups" label="Groups" placeholder="Search group..." buttonText="Add group" />
+  <b-form-checkbox id="recursive" v-model="recursive" name="recursive">Apply also to children</b-form-checkbox>
 </b-modal>
 </template>
 
@@ -34,7 +35,8 @@ export default {
       groupWrite: [],
       userWrite: [],
       people: [],
-      groups: []
+      groups: [],
+      recursive: true
     }
   },
   methods: {
@@ -64,7 +66,8 @@ export default {
         groupRead: this.groupRead,
         groupWrite: this.groupWrite,
         userRead: this.userRead,
-        userWrite: this.userWrite
+        userWrite: this.userWrite,
+        recursive: this.recursive
       }).then(() => {
         // Reload current path
         this.$bvModal.hide('share-modal');
-- 
GitLab