Add and document filters for InfoLog REST API

This commit is contained in:
ralf 2024-05-15 19:21:22 +02:00
parent 4312300b63
commit 4c8f88f3a0
2 changed files with 21 additions and 10 deletions

View File

@ -113,13 +113,19 @@ curl https://example.org/egroupware/groupdav.php/<username>/infolog/ -H "Accept:
``` ```
</details> </details>
following GET parameters are supported to customize the returned properties: The following GET parameters are supported to customize the returned properties:
- props[]=<DAV-prop-name> eg. props[]=getetag to return only the ETAG (multiple DAV properties can be specified) - props[]=<DAV-prop-name> eg. props[]=getetag to return only the ETAG (multiple DAV properties can be specified)
Default for calendar collections is to only return calendar-data (JsEvent), other collections return all props. Default for calendar collections is to only return calendar-data (JsEvent), other collections return all props.
- sync-token=<token> to only request change since last sync-token, like rfc6578 sync-collection REPORT - sync-token=<token> to only request change since last sync-token, like rfc6578 sync-collection REPORT
- nresults=N limit number of responses (only for sync-collection / given sync-token parameter!) - nresults=N limit number of responses (only for sync-collection / given sync-token parameter!)
this will return a "more-results"=true attribute and a new "sync-token" attribute to query for the next chunk this will return a "more-results"=true attribute and a new "sync-token" attribute to query for the next chunk
The GET parameter `filters` allows to filter or search for a pattern in InfoLog entries:
- `filters[search]=<pattern>` searches for `<pattern>` in the whole contact like the search in the GUI
- `filters[search][%23<custom-field-name>]=<custom-field-value>` filters by a custom-field value
- `filters[<database-column>]=<value>` filters by a DB-column name and value
> Please note: filters use the database column-names, not JSTask property-names!
Examples: see addressbook Examples: see addressbook

View File

@ -388,14 +388,19 @@ class infolog_groupdav extends Api\CalDAV\Handler
* Process the filters from the CalDAV REPORT request * Process the filters from the CalDAV REPORT request
* *
* @param array $options * @param array $options
* @param array &$cal_filters * @param array &$filters
* @param string $id * @param string $id
* @param int &$nresult on return limit for number or results or unchanged/null * @param int &$nresult on return limit for number or results or unchanged/null
* @return boolean true if filter could be processed * @return boolean true if filter could be processed
*/ */
function _report_filters($options,&$cal_filters,$id, &$nresults) function _report_filters(array $options, array &$filters, $id, &$nresults)
{ {
if ($options['filters']) // in case of JSON/REST API pass filters to report
if (Api\CalDAV::isJSON() && !empty($options['filters']) && is_array($options['filters']))
{
$filters = $options['filters'] + $filters; // + to allow overwriting default owner filter (BO ensures ACL!)
}
elseif ($options['filters'])
{ {
foreach($options['filters'] as $filter) foreach($options['filters'] as $filter)
{ {
@ -425,7 +430,7 @@ class infolog_groupdav extends Api\CalDAV\Handler
} }
else else
{ {
$cal_filters[$this->filter_prop2infolog[strtoupper($prop_filter)]] = $filter['data']; $filters[$this->filter_prop2infolog[strtoupper($prop_filter)]] = $filter['data'];
} }
unset($prop_filter); unset($prop_filter);
break; break;
@ -433,7 +438,7 @@ class infolog_groupdav extends Api\CalDAV\Handler
if ($this->debug) error_log(__METHOD__."($options[path],...) param-filter='{$filter['attrs']['name']}' not (yet) implemented!"); if ($this->debug) error_log(__METHOD__."($options[path],...) param-filter='{$filter['attrs']['name']}' not (yet) implemented!");
break; break;
case 'time-range': case 'time-range':
$cal_filters[] = $this->_time_range_filter($filter['attrs']); $filters[] = $this->_time_range_filter($filter['attrs']);
break; break;
default: default:
if ($this->debug) error_log(__METHOD__."($options[path],".array2string($options).",...) unknown filter --> ignored"); if ($this->debug) error_log(__METHOD__."($options[path],".array2string($options).",...) unknown filter --> ignored");
@ -465,8 +470,8 @@ class infolog_groupdav extends Api\CalDAV\Handler
{ {
$parts = explode('/', $option['data']); $parts = explode('/', $option['data']);
$sync_token = array_pop($parts); $sync_token = array_pop($parts);
$cal_filters[] = 'info_datemodified>'.(int)$sync_token; $filters[] = 'info_datemodified>'.(int)$sync_token;
$cal_filters['filter'] .= '+deleted'; // to return deleted entries too $filters['filter'] .= '+deleted'; // to return deleted entries too
} }
break; break;
case 'sync-level': case 'sync-level':
@ -486,7 +491,7 @@ class infolog_groupdav extends Api\CalDAV\Handler
{ {
if ($id) if ($id)
{ {
$cal_filters[self::$path_attr] = self::$path_extension ? $filters[self::$path_attr] = self::$path_extension ?
basename($id,self::$path_extension) : $id; basename($id,self::$path_extension) : $id;
} }
else // fetch all given url's else // fetch all given url's
@ -504,7 +509,7 @@ class infolog_groupdav extends Api\CalDAV\Handler
} }
} }
} }
$cal_filters[self::$path_attr] = $this->requested_multiget_ids; $filters[self::$path_attr] = $this->requested_multiget_ids;
} }
if ($this->debug > 1) error_log(__METHOD__ ."($options[path],...,$id) calendar-multiget: ids=".implode(',', $this->requested_multiget_ids)); if ($this->debug > 1) error_log(__METHOD__ ."($options[path],...,$id) calendar-multiget: ids=".implode(',', $this->requested_multiget_ids));
} }