CRM-19816 - Standardize contact_id field in activity api
authorColeman Watts <coleman@civicrm.org>
Wed, 15 Feb 2017 17:05:14 +0000 (12:05 -0500)
committerColeman Watts <coleman@civicrm.org>
Wed, 15 Feb 2017 21:39:17 +0000 (16:39 -0500)
api/v3/Activity.php
api/v3/utils.php

index 20284c2bb29825783f111def950fc3c782052191..495154744c17d0f5b606dcf5b2100db876cb8d7c 100644 (file)
@@ -230,7 +230,6 @@ function _civicrm_api3_activity_create_spec(&$params) {
  */
 function _civicrm_api3_activity_get_spec(&$params) {
   $params['tag_id'] = array(
-    'name' => 'tag_id',
     'title' => 'Tags',
     'description' => 'Find activities with specified tags.',
     'type' => 1,
@@ -238,15 +237,20 @@ function _civicrm_api3_activity_get_spec(&$params) {
     'FKApiName' => 'Tag',
   );
   $params['case_id'] = array(
-    'name' => 'case_id',
     'title' => 'Cases',
     'description' => 'Find activities within specified cases.',
     'type' => 1,
     'FKClassName' => 'CRM_Case_DAO_Case',
     'FKApiName' => 'Case',
   );
+  $params['contact_id'] = array(
+    'title' => 'Activity Contact ID',
+    'description' => 'Find activities involving this contact (as target, source, OR assignee).',
+    'type' => 1,
+    'FKClassName' => 'CRM_Contact_DAO_Contact',
+    'FKApiName' => 'Contact',
+  );
   $params['target_contact_id'] = array(
-    'name' => 'target_contact_id',
     'title' => 'Target Contact ID',
     'description' => 'Find activities with specified target contact.',
     'type' => 1,
@@ -254,7 +258,6 @@ function _civicrm_api3_activity_get_spec(&$params) {
     'FKApiName' => 'Contact',
   );
   $params['source_contact_id'] = array(
-    'name' => 'source_contact_id',
     'title' => 'Source Contact ID',
     'description' => 'Find activities with specified source contact.',
     'type' => 1,
@@ -262,7 +265,6 @@ function _civicrm_api3_activity_get_spec(&$params) {
     'FKApiName' => 'Contact',
   );
   $params['assignee_contact_id'] = array(
-    'name' => 'assignee_contact_id',
     'title' => 'Assignee Contact ID',
     'description' => 'Find activities with specified assignee contact.',
     'type' => 1,
@@ -304,55 +306,52 @@ function civicrm_api3_activity_get($params) {
     }
   }
 
-  if (!empty($params['contact_id'])) {
-    $activities = CRM_Activity_BAO_Activity::getContactActivity($params['contact_id']);
-    // BAO function doesn't actually return a contact ID - hack api for now & add to test so when api re-write
-    // happens it won't get missed.
-    foreach ($activities as $key => $activityArray) {
-      $activities[$key]['id'] = $key;
+  $sql = CRM_Utils_SQL_Select::fragment();
+  // Support search by activity_contact
+  $extraFieldSpecs = array();
+  _civicrm_api3_activity_create_spec($extraFieldSpecs);
+  $options = civicrm_api3('ActivityContact', 'getoptions', array('field' => 'record_type_id'));
+  $options = $options['values'];
+  $activityContactOptions = array(
+    'contact_id' => NULL,
+    'target_contact_id' => array_search('Activity Targets', $options),
+    'source_contact_id' => array_search('Activity Source', $options),
+    'assignee_contact_id' => array_search('Activity Assignees', $options),
+  );
+  foreach ($activityContactOptions as $activityContactName => $activityContactValue) {
+    if (!empty($params[$activityContactName])) {
+      _civicrm_api3_validate_integer($params, $activityContactName, $extraFieldSpecs[$activityContactName], 'Activity');
+      if (!is_array($params[$activityContactName])) {
+        $params[$activityContactName] = array('=' => $params[$activityContactName]);
+      }
+      $clause = \CRM_Core_DAO::createSQLFilter('contact_id', $params[$activityContactName]);
+      $typeClause = $activityContactValue ? 'record_type_id = #typeId AND ' : '';
+      $sql->where("a.id IN (SELECT activity_id FROM civicrm_activity_contact WHERE $typeClause !clause)",
+        array('#typeId' => $activityContactValue, '!clause' => $clause)
+      );
     }
   }
-  else {
-    $sql = CRM_Utils_SQL_Select::fragment();
-    // Support search by activity_contact
-    $options = civicrm_api3('ActivityContact', 'getoptions', array('field' => 'record_type_id'));
-    $options = $options['values'];
-    $activityContactOptions = array(
-      'target_contact_id' => array_search('Activity Targets', $options),
-      'source_contact_id' => array_search('Activity Source', $options),
-      'assignee_contact_id' => array_search('Activity Assignees', $options),
-    );
-    foreach ($activityContactOptions as $activityContactName => $activityContactValue) {
-      if (!empty($params[$activityContactName])) {
-        if (!is_array($params[$activityContactName])) {
-          $params[$activityContactName] = array('=' => $params[$activityContactName]);
-        }
-        $clause = \CRM_Core_DAO::createSQLFilter('contact_id', $params[$activityContactName]);
-        $sql->where('a.id IN (SELECT activity_id FROM civicrm_activity_contact WHERE record_type_id = #typeId AND !clause)',
-          array('#typeId' => $activityContactValue, '!clause' => $clause)
-        );
-      }
+  if (!empty($params['tag_id'])) {
+    _civicrm_api3_validate_integer($params, 'tag_id', $extraFieldSpecs['tag_id'], 'Activity');
+    if (!is_array($params['tag_id'])) {
+      $params['tag_id'] = array('=' => $params['tag_id']);
     }
-    if (!empty($params['tag_id'])) {
-      if (!is_array($params['tag_id'])) {
-        $params['tag_id'] = array('=' => $params['tag_id']);
-      }
-      $clause = \CRM_Core_DAO::createSQLFilter('tag_id', $params['tag_id']);
-      if ($clause) {
-        $sql->where('a.id IN (SELECT entity_id FROM civicrm_entity_tag WHERE entity_table = "civicrm_activity" AND !clause)', array('!clause' => $clause));
-      }
+    $clause = \CRM_Core_DAO::createSQLFilter('tag_id', $params['tag_id']);
+    if ($clause) {
+      $sql->where('a.id IN (SELECT entity_id FROM civicrm_entity_tag WHERE entity_table = "civicrm_activity" AND !clause)', array('!clause' => $clause));
     }
-    if (!empty($params['case_id'])) {
-      if (!is_array($params['case_id'])) {
-        $params['case_id'] = array('=' => $params['case_id']);
-      }
-      $clause = \CRM_Core_DAO::createSQLFilter('case_id', $params['case_id']);
-      if ($clause) {
-        $sql->where('a.id IN (SELECT activity_id FROM civicrm_case_activity WHERE !clause)', array('!clause' => $clause));
-      }
+  }
+  if (!empty($params['case_id'])) {
+    _civicrm_api3_validate_integer($params, 'case_id', $extraFieldSpecs['case_id'], 'Activity');
+    if (!is_array($params['case_id'])) {
+      $params['case_id'] = array('=' => $params['case_id']);
+    }
+    $clause = \CRM_Core_DAO::createSQLFilter('case_id', $params['case_id']);
+    if ($clause) {
+      $sql->where('a.id IN (SELECT activity_id FROM civicrm_case_activity WHERE !clause)', array('!clause' => $clause));
     }
-    $activities = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Activity', $sql);
   }
+  $activities = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Activity', $sql);
   $options = _civicrm_api3_get_options_from_params($params, FALSE, 'Activity', 'get');
   if ($options['is_count']) {
     return civicrm_api3_create_success($activities, $params, 'Activity', 'get');
@@ -437,6 +436,21 @@ function _civicrm_api3_activity_get_formatResult($params, $activities) {
         }
     }
   }
+
+  // Legacy ouput
+  if (!empty($params['contact_id'])) {
+    $statusOptions = CRM_Activity_BAO_Activity::buildOptions('status_id', 'get');
+    $typeOptions = CRM_Activity_BAO_Activity::buildOptions('activity_type_id', 'validate');
+    foreach ($activities as $key => &$activityArray) {
+      if (!empty($activityArray['status_id'])) {
+        $activityArray['status'] = $statusOptions[$activityArray['status_id']];
+      }
+      if (!empty($activityArray['activity_type_id'])) {
+        $activityArray['activity_name'] = $typeOptions[$activityArray['activity_type_id']];
+      }
+    }
+  }
+
   if (!empty($activities) && (!empty($returnProperties) || !empty($params['contact_id']))) {
     foreach ($activities as $activityId => $values) {
       //@todo - should possibly load activity type id if not loaded (update with id)
index 741ab966cdcadd51aa2af73b691e71a47ed83a30..c232e0412e65537ab40e5ecdd9f49bba7236644b 100644 (file)
@@ -2062,7 +2062,7 @@ function _civicrm_api3_swap_out_aliases(&$apiRequest, $fields) {
  *
  * @throws API_Exception
  */
-function _civicrm_api3_validate_integer(&$params, &$fieldName, &$fieldInfo, $entity) {
+function _civicrm_api3_validate_integer(&$params, $fieldName, &$fieldInfo, $entity) {
   list($fieldValue, $op) = _civicrm_api3_field_value_check($params, $fieldName);
   if (strpos($op, 'NULL') !== FALSE || strpos($op, 'EMPTY') !== FALSE) {
     return;