Added owner filter in lsiting and deleteAll

This commit is contained in:
Luca Frosini 2021-12-03 11:25:32 +01:00
parent e8e29532fa
commit abc354ee1b
3 changed files with 211 additions and 27 deletions

View File

@ -331,7 +331,7 @@ public class CKANPackage extends CKAN implements Moderated {
} }
} }
protected Map<String,String> getListCountParameters(int limit, int offset) { protected Map<String,String> getListingParameters(int limit, int offset) {
Map<String,String> parameters = new HashMap<>(); Map<String,String> parameters = new HashMap<>();
if(limit <= 0) { if(limit <= 0) {
// According to CKAN documentation // According to CKAN documentation
@ -346,21 +346,72 @@ public class CKANPackage extends CKAN implements Moderated {
} }
parameters.put(START_KEY, String.valueOf(offset * limit)); parameters.put(START_KEY, String.valueOf(offset * limit));
if(uriInfo != null) { MultivaluedMap<String,String> queryParameters = uriInfo.getQueryParameters();
MultivaluedMap<String,String> queryParameters = uriInfo.getQueryParameters(); parameters = checkListParameters(queryParameters, parameters);
parameters = checkListParameters(queryParameters, parameters);
}
if(!parameters.containsKey(GCatConstants.Q_KEY)) {
String filter = getFilterForOrganizations();
parameters.put(GCatConstants.Q_KEY, filter);
}
parameters = addModerationStatusFilter(parameters); parameters = addModerationStatusFilter(parameters);
return parameters; return parameters;
} }
/**
* @param purge indicate if the item
* @return the name list of deleted items
*/
public String deleteAll(boolean purge){
MultivaluedMap<String,String> queryParameters = uriInfo.getQueryParameters();
if(queryParameters.containsKey(GCatConstants.OWN_ONLY_QUERY_PARAMETER)) {
if(ckanUser.getRole() != Role.ADMIN) {
queryParameters.remove(GCatConstants.OWN_ONLY_QUERY_PARAMETER);
queryParameters.add(GCatConstants.OWN_ONLY_QUERY_PARAMETER, Boolean.TRUE.toString());
}
}else {
queryParameters.add(GCatConstants.OWN_ONLY_QUERY_PARAMETER, Boolean.TRUE.toString());
}
Map<String,String> parameters = getListingParameters(0,0);
ObjectNode objectNode = mapper.createObjectNode();
ArrayNode deleted = mapper.createArrayNode();
objectNode.set("deleted", deleted);
ArrayNode notDeleted = mapper.createArrayNode();
objectNode.set("failed", notDeleted);
sendGetRequest(LIST, parameters);
ArrayNode results = (ArrayNode) result.get(RESULTS_KEY);
while(results.size()>0) {
for(JsonNode node : results) {
try {
this.name = null;
this.result = node;
this.name = node.get(NAME_KEY).asText();
this.itemID = node.get(ID_KEY).asText();
delete(purge);
deleted.add(name);
} catch(Exception e) {
try {
if(name!=null) {
notDeleted.add(name);
logger.error("Error while trying to delete item with name {}", name);
}else {
logger.error("Unable to get the name of {}.",mapper.writeValueAsString(node));
}
} catch(Exception ex) {
logger.error("", ex);
}
}
}
sendGetRequest(LIST, parameters);
results = (ArrayNode) result.get(RESULTS_KEY);
}
return getAsString(objectNode);
}
public String list(Map<String,String> parameters) { public String list(Map<String,String> parameters) {
sendGetRequest(LIST, parameters); sendGetRequest(LIST, parameters);
@ -373,7 +424,7 @@ public class CKANPackage extends CKAN implements Moderated {
arrayNode.add(name); arrayNode.add(name);
} catch(Exception e) { } catch(Exception e) {
try { try {
logger.error("Unable to get the ID of {}. the result will not be included in the result", logger.error("Unable to get the name of {}. The Item will not be included in the result",
mapper.writeValueAsString(node)); mapper.writeValueAsString(node));
} catch(Exception ex) { } catch(Exception ex) {
logger.error("", ex); logger.error("", ex);
@ -386,12 +437,12 @@ public class CKANPackage extends CKAN implements Moderated {
@Override @Override
public String list(int limit, int offset) { public String list(int limit, int offset) {
Map<String,String> parameters = getListCountParameters(limit, offset); Map<String,String> parameters = getListingParameters(limit, offset);
return list(parameters); return list(parameters);
} }
public int count() { public int count() {
Map<String,String> parameters = getListCountParameters(1, 0); Map<String,String> parameters = getListingParameters(1, 0);
sendGetRequest(LIST, parameters); sendGetRequest(LIST, parameters);
@ -410,7 +461,7 @@ public class CKANPackage extends CKAN implements Moderated {
return matches; return matches;
} }
protected static String[] allowedListQueryParameters = new String[] {"q", "fq", "fq_list", "sort", protected static String[] allowedListQueryParameters = new String[] {"fq", "fq_list", "sort",
/* "facet", "facet.mincount", "facet.limit", "facet.field", */ /* "facet", "facet.mincount", "facet.limit", "facet.field", */
"include_drafts", "include_private", "ext_bbox"}; "include_drafts", "include_private", "ext_bbox"};
@ -443,7 +494,7 @@ public class CKANPackage extends CKAN implements Moderated {
if(organizations.size()==0) { if(organizations.size()==0) {
// Adding organization filter to q // Adding organization filter to q
String filter = getFilterForOrganizations(); String filter = getFilterForOrganizations();
parameters.put(GCatConstants.Q_KEY, String.format("%s AND %s", q, filter)); q = String.format("%s AND %s", q, filter);
}else { }else {
organizations.removeAll(this.supportedOrganizations); organizations.removeAll(this.supportedOrganizations);
if(organizations.size()>0) { if(organizations.size()>0) {
@ -454,9 +505,17 @@ public class CKANPackage extends CKAN implements Moderated {
} else { } else {
String filter = getFilterForOrganizations(); String filter = getFilterForOrganizations();
parameters.put(GCatConstants.Q_KEY, filter); q = filter;
} }
if(queryParameters.containsKey(GCatConstants.OWN_ONLY_QUERY_PARAMETER)) {
if(!queryParameters.get(GCatConstants.OWN_ONLY_QUERY_PARAMETER).isEmpty() && Boolean.parseBoolean(queryParameters.get(GCatConstants.OWN_ONLY_QUERY_PARAMETER).get(0))) {
String filter = String.format("%s:%s", AUTHOR_EMAIL_KEY, ckanUser.getPortalUser().getEMail());
q = String.format("%s AND %s", q, filter);
}
}
parameters.put(GCatConstants.Q_KEY, q);
for(String key : allowedListQueryParameters) { for(String key : allowedListQueryParameters) {
if(queryParameters.containsKey(key)) { if(queryParameters.containsKey(key)) {
@ -587,9 +646,13 @@ public class CKANPackage extends CKAN implements Moderated {
} }
protected void readItem() throws Exception { protected void readItem() throws Exception {
String ret = super.read(); if(this.result == null) {
result = mapper.readTree(ret); String ret = super.read();
this.itemID = result.get(ID_KEY).asText(); this.result = mapper.readTree(ret);
}
if(this.itemID == null) {
this.itemID = result.get(ID_KEY).asText();
}
} }

View File

@ -68,6 +68,22 @@ public class Item extends REST<CKANPackage> implements org.gcube.gcat.api.interf
} }
} }
@DELETE
@Produces(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8)
public String deleteAll(@QueryParam(GCatConstants.PURGE_QUERY_PARAMETER) @DefaultValue("false") Boolean purge) {
CKANPackage ckan = getInstance();
return ckan.deleteAll(purge);
}
@PURGE
@Produces(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8)
public String purgeAll() {
CKANPackage ckan = getInstance();
return ckan.deleteAll(true);
}
/* /*
* Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface
*/ */

View File

@ -174,6 +174,108 @@ public class CKANPackageTest extends ContextTest {
logger.debug("List:\n{}", mapper.writeValueAsString(gotList)); logger.debug("List:\n{}", mapper.writeValueAsString(gotList));
} }
protected UriInfo getListingUriInfo(final MultivaluedMap<String, String> queryParameters) {
UriInfo uriInfo = new UriInfo() {
@Override
public URI resolve(URI uri) {
return null;
}
@Override
public URI relativize(URI uri) {
return null;
}
@Override
public UriBuilder getRequestUriBuilder() {
return null;
}
@Override
public URI getRequestUri() {
return null;
}
@Override
public MultivaluedMap<String, String> getQueryParameters(boolean decode) {
return null;
}
@Override
public MultivaluedMap<String, String> getQueryParameters() {
return queryParameters;
}
@Override
public List<PathSegment> getPathSegments(boolean decode) {
return null;
}
@Override
public List<PathSegment> getPathSegments() {
return null;
}
@Override
public MultivaluedMap<String, String> getPathParameters(boolean decode) {
return null;
}
@Override
public MultivaluedMap<String, String> getPathParameters() {
return null;
}
@Override
public String getPath(boolean decode) {
return null;
}
@Override
public String getPath() {
return null;
}
@Override
public List<String> getMatchedURIs(boolean decode) {
return null;
}
@Override
public List<String> getMatchedURIs() {
return null;
}
@Override
public List<Object> getMatchedResources() {
return null;
}
@Override
public UriBuilder getBaseUriBuilder() {
return null;
}
@Override
public URI getBaseUri() {
return null;
}
@Override
public UriBuilder getAbsolutePathBuilder() {
return null;
}
@Override
public URI getAbsolutePath() {
return null;
}
};
return uriInfo;
}
@Test @Test
public void listWithParameters() throws Exception { public void listWithParameters() throws Exception {
String contextName = "/gcube/devNext/NextNext"; String contextName = "/gcube/devNext/NextNext";
@ -183,15 +285,13 @@ public class CKANPackageTest extends ContextTest {
CKANPackage ckanPackage = new CKANPackage(); CKANPackage ckanPackage = new CKANPackage();
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
Map<String,String> parameters = new HashMap<>();
parameters.put(CKANPackage.ROWS_KEY, String.valueOf(10));
parameters.put(CKANPackage.START_KEY, String.valueOf(0));
boolean[] values = new boolean[]{true, false}; boolean[] values = new boolean[]{true, false};
for(boolean includeValidOrganization : values) { for(boolean includeValidOrganization : values) {
for(boolean includeFakeOrganization : values) { for(boolean includeFakeOrganization : values) {
MultivaluedMap<String,String> queryParameters = new MultivaluedHashMap<>(); MultivaluedMap<String,String> queryParameters = new MultivaluedHashMap<>();
StringWriter stringWriter = new StringWriter(); StringWriter stringWriter = new StringWriter();
boolean addOr = false; boolean addOr = false;
@ -213,16 +313,21 @@ public class CKANPackageTest extends ContextTest {
queryParameters.add(GCatConstants.Q_KEY, filter); queryParameters.add(GCatConstants.Q_KEY, filter);
} }
queryParameters.add(GCatConstants.OWN_ONLY_QUERY_PARAMETER, Boolean.TRUE.toString());
/* /*
parameters.put("fl","[\"name\"]"); queryParameters.add("fl","[\"name\"]");
*/ */
/* /*
parameters.put("facet.field","[\"name\"]"); queryParameters.add("facet.field","[\"name\"]");
parameters.put("sort","name asc"); queryParameters.add("sort","name asc");
*/ */
Map<String,String> parameters = null;
try { try {
parameters = ckanPackage.checkListParameters(queryParameters, parameters); ckanPackage.setUriInfo(getListingUriInfo(queryParameters));
parameters = ckanPackage.getListingParameters(10, 0);
}catch (ForbiddenException e) { }catch (ForbiddenException e) {
if(includeFakeOrganization) { if(includeFakeOrganization) {
// This is the expected behaviour // This is the expected behaviour