Improving documentation

This commit is contained in:
Luca Frosini 2022-09-16 16:21:36 +02:00
parent 3455159ecc
commit a5aee6353e
2 changed files with 143 additions and 82 deletions

View File

@ -1,9 +1,3 @@
.. Social Service Client documentation master file, created by
sphinx-quickstart on Tue Aug 2 16:11:12 2022.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to gCat documentation! Welcome to gCat documentation!
================================================= =================================================
@ -70,8 +64,8 @@ To be RESTful compliant, gCat uses standard HTTP Methods to perform a listing of
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Operation | HTTP Method | URL | Success HTTP Status | Safe | Idempotent | | Operation | HTTP Method | URL | Success HTTP Status | Safe | Idempotent |
+==============+=============+========================================+=====================+========+============+ +==============+=============+========================================+=====================+========+============+
| Supported | OPTIONS | /{COLLECTION} | 204 No Content | Y | Y | | Supported | OPTIONS | /{COLLECTION} | 204 No Content | Y | Y |
| HTTP Methods | | | | | | | HTTP Methods | | | [#allow]_ | | |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| List | GET | /{COLLECTION} | 200 OK | Y | Y | | List | GET | /{COLLECTION} | 200 OK | Y | Y |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
@ -81,8 +75,8 @@ To be RESTful compliant, gCat uses standard HTTP Methods to perform a listing of
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Create | POST | /{COLLECTION} | 201 Created | N | N | | Create | POST | /{COLLECTION} | 201 Created | N | N |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Supported | OPTIONS | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | Y | Y | | Supported | OPTIONS | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | Y | Y |
| HTTP Methods | | | | | | | HTTP Methods | | | [#allow]_ | | |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Exist | HEAD | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | Y | Y | | Exist | HEAD | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | Y | Y |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
@ -92,33 +86,37 @@ To be RESTful compliant, gCat uses standard HTTP Methods to perform a listing of
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Patch | PATCH | /{COLLECTION}/{INSTANCE_ID} | 200 OK | N | Y | | Patch | PATCH | /{COLLECTION}/{INSTANCE_ID} | 200 OK | N | Y |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Delete | DELETE | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | N | N ‡‡ | | Delete | DELETE | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | N | N [#del]_ |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
| Purge | DELETE | /{COLLECTION}/{INSTANCE_ID}?purge=true | 204 No Content | N | N ‡‡ | | Purge | DELETE | /{COLLECTION}/{INSTANCE_ID}?purge=true | 204 No Content | N | N [#del]_ |
+ +-------------+----------------------------------------+---------------------+--------+------------+ + +-------------+----------------------------------------+---------------------+--------+------------+
| | PURGE | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | N | N ‡‡ | | | PURGE | /{COLLECTION}/{INSTANCE_ID} | 204 No Content | N | N [#del]_ |
+--------------+-------------+----------------------------------------+---------------------+--------+------------+ +--------------+-------------+----------------------------------------+---------------------+--------+------------+
.. [#allow] Supported HTTP Methods in **Allow** HTTP Header
‡ Supported HTTP Methods in **Allow** HTTP Header .. [#del] DELETE has been defined as idempotent.
*Allamaraju* [#Allamaraju]_ argues that DELETE idempotency should be accomplished client-side.
The server should inform the client if a delete succeeded because the resource was really deleted or it was not found i.e., **404 Not Found** error is suggested instead of **204 No Content**.
The latter situation should be treated as idempotent by the client.
We share the same vision. For this reason, gCat does not provide server-side idempotency for DELETE and PURGE operations.
‡‡ DELETE has been defined as idempotent. .. [#Allamaraju] Allamaraju S. RESTful Web Services Cookbook: Solutions for Improving Scalability and Simplicity . OReilly. first ed. 2010
*Allamaraju* argues that DELETE idempotency should be accomplished client-side.
The server should inform the client if a delete succeeded because the resource was really deleted or it was not found i.e., *404 Not Found* error is suggested instead of *204 No Content*.
The latter situation should be treated as idempotent by the client.
We share the same vision.
For this reason, gCat does not provide server-side idempotency for DELETE and PURGE operations.
:Allamaraju: Allamaraju S. RESTful Web Services Cookbook: Solutions for Improving Scalability and Simplicity . OReilly. first ed. 2010
About URL: About URL
'''''''''
* {COLLECTION} is the plural name of the entity type; The presented URL uses the following convention:
* {INSTANCE_ID} is an identification which enables to univocally identify the instance in the collection.
About Safety and Idempotency properties: * **{COLLECTION}** is the plural name of the entity type;
* **{INSTANCE_ID}** is an identification which enables to univocally identify the instance in the collection.
About Safety and Idempotency properties
'''''''''
* A method is *Safe* if it does not produce any side effects. * A method is *Safe* if it does not produce any side effects.
"This does not prevent an implementation from including behaviour that is potentially harmful, that is not entirely read-only, or that causes side effects while invoking a safe method" "This does not prevent an implementation from including behaviour that is potentially harmful, that is not entirely read-only, or that causes side effects while invoking a safe method"
@ -131,12 +129,14 @@ You can find more information about HTTP Methods at `<https://restfulapi.net/htt
Uncommon HTTP Methods: Uncommon HTTP Methods:
'''''''''
* PATCH method allows to perform a differential update (i.e. an update which provide only the differences and not the whole new representation); * PATCH method allows to perform a differential update (i.e. an update which provide only the differences and not the whole new representation);
* PURGE method is not a standard but is a widely used in service which requires this action * PURGE method is not a standard but is a widely used in service which requires this action
(e.g. `Varnish <https://varnish-cache.org/docs/3.0/tutorial/purging.html>`_, `Squid <https://wiki.squid-cache.org/SquidFaq/OperatingSquid#How_can_I_purge_an_object_from_my_cache.3F>`_). (e.g. `Varnish <https://varnish-cache.org/docs/3.0/tutorial/purging.html>`_, `Squid <https://wiki.squid-cache.org/SquidFaq/OperatingSquid#How_can_I_purge_an_object_from_my_cache.3F>`_).
gCat provide support for this method but to support a wider range of clients it also provides the Purge action via *DELETE* with the additional get parameter ``purge=true`` gCat provide support for this method but to support a wider range of clients it also provides the Purge action via *DELETE* with the additional get parameter ``purge=true``
Content Type Content Type
------------------ ------------------
@ -158,25 +158,28 @@ Actually, the service accepts and returns only JSON objects.
Except for a `Profile Collection <../api-docs/resource\_Profile.html>`_ which must be manipulated in in XML. Except for a `Profile Collection <../api-docs/resource\_Profile.html>`_ which must be manipulated in in XML.
Collections Collections
------------------ ------------------
The following collections are available to any users. Non-safe methods can only be invoked by Catalogue Editor The following collections are available to any users. Non-safe methods can only be invoked by Catalogue-Editor or above.
* Item Collection; * `Item Collection <../api-docs/resource_Item.html>`_;
* Resource Collection; * `Resource Collection <../api-docs/resource_Resource.html>`_;
* Profile Collection; * `Profile Collection <../api-docs/resource_Profile.html>`_;
* Namespace Collection; * `Namespace Collection <../api-docs/resource_Namespace.html>`_;
* License Collection; * `License Collection <../api-docs/resource_License.html>`_;
The following collections are available only for Catalogue Admin: The following collections are available only for Catalogue-Admins or above:
* Group Collection; * `Group Collection <../api-docs/resource_Group.html>`_;
* Organization Collection; * `Organization Collection <../api-docs/resource_Organization.html>`_;
* User Collection; * `User Collection <../api-docs/resource_User.html>`_;
* Configuration Collection. * `Configuration Collection <../api-docs/resource_Configuration.html>`_.
An overwiew of the available collections is available at `<../api-docs/index.html>`_;
Roles Roles
@ -195,7 +198,7 @@ Another role that is not in the role hierarchy:
.. TIP:: .. TIP::
Please note that not all catalogues are moderated. Please note that not all catalogs are moderated.
Java Client Java Client
================== ==================

View File

@ -11,6 +11,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status;
@ -46,24 +47,25 @@ public class Item extends REST<CKANPackage> implements org.gcube.gcat.api.interf
* <p> * <p>
* The listing API provides paginated results by using the query parameters limit and offset.<br/> * The listing API provides paginated results by using the query parameters limit and offset.<br/>
* It returns an array list of string containing the ids (i.e. names) of the items.<br/> * It returns an array list of string containing the ids (i.e. names) of the items.<br/>
* Each name can be used as <code>{ITEM_ID_PARAMETER}</code> path parameter to manage such item. * Each name can be used as <code>{ITEM_ID}</code> path parameter to manage such item.
* </p> * </p>
* *
* <h4>Filtering options</h4> * <h3>Filtering options</h3>
* <p> * <p>
* The listing method offers options to filter the results, thus enacting to search for items including spatial search (see ext_bbox below).<br/> * The listing method offers options to filter the results, thus enacting to search for items including spatial search (see ext_bbox below).<br/>
* </p> * </p>
*
* <h4>Basic Filtering options</h4>
* <dl> * <dl>
* <dt>include_private (bool)</dt> * <dt>include_private (bool)</dt>
* <dd> * <dd>
* <em>Optional</em>.<em>Default:false</em>.<br/> * <em>Optional</em>.<em>Default:false</em>.<br/>
* If True, private datasets will be included in the results.<br/> * If True, private datasets will be included in the results.<br/>
* Only private datasets from the users organizations will be returned. For the sysadmins will be returned all private datasets. * Only private datasets from the users organizations will be returned. For the sysadmins will be returned all private datasets.<br/>
* Optional, the default is False.<br/>
* E.g. <code>/items?include_private=true</code> * E.g. <code>/items?include_private=true</code>
* </dd> * </dd>
* *
* <dt>ext_bbox</dt> * <dt style="margin-top: 5px;">ext_bbox</dt>
* <dd> * <dd>
* <em>Optional</em>.<em>Default:null</em>.<br/> * <em>Optional</em>.<em>Default:null</em>.<br/>
* The coordinates of the upper-right and bottom-left angle of a rectangular to query for. * The coordinates of the upper-right and bottom-left angle of a rectangular to query for.
@ -72,34 +74,15 @@ public class Item extends REST<CKANPackage> implements org.gcube.gcat.api.interf
* returns the first 10 items with 'Pollution' having a spatial coverage in the specified bounding box. * returns the first 10 items with 'Pollution' having a spatial coverage in the specified bounding box.
* </dd> * </dd>
* *
* <dt>own_only (bool)</dt> * <dt style="margin-top: 5px;">own_only (bool)</dt>
* <dd> * <dd>
* <em>Optional</em>.<em>Default:false</em>.<br/> * <em>Optional</em>.<em>Default:false</em>.<br/>
* If True, only the items of the requester user will be included in the result.<br/> * If True, only the items of the requester user will be included in the result.<br/>
* E.g. <code>/items?limit=10&offset=0&own_only=true> * E.g. <code>/items?limit=10&offset=0&own_only=true</code>
* </dd>
*
* <dt>all_fields</dt>
* <dd>
* <em>Optional</em>.<em>Default:false</em>.
* If True, the returned array list contains the whole item representation and not only the id (i.e. the name).
* E.g. <code>/items?limit=10&offset=0&all_fields=true</code>
* </dd> * </dd>
* </dl> * </dl>
* *
* <h4>Moderated Catalog filtering options</h4> * <h4>Filtering options based on Solr query parameters</h4>
* <dl>
* <dt>status (enum)</dt>
* <dd>
* <em>Optional</em>.<em>Default:null</em>.<br/>
* It has sense only for moderated catalogs.
* It can assume the following values: <code>pending</code>; <code>rejected</code>; <code>approved</code>.
* If null return both approved items and items which have been published before the activation of the moderation.
* </dd>
* </dl>
* </p>
*
* <h4>Solr based Filtering options</h4>
* <p> * <p>
* It accepts the following query parameters (a subset of Solr search query parameters, see Solr Query Syntax): * It accepts the following query parameters (a subset of Solr search query parameters, see Solr Query Syntax):
* </p> * </p>
@ -112,21 +95,21 @@ public class Item extends REST<CKANPackage> implements org.gcube.gcat.api.interf
* E.g. <code>/items?q=extras_systemtype:MyProfile</code> returns the items having the profile <em>MyProfile</em> * E.g. <code>/items?q=extras_systemtype:MyProfile</code> returns the items having the profile <em>MyProfile</em>
* </dd> * </dd>
* *
* <dt>fq (string)</dt> * <dt style="margin-top: 5px;">fq (string)</dt>
* <dd> * <dd>
* <em>Optional</em>.<em>Default:null</em>.<br/> * <em>Optional</em>.<em>Default:null</em>.<br/>
* Filter query. A query string that limits the query results without influencing their scores.<br/> * Filter query. A query string that limits the query results without influencing their scores.<br/>
* E.g. <code>/items?q=title:foo&fq=notes:bar</code> returns with word "foo" in the 'title' and the word "bar" in the 'notes'. * E.g. <code>/items?q=title:foo&fq=notes:bar</code> returns with word "foo" in the 'title' and the word "bar" in the 'notes'.
* </dd> * </dd>
* *
* <dt>fq_list (list of strings)</dt> * <dt style="margin-top: 5px;">fq_list (list of strings)</dt>
* <dd> * <dd>
* <em>Optional</em>.<em>Default:null</em>.<br/> * <em>Optional</em>.<em>Default:null</em>.<br/>
* Additional filter queries to apply.<br/> * Additional filter queries to apply.<br/>
* E.g. <code>/items?q=title:foo&fq_list=...</code> returns the items with word "foo" in the 'title'. * E.g. <code>/items?q=title:foo&fq_list=...</code> returns the items with word "foo" in the 'title'.
* </dd> * </dd>
* *
* <dt>sort (string)</dt> * <dt style="margin-top: 5px;">sort (string)</dt>
* <dd> * <dd>
* <em>Optional</em>.<em>Default:"relevance asc, metadata_modified desc"</em>.<br/> * <em>Optional</em>.<em>Default:"relevance asc, metadata_modified desc"</em>.<br/>
* Sorting of the search results.<br/> * Sorting of the search results.<br/>
@ -136,27 +119,109 @@ public class Item extends REST<CKANPackage> implements org.gcube.gcat.api.interf
* </dd> * </dd>
* <dl> * <dl>
* *
* <h4>Moderated Catalog filtering options</h4>
* <dl>
* <dt>status (enum)</dt>
* <dd>
* <em>Optional</em>.<em>Default:null</em>.<br/>
*
* <span style="font-weight:bold;">It has sense only for moderated catalogs</span>.<br/>
* When no value is provided, it returns both the items which have been published before the activation of the moderation,
* as weel as the items explicitly <code>approved</code> after the moderation activation.
*
* It can assume the following values:
* <ul>
* <li><code>pending</code>: it returns only the pending items, i.e. the item published by any allowed users and still not moderated;</li>
* <li><code>rejected</code>: it returns only the rejected items, i.e. the item published by any allowed users and rejected by a moderator;</li>
* <li><code>approved</code>: it returns only the approved items, i.e. the item published by any allowed users and approved by a moderated.</li>
* </ul>
*
* <p>
* Please note that only Catalogue-Moderators can filter items by status.<br />
* Other users using this query parameter will get only its own items with such a status in the results.
* </p>
* </dd>
* </dl>
*
*
* <h3>Query results options</h3>
* <p>
* The result is by default an array list of string containing the ids (i.e. names) of the items.
* Anyway, there are two options to get a different results.
* </p>
* <dl>
* <dt>count (bool)</dt>
* <dd>
* <em>Optional</em>.<em>Default:false</em>.<br/>
* If True, it indicates that the result must contains only the total number of items of the query.<br/>
* E.g. <code>/items?limit=10&offset=0&count=true</code>
* </dd>
*
* <dt style="margin-top: 5px;">all_fields (bool)</dt>
* <dd>
* <em>Optional</em>.<em>Default:false</em>.
* If True, the returned array list contains the whole item representation and not only the id (i.e. the name).</br/>
* E.g. <code>/items?limit=10&offset=0&all_fields=true</code>
* </dd>
* </dl>
* <p>
* Please note that, <code>count</code> query parameter has priority over <code>all_fields</code> query parameter.
* In other words, <code>all_fields</code> query parameter is not considered is <code>count</code> query parameter is true.
* </p>
*
* *
* @param limit To get unlimited results the limit query parameters must be set to -1. * @param limit To get unlimited results the limit query parameters must be set to -1.
* If the results are too much the operation could fail. * If the results are too much the operation could fail.
* It is recommended to request no more than 1000 results. * It is recommended to request no more than 1000 results.
* @param offset The offset parameter indicates the starting position of the result. * @param offset The offset parameter indicates the starting position of the result.
* @param count It indicate that the result must contains only the total number of items of the query.
* @return It returns an array list of string containing the ids (i.e. names) of the items. * @return It returns an array list of string containing the ids (i.e. names) of the items.
* E.g.<pre>["item0","items1",...,"item10"]</pre> * E.g.<pre>["item0","items1",...,"item10"]</pre>
* *
* In the case the query parameter <code>count=true</code> it returns the total number of items of the query. * In the case the query parameter <code>count=true</code> it returns the total number of items of the query.
* E.g. <pre>{"count":148}</pre> * E.g. <pre>{"count":148}</pre>
*
* In the case the query parameter <code>all_fields=true</code> each element of the resulting array contains the item representation:
* E.g.
* <pre>
* [
* {
* "name"="item0",
* ...,
* "private": false,
* "license_url": "http://www.opensource.org/licenses/AFL-3.0"
* },
* {
* "name"="item1",
* ...,
* "private": true,
* "license_url": "http://www.opensource.org/licenses/AFL-3.0"
* },
* ...,
* {
* "name"="itemN",
* ...,
* "private": false,
* "license_url": "http://www.opensource.org/licenses/AFL-3.0"
* }
*
* ]</pre>
*/ */
@GET @GET
@Produces(GCatConstants.APPLICATION_JSON_CHARSET_UTF_8) @Produces(GCatConstants.APPLICATION_JSON_CHARSET_UTF_8)
/* Catalogue-Member is not added to VRE members and is assumed as the default role in the catalogue for the VRE members. So we can't enforce /* Catalogue-Member is not added to VRE members and is assumed as the default role in the catalogue for the VRE members. So we can't enforce
* @AuthorizationControl(allowedRoles={Role.CATALOGUE_MEMBER, Role.CATALOGUE_EDITOR, Role.CATALOGUE_ADMIN, Role.CATALOGUE_MANAGER}, exception=NotAuthorizedException.class) * @AuthorizationControl(allowedRoles={Role.CATALOGUE_MEMBER, Role.CATALOGUE_EDITOR, Role.CATALOGUE_ADMIN, Role.CATALOGUE_MANAGER}, exception=NotAuthorizedException.class)
*/ */
@Override
public String list(@QueryParam(GCatConstants.LIMIT_QUERY_PARAMETER) @DefaultValue("10") int limit, public String list(@QueryParam(GCatConstants.LIMIT_QUERY_PARAMETER) @DefaultValue("10") int limit,
@QueryParam(GCatConstants.OFFSET_QUERY_PARAMETER) @DefaultValue("0") int offset, @QueryParam(GCatConstants.OFFSET_QUERY_PARAMETER) @DefaultValue("0") int offset) {
@QueryParam(GCatConstants.COUNT_QUERY_PARAMETER) @DefaultValue("false") Boolean count) {
if(count) { Boolean countOnly = false;
MultivaluedMap<String,String> queryParameters = uriInfo.getQueryParameters();
if(queryParameters.containsKey(GCatConstants.COUNT_QUERY_PARAMETER)) {
countOnly = Boolean.parseBoolean(queryParameters.get(GCatConstants.ALL_FIELDS_QUERY_PARAMETER).get(0));
}
if(countOnly) {
CKANPackage ckan = getInstance(); CKANPackage ckan = getInstance();
int size = ckan.count(); int size = ckan.count();
return createCountJson(size); return createCountJson(size);
@ -165,14 +230,7 @@ public class Item extends REST<CKANPackage> implements org.gcube.gcat.api.interf
} }
} }
/*
* Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface
*/
@Override
public String list(@QueryParam(GCatConstants.LIMIT_QUERY_PARAMETER) @DefaultValue("10") int limit,
@QueryParam(GCatConstants.OFFSET_QUERY_PARAMETER) @DefaultValue("0") int offset) {
return super.list(limit, offset);
}
@POST @POST
@Consumes(GCatConstants.APPLICATION_JSON_CHARSET_UTF_8) @Consumes(GCatConstants.APPLICATION_JSON_CHARSET_UTF_8)