mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-25 09:23:28 +01:00
* Addressbook/REST API: allow to pass filters or a search pattern to addressbook REST API
This commit is contained in:
parent
40d236b95f
commit
b0490bc7d8
@ -55,7 +55,7 @@ class addressbook_groupdav extends Api\CalDAV\Handler
|
|||||||
* G = primary group
|
* G = primary group
|
||||||
* D = distribution lists as groups
|
* D = distribution lists as groups
|
||||||
* O = sync all in one (/<username>/addressbook/)
|
* O = sync all in one (/<username>/addressbook/)
|
||||||
* or nummerical account_id, but not user itself
|
* or numerical account_id, but not user itself
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
@ -269,7 +269,9 @@ class addressbook_groupdav extends Api\CalDAV\Handler
|
|||||||
if (!in_array(self::$path_attr,$cols)) $cols[] = self::$path_attr;
|
if (!in_array(self::$path_attr,$cols)) $cols[] = self::$path_attr;
|
||||||
// we need tid for sync-collection report
|
// we need tid for sync-collection report
|
||||||
if (array_key_exists('tid', $filter) && !isset($filter['tid']) && !in_array('tid', $cols)) $cols[] = 'tid';
|
if (array_key_exists('tid', $filter) && !isset($filter['tid']) && !in_array('tid', $cols)) $cols[] = 'tid';
|
||||||
for($chunk=0; ($contacts =& $this->bo->search([], $cols, $order, '', '', False, 'AND',
|
$search = $filter['search'] ?? [];
|
||||||
|
unset($filter['search']);
|
||||||
|
for($chunk=0; ($contacts =& $this->bo->search($search, $cols, $order, '', '', False, 'AND',
|
||||||
[$chunk*self::CHUNK_SIZE, self::CHUNK_SIZE], $filter)); ++$chunk)
|
[$chunk*self::CHUNK_SIZE, self::CHUNK_SIZE], $filter)); ++$chunk)
|
||||||
{
|
{
|
||||||
// filter[tid] === null also returns no longer shared contacts, to remove them from devices, we need to mark them here as deleted
|
// filter[tid] === null also returns no longer shared contacts, to remove them from devices, we need to mark them here as deleted
|
||||||
@ -449,14 +451,19 @@ class addressbook_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,&$filters,$id, &$nresults)
|
function _report_filters($options, &$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']; // using += to no allow overwriting existing filters
|
||||||
|
}
|
||||||
|
elseif (!empty($options['filters']))
|
||||||
{
|
{
|
||||||
/* Example of a complex filter used by Mac Addressbook
|
/* Example of a complex filter used by Mac Addressbook
|
||||||
<B:filter test="anyof">
|
<B:filter test="anyof">
|
||||||
|
@ -1174,10 +1174,10 @@ class CalDAV extends HTTP_WebDAV_Server
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: client want data filtered
|
// client want data filtered
|
||||||
if (isset($_GET['filters']))
|
if (isset($_GET['filters']))
|
||||||
{
|
{
|
||||||
|
$propfind_options['filters'] = $_GET['filters'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// properties to NOT get the default address-data for addressbook-collections and "all" for the rest
|
// properties to NOT get the default address-data for addressbook-collections and "all" for the rest
|
||||||
|
@ -72,13 +72,19 @@ curl https://example.org/egroupware/groupdav.php/<username>/addressbook/ -H "Acc
|
|||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
following GET parameters are supported to customize the returned properties:
|
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 addressbook collections is to only return address-data (JsContact), other collections return all props.
|
Default for addressbook collections is to only return address-data (JsContact), 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 an addressbook:
|
||||||
|
- `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 JSContact property-names!
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Example: Getting just ETAGs and displayname of all contacts in a given AB</summary>
|
<summary>Example: Getting just ETAGs and displayname of all contacts in a given AB</summary>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user