diff --git a/source/java/org/alfresco/rest/api/Groups.java b/source/java/org/alfresco/rest/api/Groups.java index 0d78ac5238..53eb220387 100644 --- a/source/java/org/alfresco/rest/api/Groups.java +++ b/source/java/org/alfresco/rest/api/Groups.java @@ -116,7 +116,6 @@ public interface Groups * @param parameters * the {@link Parameters} object to get the parameters passed * into the request including: - include param (parentIds, zones) - * @return Updated group */ void delete(String groupId, Parameters parameters); @@ -139,4 +138,13 @@ public interface Groups * @return a {@code org.alfresco.rest.api.model.GroupMember} object */ GroupMember createGroupMember(String groupId, GroupMember groupMember); + + /** + * + * Delete group membership + * + * @param groupId + * @param groupMemberId + */ + void deleteGroupMembership(String groupId, String groupMemberId); } diff --git a/source/java/org/alfresco/rest/api/groups/GroupMembersRelation.java b/source/java/org/alfresco/rest/api/groups/GroupMembersRelation.java index 354f06c214..6deefd2481 100644 --- a/source/java/org/alfresco/rest/api/groups/GroupMembersRelation.java +++ b/source/java/org/alfresco/rest/api/groups/GroupMembersRelation.java @@ -45,7 +45,8 @@ import org.springframework.beans.factory.InitializingBean; * @author cturlica */ @RelationshipResource(name = "members", entityResource = GroupsEntityResource.class, title = "Group Members") -public class GroupMembersRelation implements RelationshipResourceAction.Read, RelationshipResourceAction.Create, InitializingBean +public class GroupMembersRelation + implements RelationshipResourceAction.Read, RelationshipResourceAction.Create, RelationshipResourceAction.Delete, InitializingBean { private Groups groups; @@ -76,4 +77,11 @@ public class GroupMembersRelation implements RelationshipResourceAction.Read groups = groupsProxy.getGroupsByPersonId(personAlice.getId(), null, "Couldn't get user's groups", 200); assertEquals(1L, (long) groups.getPaging().getTotalItems()); Iterator it = groups.getList().iterator(); - assertEquals("GROUP_EVERYONE", it.next().getId()); + assertEquals(GROUP_EVERYONE, it.next().getId()); } // Add the user to a couple more groups and list them. @@ -532,7 +551,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest ListResponse groups = groupsProxy.getGroupsByPersonId(personAlice.getId(), null, "Couldn't get user's groups", 200); assertEquals(4L, (long) groups.getPaging().getTotalItems()); Iterator it = groups.getList().iterator(); - assertEquals("GROUP_EVERYONE", it.next().getId()); + assertEquals(GROUP_EVERYONE, it.next().getId()); assertEquals(rootGroupName, it.next().getId()); assertEquals(groupA, it.next()); assertEquals(groupB, it.next()); @@ -565,7 +584,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest ListResponse groups = groupsProxy.getGroupsByPersonId("-me-", null, "Couldn't get user's groups", 200); assertEquals(4L, (long) groups.getPaging().getCount()); Iterator it = groups.getList().iterator(); - assertEquals("GROUP_EVERYONE", it.next().getId()); + assertEquals(GROUP_EVERYONE, it.next().getId()); assertEquals(rootGroupName, it.next().getId()); assertEquals(groupA, it.next()); assertEquals(groupB, it.next()); @@ -941,25 +960,6 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest { createAuthorityContext(user1); - Person personAlice; - { - publicApiClient.setRequestContext(new RequestContext(networkOne.getId(), networkAdmin, "admin")); - personAlice = new Person(); - String aliceId = "alice-" + UUID.randomUUID() + "@" + networkOne.getId(); - personAlice.setUserName(aliceId); - personAlice.setId(aliceId); - personAlice.setFirstName("Alice"); - personAlice.setEmail("alison.smith@example.com"); - personAlice.setPassword("password"); - personAlice.setEnabled(true); - PublicApiClient.People people = publicApiClient.people(); - people.create(personAlice); - } - - GroupMember personMember = new GroupMember(); - personMember.setId(personAlice.getId()); - personMember.setMemberType(MEMBER_TYPE_PERSON); - // +ve tests // Create a group membership (for a existing person and a sub-group) // within a group groupId @@ -1165,7 +1165,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest { setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD); - groupsProxy.deleteGroup("GROUP_EVERYONE", false, HttpServletResponse.SC_CONFLICT); + groupsProxy.deleteGroup(GROUP_EVERYONE, false, HttpServletResponse.SC_CONFLICT); } // Trying to delete a person. @@ -1200,6 +1200,73 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest } } + @Test + public void testDeleteGroupMembership() throws Exception + { + final Groups groupsProxy = publicApiClient.groups(); + + try + { + createAuthorityContext(user1); + + { + Map otherParams = new HashMap<>(); + otherParams.put("include", org.alfresco.rest.api.Groups.PARAM_INCLUDE_PARENT_IDS); + Group createdTestGroup = groupsProxy.createGroup(generateGroup(), null, HttpServletResponse.SC_CREATED); + // Add new created group to groupA + GroupMember groupMember = new GroupMember(); + groupMember.setId(createdTestGroup.getId()); + groupMember.setMemberType(MEMBER_TYPE_GROUP); + groupsProxy.createGroupMember(groupA.getId(), groupMember, HttpServletResponse.SC_CREATED); + + // If a removed sub-group no longer has any parent groups then + // it becomes a root group. + assertFalse(groupsProxy.getGroup(groupMember.getId(), otherParams, HttpServletResponse.SC_OK).getParentIds().isEmpty()); + groupsProxy.deleteGroupMembership(groupA.getId(), groupMember.getId(), HttpServletResponse.SC_NO_CONTENT); + assertTrue(groupsProxy.getGroup(groupMember.getId(), otherParams, HttpServletResponse.SC_OK).getParentIds().isEmpty()); + } + + { + // Add new a person as a member of groupA + groupsProxy.createGroupMember(groupA.getId(), personMember, HttpServletResponse.SC_CREATED); + ListResponse groups = groupsProxy.getGroupsByPersonId(personMember.getId(), null, "Cannot retrieve user groups", 200); + assertEquals(3L, (long) groups.getPaging().getTotalItems()); + Iterator it = groups.getList().iterator(); + assertEquals(GROUP_EVERYONE, it.next().getId()); + assertEquals(rootGroupName, it.next().getId()); + assertEquals(groupA, it.next()); + groupsProxy.deleteGroupMembership(groupA.getId(), personMember.getId(), HttpServletResponse.SC_NO_CONTENT); + groups = groupsProxy.getGroupsByPersonId(personMember.getId(), null, "Cannot retrieve user groups", 200); + assertEquals(1L, (long) groups.getPaging().getTotalItems()); + it = groups.getList().iterator(); + assertEquals(GROUP_EVERYONE, it.next().getId()); + } + + // -ve tests + // Group id or group member id do not exist. + { + groupsProxy.deleteGroupMembership("invalidGroupId", groupMemberA.getId(), HttpServletResponse.SC_NOT_FOUND); + groupsProxy.deleteGroupMembership(groupA.getId(), "invalidGroupMemberId", HttpServletResponse.SC_NOT_FOUND); + } + + // Authentication failed + { + setRequestContext(networkOne.getId(), GUID.generate(), "password"); + groupsProxy.deleteGroupMembership(groupA.getId(), groupMemberA.getId(), HttpServletResponse.SC_UNAUTHORIZED); + } + + // User does not have permission to delete a group membership + { + setRequestContext(user1); + groupsProxy.deleteGroupMembership(groupA.getId(), groupMemberA.getId(), HttpServletResponse.SC_FORBIDDEN); + } + } + finally + { + clearAuthorityContext(); + } + } + private Group generateGroup() { Group group = new Group(); diff --git a/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java b/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java index 316fbecee1..319882c61e 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java @@ -2335,7 +2335,12 @@ public class PublicApiClient { params = Collections.singletonMap("cascade", "true"); } - remove("groups", groupId, null, null, params, "Failed to remove site", expectedStatus); + remove("groups", groupId, null, null, params, "Failed to remove group", expectedStatus); + } + + public void deleteGroupMembership(String groupId, String groupMemberId, int expectedStatus) throws PublicApiException + { + remove("groups", groupId, "members", groupMemberId, null, "Failed to remove group member", expectedStatus); } private Group parseGroupEntity(HttpResponse response)