CRM-16173 - CxnApp.get API
authorTim Otten <totten@civicrm.org>
Fri, 27 Mar 2015 07:30:25 +0000 (00:30 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 14 Jul 2015 04:00:06 +0000 (21:00 -0700)
api/v3/CxnApp.php [new file with mode: 0644]
api/v3/utils.php
tests/phpunit/api/v3/UtilsTest.php

diff --git a/api/v3/CxnApp.php b/api/v3/CxnApp.php
new file mode 100644 (file)
index 0000000..89d3a4d
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.6                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2014                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+use \Civi\Cxn\Rpc\Message\AppMetasMessage;
+use \Civi\Cxn\Rpc\Message\GarbledMessage;
+
+/**
+ * The CxnApp API provides a pseudo-entity for exploring the list
+ * of published applications. It is a read-only API which
+ * downloads and validates the application list from civicrm.org.
+ *
+ * At time of writing, this API only supports simple filtering on
+ * equality. If you'd like more advanced filters, consider updating
+ * _civicrm_api3_basic_array_get() and api_v3_UtilsTest::testBasicArrayGet.
+ *
+ * NOTE: SyntaxConformanceTest is disabled for CxnApp. As a rough
+ * equivalent, see api_v3_UtilsTest::testBasicArrayGet.
+ */
+
+/**
+ * Adjust metadata for "register" action.
+ *
+ * @param array $spec
+ *   List of fields.
+ */
+function _civicrm_api3_cxn_app_get_spec(&$spec) {
+  $spec['appCert'] = array(
+    'name' => 'appCert',
+    'type' => CRM_Utils_Type::T_TEXT,
+    'title' => ts('Certificate'),
+    'description' => 'PEM-encoded certificate',
+  );
+  $spec['appId'] = array(
+    'name' => 'appId',
+    'type' => CRM_Utils_Type::T_STRING,
+    'title' => ts('Application GUID'),
+    'description' => 'Application GUID',
+    'maxlength' => 128,
+    'size' => CRM_Utils_Type::HUGE,
+  );
+  $spec['appUrl'] = array(
+    'name' => 'appUrl',
+    'type' => CRM_Utils_Type::T_STRING,
+    'title' => ts('Registration URL'),
+    'description' => 'An endpoint to notify when performing registration',
+    'maxlength' => 255,
+    'size' => CRM_Utils_Type::HUGE,
+  );
+  $spec['desc'] = array(
+    'name' => 'desc',
+    'type' => CRM_Utils_Type::T_TEXT,
+    'title' => ts('Description'),
+    'description' => 'Description',
+  );
+  //$spec['perm'] = array(
+  //  'name' => 'perm',
+  //  'type' => CRM_Utils_Type::T_TEXT,
+  //  'title' => ts('Permissions'),
+  //  'description' => 'Permissions expected for the service (struct)',
+  //);
+}
+
+/**
+ * Get a list of applications available for connections.
+ *
+ * @param array $params
+ * @return array
+ * @throws API_Exception
+ * @throws CRM_Core_Exception
+ * @throws \Civi\Cxn\Rpc\Exception\InvalidMessageException
+ */
+function civicrm_api3_cxn_app_get($params) {
+  // FIXME: We should cache, but CRM_Utils_Cache and CRM_Core_BAO_Cache don't seem to support TTL...
+  list ($status, $blob) = CRM_Utils_HttpClient::singleton()->get(\Civi\Cxn\Rpc\Constants::OFFICIAL_APPMETAS_URL);
+  if (CRM_Utils_HttpClient::STATUS_OK != $status) {
+    throw new API_Exception("Failed to download application list.");
+  }
+  $agent = new \Civi\Cxn\Rpc\Agent(CRM_Cxn_BAO_Cxn::getCACert(), NULL, NULL);
+  $message = $agent->decode(array(AppMetasMessage::NAME, GarbledMessage::NAME), $blob);
+  if ($message instanceof AppMetasMessage) {
+    return _civicrm_api3_basic_array_get('CxnApp', $params, $message->getData(), 'appId',
+      array('appId', 'appUrl', 'desc', 'appCert', 'perm'));
+  }
+  elseif ($message instanceof GarbledMessage) {
+    return civicrm_api3_create_error('Received garbled response', array(
+      'garbled_message' => $message->getData(),
+    ));
+  }
+  else {
+    return civicrm_api3_create_error("Unrecognized message");
+  }
+}
index af337242301761db7f00f0852e16078f010dedfd..c1d78b2e99c73567405a6ae3167a38343e45af72 100644 (file)
@@ -2268,9 +2268,9 @@ function _civicrm_api3_field_value_check(&$params, $fieldName) {
 }
 
 /**
- * Like _civicrm_api3_basic_get, but data is backed by a simple array
- * instead of a DAO/BAO. This is useful for small/mid-size data loaded
- * from JSON or XML documents.
+ * A generic "get" API based on simple array data. This is comparable to
+ * _civicrm_api3_basic_get but does not use DAO/BAO. This is useful for
+ * small/mid-size data loaded from external JSON or XML documents.
  *
  * @param array $params
  *   API parameters.
@@ -2297,6 +2297,9 @@ function _civicrm_api3_basic_array_get($entity, $params, $records, $idCol, $fiel
     }
     $match = TRUE;
     foreach ($params as $k => $v) {
+      if ($k == 'id') {
+        $k = $idCol;
+      }
       if (in_array($k, $fields) && $record[$k] !== $v) {
         $match = FALSE;
         break;
index c5a90b75dae3d3d3c43d3dbf455738ef863338ce..62a642ad28083eb43c197953d81dba45cb0b49e3 100644 (file)
@@ -341,6 +341,12 @@ class api_v3_UtilsTest extends CiviUnitTestCase {
       array('b', 'c'),
     );
 
+    $cases[] = array(
+      $records,
+      array('version' => 3, 'id' => 'd'),
+      array('d'),
+    );
+
     return $cases;
   }