REPO-3630/MNT-19696: REST API add order by parameter option to GET favorites (#161)

- add orderBy parameter to sort favourite nodes (use existing sort options - by type, username, createdAt, title (name)). Default (old) sorting is used if no orderBy parameter is given
- multiple parameters can be used
- added positive and negative tests
This commit is contained in:
Andrei Forascu
2019-02-28 10:04:39 +02:00
committed by GitHub
parent 4d456a4509
commit 0198bfde68
3 changed files with 114 additions and 4 deletions

View File

@@ -35,7 +35,7 @@
<dir.root>${project.build.directory}/alf_data</dir.root> <dir.root>${project.build.directory}/alf_data</dir.root>
<img.exe>convert</img.exe> <img.exe>convert</img.exe>
<dependency.alfresco-repository.version>7.50</dependency.alfresco-repository.version> <dependency.alfresco-repository.version>7.51</dependency.alfresco-repository.version>
<dependency.alfresco-core.version>7.9</dependency.alfresco-core.version> <dependency.alfresco-core.version>7.9</dependency.alfresco-core.version>
<dependency.alfresco-data-model.version>8.27</dependency.alfresco-data-model.version> <dependency.alfresco-data-model.version>8.27</dependency.alfresco-data-model.version>
<dependency.alfresco-pdf-renderer.version>1.1</dependency.alfresco-pdf-renderer.version> <dependency.alfresco-pdf-renderer.version>1.1</dependency.alfresco-pdf-renderer.version>

View File

@@ -26,6 +26,7 @@
package org.alfresco.rest.api.impl; package org.alfresco.rest.api.impl;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -57,9 +58,11 @@ import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Paging;
import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rest.framework.resource.parameters.Parameters;
import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.rest.framework.resource.parameters.Params;
import org.alfresco.rest.framework.resource.parameters.SortColumn;
import org.alfresco.rest.framework.resource.parameters.where.QueryHelper; import org.alfresco.rest.framework.resource.parameters.where.QueryHelper;
import org.alfresco.rest.framework.resource.parameters.where.QueryHelper.WalkerCallbackAdapter; import org.alfresco.rest.framework.resource.parameters.where.QueryHelper.WalkerCallbackAdapter;
import org.alfresco.service.cmr.favourites.FavouritesService; import org.alfresco.service.cmr.favourites.FavouritesService;
import org.alfresco.service.cmr.favourites.FavouritesService.SortFields;
import org.alfresco.service.cmr.favourites.FavouritesService.Type; import org.alfresco.service.cmr.favourites.FavouritesService.Type;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.StoreRef;
@@ -307,7 +310,9 @@ public class FavouritesImpl implements Favourites
personId = people.validatePerson(personId, true); personId = people.validatePerson(personId, true);
Paging paging = parameters.getPaging(); Paging paging = parameters.getPaging();
List<Pair<FavouritesService.SortFields, Boolean>> sortProps = getSortProps(parameters);
final Set<Type> filteredByClientQuery = new HashSet<Type>(); final Set<Type> filteredByClientQuery = new HashSet<Type>();
Set<Type> filterTypes = FavouritesService.Type.ALL_FILTER_TYPES; //Default all Set<Type> filterTypes = FavouritesService.Type.ALL_FILTER_TYPES; //Default all
@@ -345,8 +350,8 @@ public class FavouritesImpl implements Favourites
filterTypes = filteredByClientQuery; filterTypes = filteredByClientQuery;
} }
final PagingResults<PersonFavourite> favourites = favouritesService.getPagedFavourites(personId, filterTypes, FavouritesService.DEFAULT_SORT_PROPS, final PagingResults<PersonFavourite> favourites = favouritesService.getPagedFavourites(personId, filterTypes, sortProps, Util.getPagingRequest(paging));
Util.getPagingRequest(paging));
return wrap(paging, favourites, parameters); return wrap(paging, favourites, parameters);
} }
@@ -370,4 +375,32 @@ public class FavouritesImpl implements Favourites
Parameters parameters = Params.valueOf(recognizedParams, personId, favouriteId, null); Parameters parameters = Params.valueOf(recognizedParams, personId, favouriteId, null);
return parameters; return parameters;
} }
private List<Pair<FavouritesService.SortFields, Boolean>> getSortProps(Parameters parameters)
{
List<Pair<FavouritesService.SortFields, Boolean>> sortProps = new ArrayList<>();
List<SortColumn> sortCols = parameters.getSorting();
if ((sortCols != null) && (sortCols.size() > 0))
{
for (SortColumn sortCol : sortCols)
{
SortFields sortField;
try
{
sortField = SortFields.valueOf(sortCol.column);
}
catch (Exception e)
{
throw new InvalidArgumentException("Invalid sort field: " + sortCol.column);
}
sortProps.add(new Pair<>(sortField, (sortCol.asc ? Boolean.TRUE : Boolean.FALSE)));
}
}
else
{
// default sort order
sortProps = FavouritesService.DEFAULT_SORT_PROPS;
}
return sortProps;
}
} }

View File

@@ -115,6 +115,8 @@ public class TestFavourites extends AbstractBaseApiTest
private String person12Id; private String person12Id;
private TestPerson person14; private TestPerson person14;
private String person14Id; private String person14Id;
private TestPerson person15;
private String person15Id;
private TestNetwork network2; private TestNetwork network2;
private TestPerson person21; private TestPerson person21;
@@ -176,6 +178,11 @@ public class TestFavourites extends AbstractBaseApiTest
TestFavourites.this.person14 = network1.createUser(personInfo); TestFavourites.this.person14 = network1.createUser(personInfo);
assertNotNull(TestFavourites.this.person14); assertNotNull(TestFavourites.this.person14);
TestFavourites.this.person14Id = TestFavourites.this.person14.getId(); TestFavourites.this.person14Id = TestFavourites.this.person14.getId();
name = GUID.generate();
personInfo = new PersonInfo(name, name, name, "password", null, null, null, null, null, null, null);
TestFavourites.this.person15 = network1.createUser(personInfo);
assertNotNull(TestFavourites.this.person15);
TestFavourites.this.person15Id = TestFavourites.this.person15.getId();
TestFavourites.this.network2 = networksIt.next(); TestFavourites.this.network2 = networksIt.next();
name = GUID.generate(); name = GUID.generate();
@@ -949,6 +956,22 @@ public class TestFavourites extends AbstractBaseApiTest
assertEquals(HttpStatus.SC_METHOD_NOT_ALLOWED, e.getHttpResponse().getStatusCode()); assertEquals(HttpStatus.SC_METHOD_NOT_ALLOWED, e.getHttpResponse().getStatusCode());
} }
} }
// invalid orderBy param
{
publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id));
try
{
Map<String, String> params = new HashMap<>();
params.put("orderBy", "invalid ASC");
favouritesProxy.getFavourites(person10Id, createParams(null, params));
}
catch(PublicApiException e)
{
assertEquals(HttpStatus.SC_BAD_REQUEST, e.getHttpResponse().getStatusCode());
}
}
} }
@Test @Test
@@ -1912,6 +1935,60 @@ public class TestFavourites extends AbstractBaseApiTest
assertTrue(node1.getIsFavorite()); assertTrue(node1.getIsFavorite());
} }
/**
* Test sort favourites using 'orderBy' parameter.
*
* <p>GET:</p>
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/people/<userName>/favorites?orderBy}
*/
@Test
public void testSortFavourites() throws Exception
{
setRequestContext(network1.getId(), person15Id, "password");
final NodeRef folderNodeRef1 = person1PublicFolders.get(0); // person1's folder (Test Folder1)
final NodeRef folderNodeRef2 = person1PublicFolders.get(1); // person1's folder (Test Folder2)
final NodeRef folderNodeRef3 = person1PublicFolders.get(2); // person1's folder (Test Folder3)
final NodeRef nodeRef1= person1PublicDocs.get(0); // a file (Test Doc1)
final NodeRef nodeRef2 = person1PublicDocs.get(1); // a file (Test Doc2)
// Favourite the docs and folders
Favourite folder1Favourite = makeFolderFavourite(folderNodeRef1.getId());
favouritesProxy.createFavourite(person15Id, folder1Favourite);
Favourite folder2Favourite = makeFolderFavourite(folderNodeRef2.getId());
favouritesProxy.createFavourite(person15Id, folder2Favourite);
Favourite folder3Favourite = makeFolderFavourite(folderNodeRef3.getId());
favouritesProxy.createFavourite(person15Id, folder3Favourite);
Favourite file1Favourite = makeFileFavourite(nodeRef1.getId());
favouritesProxy.createFavourite(person15Id, file1Favourite);
Favourite file2Favourite = makeFileFavourite(nodeRef2.getId());
favouritesProxy.createFavourite(person15Id, file2Favourite);
// Order by title ASC
Map<String, String> params = new HashMap<>();
params.put("orderBy", "title ASC");
List<Favourite> favourites = favouritesProxy.getFavourites(person15Id, createParams(null,params)).getList();
assertTrue(favourites.size() == 5);
assertTrue(favourites.get(0).getTargetGuid().equals(nodeRef1.getId()));
assertTrue(favourites.get(1).getTargetGuid().equals(nodeRef2.getId()));
assertTrue(favourites.get(2).getTargetGuid().equals(folderNodeRef1.getId()));
assertTrue(favourites.get(3).getTargetGuid().equals(folderNodeRef2.getId()));
assertTrue(favourites.get(4).getTargetGuid().equals(folderNodeRef3.getId()));
// Order by type ASC, title DESC
params = new HashMap<>();
params.put("orderBy", "type DESC, title DESC");
favourites = favouritesProxy.getFavourites(person15Id, createParams(null,params)).getList();
assertTrue(favourites.size() == 5);
assertTrue(favourites.get(0).getTargetGuid().equals(folderNodeRef3.getId()));
assertTrue(favourites.get(1).getTargetGuid().equals(folderNodeRef2.getId()));
assertTrue(favourites.get(2).getTargetGuid().equals(folderNodeRef1.getId()));
assertTrue(favourites.get(3).getTargetGuid().equals(nodeRef2.getId()));
assertTrue(favourites.get(4).getTargetGuid().equals(nodeRef1.getId()));
}
private void assertPathInfo(PathInfo expectedPathInfo, String expectedPathName, boolean expectedIsComplete) private void assertPathInfo(PathInfo expectedPathInfo, String expectedPathName, boolean expectedIsComplete)
{ {
assertNotNull("Path info was requested.", expectedPathInfo); assertNotNull("Path info was requested.", expectedPathInfo);