APIv4 - merge ActionUtil with Request::create
authorColeman Watts <coleman@civicrm.org>
Wed, 12 Feb 2020 16:24:13 +0000 (11:24 -0500)
committerColeman Watts <coleman@civicrm.org>
Wed, 12 Feb 2020 16:24:13 +0000 (11:24 -0500)
The Request::create function was broken for v4, and ActionUtil had been serving the same purpose but in a non-broken way.

Civi/API/Request.php
Civi/Api4/Action/GetActions.php
Civi/Api4/Generic/AbstractAction.php
Civi/Api4/Generic/BasicGetFieldsAction.php
Civi/Api4/Generic/BasicReplaceAction.php
Civi/Api4/Generic/BasicSaveAction.php
Civi/Api4/Generic/DAOGetFieldsAction.php
Civi/Api4/Utils/ActionUtil.php [deleted file]
api/api.php

index 11c32ffc5e0adfc2bd810826535653a5b354b51a..ccc970c117ca1b9653465e93b9bd590ce5a99187 100644 (file)
@@ -27,46 +27,42 @@ class Request {
    * @param array $params
    *   API parameters.
    *
-   * @throws \API_Exception
-   * @return array
-   *   the request descriptor; keys:
-   *   - version: int
-   *   - entity: string
-   *   - action: string
-   *   - params: array (string $key => mixed $value) [deprecated in v4]
-   *   - fields: NULL|array (string $key => array $fieldSpec)
-   *   - options: \CRM_Utils_OptionBag derived from params [v4-only]
-   *   - data: \CRM_Utils_OptionBag derived from params [v4-only]
-   *   - chains: unspecified derived from params [v4-only]
+   * @throws \Civi\API\Exception\NotImplementedException
+   * @return \Civi\Api4\Generic\AbstractAction|array
    */
-  public static function create($entity, $action, $params) {
-    $version = \CRM_Utils_Array::value('version', $params);
-    switch ($version) {
-      default:
-        $apiRequest = [];
-        $apiRequest['id'] = self::$nextId++;
-        $apiRequest['version'] = (int) $version;
-        $apiRequest['params'] = $params;
-        $apiRequest['fields'] = NULL;
-        $apiRequest['entity'] = self::normalizeEntityName($entity);
-        $apiRequest['action'] = self::normalizeActionName($action);
-        return $apiRequest;
+  public static function create(string $entity, string $action, array $params) {
+    switch ($params['version']) {
+      case 3:
+        return [
+          'id' => self::$nextId++,
+          'version' => 3,
+          'params' => $params,
+          'fields' => NULL,
+          'entity' => self::normalizeEntityName($entity),
+          'action' => self::normalizeActionName($action),
+        ];
 
       case 4:
-        $callable = ["Civi\\Api4\\$entity", $action];
-        if (!is_callable($callable)) {
-          throw new Exception\NotImplementedException("API ($entity, $action) does not exist (join the API team and implement it!)");
+        // For custom pseudo-entities
+        if (strpos($entity, 'Custom_') === 0) {
+          $apiRequest = \Civi\Api4\CustomValue::$action(substr($entity, 7));
+        }
+        else {
+          $callable = ["\\Civi\\Api4\\$entity", $action];
+          if (!is_callable($callable)) {
+            throw new \Civi\API\Exception\NotImplementedException("API ($entity, $action) does not exist (join the API team and implement it!)");
+          }
+          $apiRequest = call_user_func($callable);
         }
-        $apiCall = call_user_func($callable);
-        $apiRequest['id'] = self::$nextId++;
-        unset($params['version']);
         foreach ($params as $name => $param) {
           $setter = 'set' . ucfirst($name);
-          $apiCall->$setter($param);
+          $apiRequest->$setter($param);
         }
-        return $apiCall;
-    }
+        return $apiRequest;
 
+      default:
+        throw new \Civi\API\Exception\NotImplementedException("CiviCRM API version {$params['version']} not found.");
+    }
   }
 
   /**
index b16fb0a285a49835341c1741f7a11b5a00c305e1..a1d2b9413272de35726087aa09c69418add302b2 100644 (file)
@@ -23,7 +23,6 @@ namespace Civi\Api4\Action;
 
 use Civi\API\Exception\NotImplementedException;
 use Civi\Api4\Generic\BasicGetAction;
-use Civi\Api4\Utils\ActionUtil;
 use Civi\Api4\Utils\ReflectionUtils;
 
 /**
@@ -84,7 +83,7 @@ class GetActions extends BasicGetAction {
   private function loadAction($actionName, $method = NULL) {
     try {
       if (!isset($this->_actions[$actionName]) && (!$this->_actionsToGet || in_array($actionName, $this->_actionsToGet))) {
-        $action = ActionUtil::getAction($this->getEntityName(), $actionName);
+        $action = \Civi\API\Request::create($this->getEntityName(), $actionName, ['version' => 4]);
         if (is_object($action)) {
           $this->_actions[$actionName] = ['name' => $actionName];
           if ($this->_isFieldSelected('description', 'comment', 'see')) {
index 531f11aace52d3b418446174d23831854585793a..0de9856f6380333a2af2134fc87820017fa1df7b 100644 (file)
@@ -21,7 +21,6 @@
 namespace Civi\Api4\Generic;
 
 use Civi\Api4\Utils\ReflectionUtils;
-use Civi\Api4\Utils\ActionUtil;
 
 /**
  * Base class for all api actions.
@@ -424,15 +423,14 @@ abstract class AbstractAction implements \ArrayAccess {
    */
   public function entityFields() {
     if (!$this->_entityFields) {
-      $getFields = ActionUtil::getAction($this->getEntityName(), 'getFields');
+      $getFields = \Civi\API\Request::create($this->getEntityName(), 'getFields', [
+        'version' => 4,
+        'checkPermissions' => $this->checkPermissions,
+        'action' => $this->getActionName(),
+        'includeCustom' => FALSE,
+      ]);
       $result = new Result();
-      if (method_exists($this, 'getBaoName')) {
-        $getFields->setIncludeCustom(FALSE);
-      }
-      $getFields
-        ->setCheckPermissions($this->checkPermissions)
-        ->setAction($this->getActionName())
-        ->_run($result);
+      $getFields->_run($result);
       $this->_entityFields = (array) $result->indexBy('name');
     }
     return $this->_entityFields;
index ae11f65f48269ed543cda5e12f14d2630eea5c24..553d5bed2208a024fd09345482112d2cb7349be9 100644 (file)
@@ -22,7 +22,6 @@
 namespace Civi\Api4\Generic;
 
 use Civi\API\Exception\NotImplementedException;
-use Civi\Api4\Utils\ActionUtil;
 
 /**
  * Lists information about fields for the $ENTITY entity.
@@ -78,7 +77,7 @@ class BasicGetFieldsAction extends BasicGetAction {
    */
   public function _run(Result $result) {
     try {
-      $actionClass = ActionUtil::getAction($this->getEntityName(), $this->getAction());
+      $actionClass = \Civi\API\Request::create($this->getEntityName(), $this->getAction(), ['version' => 4]);
     }
     catch (NotImplementedException $e) {
     }
@@ -143,6 +142,18 @@ class BasicGetFieldsAction extends BasicGetAction {
     return $this;
   }
 
+  /**
+   * @param bool $includeCustom
+   * @return $this
+   */
+  public function setIncludeCustom(bool $includeCustom) {
+    // Be forgiving if the param doesn't exist and don't throw an exception
+    if (property_exists($this, 'includeCustom')) {
+      $this->includeCustom = $includeCustom;
+    }
+    return $this;
+  }
+
   public function fields() {
     return [
       [
index b8e20285cd258ddce9d598d84a04de46d266120e..cb06ec096e096bd14bd89f968a6512d43892e352 100644 (file)
@@ -21,8 +21,6 @@
 
 namespace Civi\Api4\Generic;
 
-use Civi\Api4\Utils\ActionUtil;
-
 /**
  * Replaces an existing set of $ENTITIES with a new one.
  *
@@ -100,7 +98,7 @@ class BasicReplaceAction extends AbstractBatchAction {
     $idField = $this->getSelect()[0];
     $toDelete = array_diff_key(array_column($items, NULL, $idField), array_flip(array_filter(\CRM_Utils_Array::collect($idField, $this->records))));
 
-    $saveAction = ActionUtil::getAction($this->getEntityName(), 'save');
+    $saveAction = \Civi\API\Request::create($this->getEntityName(), 'save', ['version' => 4]);
     $saveAction
       ->setCheckPermissions($this->getCheckPermissions())
       ->setReload($this->reload)
index b5c998af5676bfca49281bdbca698f84f6e7c691..a080fa6d82c6b98cd4e694c42429af6ab6617055 100644 (file)
@@ -22,7 +22,6 @@
 namespace Civi\Api4\Generic;
 
 use Civi\API\Exception\NotImplementedException;
-use Civi\Api4\Utils\ActionUtil;
 
 /**
  * $ACTION one or more $ENTITIES.
@@ -68,7 +67,7 @@ class BasicSaveAction extends AbstractSaveAction {
     }
     if ($this->reload) {
       /** @var BasicGetAction $get */
-      $get = ActionUtil::getAction($this->getEntityName(), 'get');
+      $get = \Civi\API\Request::create($this->getEntityName(), 'get', ['version' => 4]);
       $get
         ->setCheckPermissions($this->getCheckPermissions())
         ->addWhere($this->getIdField(), 'IN', (array) $result->column($this->getIdField()));
index 992eca6707c8aced4b25ad808bcfb52be657b92b..7d7ac1849d0a0158340d92774b231b76b4ba32c8 100644 (file)
@@ -25,7 +25,6 @@ use Civi\Api4\Service\Spec\SpecFormatter;
 
 /**
  * @inheritDoc
- * @method $this setIncludeCustom(bool $value)
  * @method bool getIncludeCustom()
  */
 class DAOGetFieldsAction extends BasicGetFieldsAction {
diff --git a/Civi/Api4/Utils/ActionUtil.php b/Civi/Api4/Utils/ActionUtil.php
deleted file mode 100644 (file)
index 614f4de..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- * $Id$
- *
- */
-
-
-namespace Civi\Api4\Utils;
-
-class ActionUtil {
-
-  /**
-   * @param $entityName
-   * @param $actionName
-   * @return \Civi\Api4\Generic\AbstractAction
-   * @throws \Civi\API\Exception\NotImplementedException
-   */
-  public static function getAction($entityName, $actionName) {
-    // For custom pseudo-entities
-    if (strpos($entityName, 'Custom_') === 0) {
-      return \Civi\Api4\CustomValue::$actionName(substr($entityName, 7));
-    }
-    else {
-      $callable = ["\\Civi\\Api4\\$entityName", $actionName];
-      if (!is_callable($callable)) {
-        throw new \Civi\API\Exception\NotImplementedException("API ($entityName, $actionName) does not exist (join the API team and implement it!)");
-      }
-      return call_user_func($callable);
-    }
-  }
-
-}
index 1a70bc3921cb83182598e84da4c5e23a4d0702b8..7f7c5167ce1aa69be637ac53917f9d734e9b5697 100644 (file)
@@ -61,7 +61,6 @@ function civicrm_api(string $entity = NULL, string $action, array $params, $extr
  * @throws \Civi\API\Exception\NotImplementedException
  */
 function civicrm_api4(string $entity, string $action, array $params = [], $index = NULL) {
-  $apiCall = \Civi\Api4\Utils\ActionUtil::getAction($entity, $action);
   $indexField = $index && is_string($index) && !CRM_Utils_Rule::integer($index) ? $index : NULL;
   $removeIndexField = FALSE;
 
@@ -70,10 +69,7 @@ function civicrm_api4(string $entity, string $action, array $params = [], $index
     $params['select'][] = $indexField;
     $removeIndexField = TRUE;
   }
-  foreach ($params as $name => $param) {
-    $setter = 'set' . ucfirst($name);
-    $apiCall->$setter($param);
-  }
+  $apiCall = \Civi\API\Request::create($entity, $action, ['version' => 4] + $params);
 
   if ($index && is_array($index)) {
     $indexCol = reset($index);