diff --git a/source/java/org/alfresco/rest/api/Groups.java b/source/java/org/alfresco/rest/api/Groups.java index 9a3e17b502..509492b465 100644 --- a/source/java/org/alfresco/rest/api/Groups.java +++ b/source/java/org/alfresco/rest/api/Groups.java @@ -58,6 +58,21 @@ public interface Groups */ Group create(Group group, Parameters parameters); + /** + * Update the given group. Not all fields are used, only those as defined in + * the Open API spec. + * + * @param groupId + * the group ID + * @param group + * details to use for the update + * @param parameters + * the {@link Parameters} object to get the parameters passed + * into the request including: - include param (parentIds, zones) + * @return Updated group + */ + Group update(String groupId, Group group, Parameters parameters); + /** * Get a group by it's id. * diff --git a/source/java/org/alfresco/rest/api/groups/GroupsEntityResource.java b/source/java/org/alfresco/rest/api/groups/GroupsEntityResource.java index af478caa04..8ca41f0278 100644 --- a/source/java/org/alfresco/rest/api/groups/GroupsEntityResource.java +++ b/source/java/org/alfresco/rest/api/groups/GroupsEntityResource.java @@ -47,7 +47,8 @@ import java.util.List; * @author cturlica */ @EntityResource(name = "groups", title = "Groups") -public class GroupsEntityResource implements EntityResourceAction.Read, EntityResourceAction.ReadById, EntityResourceAction.Create, InitializingBean +public class GroupsEntityResource + implements EntityResourceAction.Read, EntityResourceAction.ReadById, EntityResourceAction.Create, EntityResourceAction.Update, InitializingBean { private Groups groups; @@ -86,4 +87,11 @@ public class GroupsEntityResource implements EntityResourceAction.Read, E result.add(groups.create(entity.get(0), parameters)); return result; } + + @Override + @WebApiDescription(title = "Update group", description = "Update group") + public Group update(String groupId, Group group, Parameters parameters) + { + return groups.update(groupId, group, parameters); + } } \ No newline at end of file diff --git a/source/java/org/alfresco/rest/api/impl/GroupsImpl.java b/source/java/org/alfresco/rest/api/impl/GroupsImpl.java index d5da30b87e..17df838d34 100644 --- a/source/java/org/alfresco/rest/api/impl/GroupsImpl.java +++ b/source/java/org/alfresco/rest/api/impl/GroupsImpl.java @@ -114,7 +114,7 @@ public class GroupsImpl implements Groups public Group create(Group group, Parameters parameters) { - validateGroup(group); + validateGroup(group, false); // Create authority with default zones. final Set authorityZones = authorityService.getDefaultZones(); @@ -136,6 +136,16 @@ public class GroupsImpl implements Groups return getGroup(authority, parameters); } + public Group update(String groupId, Group group, Parameters parameters) + { + validateGroupId(groupId); + validateGroup(group, true); + + authorityService.setAuthorityDisplayName(groupId, group.getDisplayName()); + + return getGroup(groupId, parameters); + } + public Group getGroup(String groupId, Parameters parameters) throws EntityNotFoundException { AuthorityInfo authorityInfo = getAuthorityInfo(groupId); @@ -649,21 +659,46 @@ public class GroupsImpl implements Groups } } - private void validateGroup(Group group) + private void validateGroup(Group group, boolean isUpdate) { if (group == null) { throw new InvalidArgumentException("group is null"); } - if (group.getId() == null || group.getId().isEmpty()) + if (!isUpdate) { - throw new InvalidArgumentException("groupId is null or empty"); - } + if (group.getId() == null || group.getId().isEmpty()) + { + throw new InvalidArgumentException("groupId is null or empty"); + } - if (groupAuthorityExists(group.getId())) + if (groupAuthorityExists(group.getId())) + { + throw new ConstraintViolatedException("Group '" + group.getId() + "' already exists."); + } + } + else { - throw new ConstraintViolatedException("Group '" + group.getId() + "' already exists."); + if (group.wasSet(Group.ID)) + { + throw new InvalidArgumentException("Group update does not support field: id"); + } + + if (group.wasSet(Group.IS_ROOT)) + { + throw new InvalidArgumentException("Group update does not support field: isRoot"); + } + + if (group.wasSet(Group.PARENT_IDS)) + { + throw new InvalidArgumentException("Group update does not support field: parentIds"); + } + + if (group.wasSet(Group.ZONES)) + { + throw new InvalidArgumentException("Group update does not support field: zones"); + } } } diff --git a/source/java/org/alfresco/rest/api/model/Group.java b/source/java/org/alfresco/rest/api/model/Group.java index 320002d5f8..6ef826229c 100644 --- a/source/java/org/alfresco/rest/api/model/Group.java +++ b/source/java/org/alfresco/rest/api/model/Group.java @@ -25,6 +25,8 @@ */ package org.alfresco.rest.api.model; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import org.alfresco.rest.framework.resource.UniqueId; @@ -44,6 +46,14 @@ public class Group implements Comparable protected Set parentIds; protected Set zones; + private Map setFields = new HashMap<>(7); + + public static final String ID = "id"; + public static final String DISPLAY_NAME = "displayName"; + public static final String IS_ROOT = "isRoot"; + public static final String PARENT_IDS = "parentIds"; + public static final String ZONES = "zones"; + public Group() { } @@ -57,6 +67,7 @@ public class Group implements Comparable public void setId(String id) { this.id = id; + setFields.put(ID, true); } public String getDisplayName() @@ -67,6 +78,7 @@ public class Group implements Comparable public void setDisplayName(String displayName) { this.displayName = displayName; + setFields.put(DISPLAY_NAME, true); } public Boolean getIsRoot() @@ -77,6 +89,7 @@ public class Group implements Comparable public void setIsRoot(Boolean isRoot) { this.isRoot = isRoot; + setFields.put(IS_ROOT, true); } public Set getParentIds() @@ -87,6 +100,7 @@ public class Group implements Comparable public void setParentIds(Set parentIds) { this.parentIds = parentIds; + setFields.put(PARENT_IDS, true); } public Set getZones() @@ -97,6 +111,7 @@ public class Group implements Comparable public void setZones(Set zones) { this.zones = zones; + setFields.put(ZONES, true); } @Override @@ -141,4 +156,10 @@ public class Group implements Comparable { return "Group [id=" + id + ", displayName=" + displayName + ", isRoot=" + isRoot + "]"; } + + public boolean wasSet(String fieldName) + { + Boolean b = setFields.get(fieldName); + return (b != null ? b : false); + } } \ No newline at end of file diff --git a/source/test-java/org/alfresco/rest/api/tests/GroupsTest.java b/source/test-java/org/alfresco/rest/api/tests/GroupsTest.java index 90db4c9850..ec373f4da9 100644 --- a/source/test-java/org/alfresco/rest/api/tests/GroupsTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/GroupsTest.java @@ -892,6 +892,73 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest } } + @Test + public void testUpdateGroup() throws Exception + { + final Groups groupsProxy = publicApiClient.groups(); + + Map otherParams = new HashMap<>(); + otherParams.put("include", org.alfresco.rest.api.Groups.PARAM_INCLUDE_PARENT_IDS); + + setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD); + + Group group = groupsProxy.createGroup(generateGroup(), null, HttpServletResponse.SC_CREATED); + + Set subGroupParents = new HashSet<>(); + subGroupParents.add(group.getId()); + + Group generatedSubGroup = generateGroup(); + generatedSubGroup.setParentIds(subGroupParents); + + Group subGroup = groupsProxy.createGroup(generatedSubGroup, otherParams, HttpServletResponse.SC_CREATED); + + // User without admin rights can't update a group. + { + setRequestContext(user1); + groupsProxy.updateGroup(group.getId(), new Group(), null, HttpServletResponse.SC_FORBIDDEN); + } + + // Invalid auth. + { + setRequestContext(networkOne.getId(), GUID.generate(), "password"); + groupsProxy.updateGroup(group.getId(), new Group(), null, HttpServletResponse.SC_UNAUTHORIZED); + } + + // Update group and subgroup. + { + setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD); + + + String displayName = "newDisplayName"; + + Group mySubGroup = new Group(); + mySubGroup.setDisplayName(displayName); + + Group updateGroup = groupsProxy.updateGroup(subGroup.getId(), mySubGroup, otherParams, HttpServletResponse.SC_OK); + + // Validate default response and additional information (parentIds). + assertNotNull(updateGroup); + assertNotNull(updateGroup.getId()); + assertFalse(updateGroup.getIsRoot()); + assertNotNull(updateGroup.getParentIds()); + + // Check that only display name changed. + assertEquals(displayName, updateGroup.getDisplayName()); + + // Check that nothing else changed. + assertEquals(subGroup.getId(), updateGroup.getId()); + assertEquals(subGroup.getIsRoot(), updateGroup.getIsRoot()); + assertEquals(subGroup.getParentIds(), updateGroup.getParentIds()); + } + + // Group id doesn't exist. + { + setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD); + + groupsProxy.updateGroup("invalidId", group, null, HttpServletResponse.SC_NOT_FOUND); + } + } + 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 e208bffdc7..e9e1bb5cc8 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 @@ -2289,6 +2289,12 @@ public class PublicApiClient return parseGroupEntity(response); } + public Group updateGroup(String groupId, Group group, Map params, int expectedStatus) throws PublicApiException + { + HttpResponse response = update("groups", groupId, null, null, group.toJSON().toString(), params, "Failed to update group " + group.getId(), expectedStatus); + return parseGroupEntity(response); + } + public Group getGroup(String groupId) throws PublicApiException { return getGroup(groupId, HttpServletResponse.SC_OK); diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/Group.java b/source/test-java/org/alfresco/rest/api/tests/client/data/Group.java index ba062ebba4..f8109d4f75 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/Group.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/Group.java @@ -66,9 +66,17 @@ public class Group extends org.alfresco.rest.api.model.Group implements Serializ public JSONObject toJSON() { JSONObject groupJson = new JSONObject(); - groupJson.put("id", getId()); + if (getId() != null) + { + groupJson.put("id", getId()); + } + groupJson.put("displayName", getDisplayName()); - groupJson.put("isRoot", getIsRoot()); + + if (getIsRoot() != null) + { + groupJson.put("isRoot", getIsRoot()); + } if (getParentIds() != null) {