Extension.get API - Fix regression (4.7.13) in result filtering
authorTim Otten <totten@civicrm.org>
Thu, 22 Feb 2018 16:38:41 +0000 (08:38 -0800)
committerTim Otten <totten@civicrm.org>
Thu, 22 Feb 2018 20:36:24 +0000 (12:36 -0800)
commit1d470b758666648ede1c2d4cffdbeb1252ab3d18
treeeb2b50ba37049d73f93ea0dfa50648c1af70454f
parentb512c92fe8bbe9a8ef71ae9ba5adbcfe7500d81c
Extension.get API - Fix regression (4.7.13) in result filtering

Overview
--------

When one calls the `Extension.get` API, it should support filtering.  For
example, these commands would return only installed extensions or only
uninstalled extensions (respectively):

```
cv api Extension.get status=installed
cv api Extension.get status=uninstalled
```

Before
------

The implementation of `Extension.get` passes a list of all extensions down to
`_civicrm_api3_basic_array_get()` which is supposed to interpret any APIv3
options (such as filter-values/offsets/limits).  However, it confuses the
`return` list (i.e.  the names of any columns *that the user wants to see*) with the
*filterable* list (i.e.  the names of any columns *for which filtering is
permitted*).

After
-----

The implementation of `Extension.get` passes a list of all extensions down to
`_civicrm_api3_basic_array_get()`.  It also passes a fixed list of columns
which one might reasonably want to filter.

It might be nice to support filtering on all fields, but (a) several fields
wouldn't be sensible (because they're nested arrays) and (b) this provides a
smaller surface-area to maintain.

Comments
--------

The doc-block for `_civicrm_api3_basic_array_get()` describes the purpose of this field:

https://github.com/civicrm/civicrm-core/blob/4.7.0/api/v3/utils.php#L2390-L2391

Since ~v4.7.13, this line of code appears to have gone through several revisions, e.g.

 * The regression was originally introduced by 517dfba8b
 * Subsequent partial-fixes were d4c44c7009776f41734239e81525ccb68

CC @lucianov88  @twomice @tschuettler @seamuslee001 for review
api/v3/Extension.php
tests/phpunit/api/v3/ExtensionTest.php