diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRuleSetsTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRuleSetsTests.java index fe037be6b2..37cc38ab66 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRuleSetsTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRuleSetsTests.java @@ -27,6 +27,7 @@ package org.alfresco.rest.rules; import static org.alfresco.rest.requests.RuleSettings.IS_INHERITANCE_ENABLED; import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel; +import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModelWithDefaultValues; import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModelWithModifiedValues; import static org.alfresco.utility.report.log.Step.STEP; import static org.junit.Assert.assertTrue; @@ -322,6 +323,43 @@ public class GetRuleSetsTests extends RestTest .assertThat().field("id").is(ruleSetId); } + /** Check we can get the folders that link to a rule set and that this respects permissions. */ + @Test (groups = { TestGroup.REST_API, TestGroup.RULES }) + public void getRuleSetsAndLinkedToBy() + { + STEP("Create a site owned by admin and add user as a contributor"); + SiteModel siteModel = dataSite.usingAdmin().createPrivateRandomSite(); + dataUser.addUserToSite(user, siteModel, UserRole.SiteContributor); + + STEP("Create the folder structure"); + FolderModel ruleFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder(); + FolderModel publicFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder(); + FolderModel privateFolder = dataContent.usingAdmin().usingSite(siteModel).createFolder(); + dataContent.usingAdmin().usingResource(privateFolder).setInheritPermissions(false); + + STEP("Remove the user from the site"); + dataUser.removeUserFromSite(user, siteModel); + + STEP("Create a rule in the folder and link to it from the other two."); + RestRuleModel ruleModel = createRuleModelWithDefaultValues(); + coreAPIForUser().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel); + RestRuleSetModelsCollection ruleSets = coreAPIForAdmin().usingNode(ruleFolder).getListOfRuleSets(); + String ruleSetId = ruleSets.getEntries().get(0).onModel().getId(); + RestRuleSetLinkModel ruleSetLink = new RestRuleSetLinkModel(); + ruleSetLink.setId(ruleFolder.getNodeRef()); + coreAPIForUser().usingNode(publicFolder).createRuleLink(ruleSetLink); + coreAPIForUser().usingNode(privateFolder).createRuleLink(ruleSetLink); + + STEP("Get the rule set and linkedToBy field"); + RestRuleSetModel ruleSet = coreAPIForUser().usingNode(ruleFolder) + .include("linkedToBy") + .getRuleSet(ruleSetId); + + restClient.assertStatusCodeIs(OK); + ruleSet.assertThat().field("linkedToBy").is(List.of(publicFolder.getNodeRef())) + .assertThat().field("id").is(ruleSetId); + } + private RestCoreAPI coreAPIForUser() { return restClient.authenticateUser(user).withCoreAPI(); diff --git a/pom.xml b/pom.xml index a6e8405f95..589912dfba 100644 --- a/pom.xml +++ b/pom.xml @@ -123,7 +123,7 @@ 2.7.4 3.0.49 5.2.0 - 1.117 + 1.119 1.32 1.9 1.7 diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/rules/RuleSetLoader.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/rules/RuleSetLoader.java index 9800de58b3..a48a800651 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/rules/RuleSetLoader.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/rules/RuleSetLoader.java @@ -30,6 +30,7 @@ import static org.alfresco.rest.api.model.rules.InclusionType.LINKED; import static org.alfresco.rest.api.model.rules.InclusionType.OWNED; import java.util.List; +import java.util.stream.Collectors; import org.alfresco.rest.api.model.rules.RuleSet; import org.alfresco.service.Experimental; @@ -45,7 +46,8 @@ public class RuleSetLoader protected static final String OWNING_FOLDER = "owningFolder"; protected static final String INCLUSION_TYPE = "inclusionType"; protected static final String INHERITED_BY = "inheritedBy"; - public static final int MAX_INHERITED_BY_SIZE = 100; + protected static final String LINKED_TO_BY = "linkedToBy"; + private static final int MAX_INHERITED_BY_SIZE = 100; private NodeService nodeService; private RuleService ruleService; @@ -87,6 +89,15 @@ public class RuleSetLoader { ruleSet.setInheritedBy(loadInheritedBy(ruleSetNodeRef)); } + if (includes.contains(LINKED_TO_BY)) + { + List linkedToBy = nodeService.getParentAssocs(ruleSetNodeRef) + .stream() + .map(ChildAssociationRef::getParentRef) + .filter(folder -> !folder.equals(parentRef)) + .collect(Collectors.toList()); + ruleSet.setLinkedToBy(linkedToBy); + } } return ruleSet; } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/rules/RuleSet.java b/remote-api/src/main/java/org/alfresco/rest/api/model/rules/RuleSet.java index e2719bd4ed..98a7c24e87 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/model/rules/RuleSet.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/rules/RuleSet.java @@ -42,6 +42,7 @@ public class RuleSet private NodeRef owningFolder; private InclusionType inclusionType; private List inheritedBy; + private List linkedToBy; public static RuleSet of(String id) { @@ -98,6 +99,16 @@ public class RuleSet this.inheritedBy = inheritedBy; } + public List getLinkedToBy() + { + return linkedToBy; + } + + public void setLinkedToBy(List linkedToBy) + { + this.linkedToBy = linkedToBy; + } + @Override public String toString() { @@ -107,6 +118,7 @@ public class RuleSet .add("owningFolder='" + owningFolder + "'") .add("inclusionType='" + inclusionType + "'") .add("inheritedBy='" + inheritedBy + "'") + .add("linkedToBy='" + linkedToBy + "'") .toString() + '}'; } @@ -122,13 +134,14 @@ public class RuleSet return Objects.equals(id, ruleSet.id) && Objects.equals(owningFolder, ruleSet.owningFolder) && inclusionType == ruleSet.inclusionType - && Objects.equals(inheritedBy, ruleSet.inheritedBy); + && Objects.equals(inheritedBy, ruleSet.inheritedBy) + && Objects.equals(linkedToBy, ruleSet.linkedToBy); } @Override public int hashCode() { - return Objects.hash(id, owningFolder, inclusionType, inheritedBy); + return Objects.hash(id, owningFolder, inclusionType, inheritedBy, linkedToBy); } public static Builder builder() @@ -142,6 +155,7 @@ public class RuleSet private NodeRef owningFolder; private InclusionType inclusionType; private List inheritedBy; + private List linkedToBy; public Builder id(String id) { @@ -167,6 +181,12 @@ public class RuleSet return this; } + public Builder linkedToBy(List linkedToBy) + { + this.linkedToBy = linkedToBy; + return this; + } + public RuleSet create() { final RuleSet ruleSet = new RuleSet(); @@ -174,6 +194,7 @@ public class RuleSet ruleSet.setOwningFolder(owningFolder); ruleSet.setInclusionType(inclusionType); ruleSet.setInheritedBy(inheritedBy); + ruleSet.setLinkedToBy(linkedToBy); return ruleSet; } } diff --git a/remote-api/src/test/java/org/alfresco/rest/api/impl/rules/RuleSetLoaderTest.java b/remote-api/src/test/java/org/alfresco/rest/api/impl/rules/RuleSetLoaderTest.java index f30cef0bf3..51a7c52bea 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/impl/rules/RuleSetLoaderTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/impl/rules/RuleSetLoaderTest.java @@ -27,6 +27,7 @@ package org.alfresco.rest.api.impl.rules; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INCLUSION_TYPE; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INHERITED_BY; +import static org.alfresco.rest.api.impl.rules.RuleSetLoader.LINKED_TO_BY; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.OWNING_FOLDER; import static org.alfresco.rest.api.model.rules.InclusionType.INHERITED; import static org.alfresco.rest.api.model.rules.InclusionType.LINKED; @@ -148,4 +149,14 @@ public class RuleSetLoaderTest extends TestCase RuleSet expected = RuleSet.builder().id(RULE_SET_ID).inheritedBy(List.of(INHERITING_FOLDER)).create(); assertEquals(expected, actual); } + + @Test + public void testLoadRuleSet_linkedToBy() + { + // Call the method under test. + RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, FOLDER_NODE, List.of(LINKED_TO_BY)); + + RuleSet expected = RuleSet.builder().id(RULE_SET_ID).linkedToBy(List.of(LINKING_FOLDER)).create(); + assertEquals(expected, actual); + } }