From 5044f0fe85139dc1d4bc316e501db13387cda7f0 Mon Sep 17 00:00:00 2001
From: eileen <emcnaughton@wikimedia.org>
Date: Tue, 30 Jan 2018 12:18:38 +1300
Subject: [PATCH] CRM-21140 extend support for custom data to Mailing.

(this requires clean up of handling of ).
---
 CRM/Mailing/BAO/Mailing.php                   | 19 ++++++++++++-------
 api/v3/Mailing.php                            |  2 +-
 .../phpunit/api/v3/SyntaxConformanceTest.php  |  1 +
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/CRM/Mailing/BAO/Mailing.php b/CRM/Mailing/BAO/Mailing.php
index 26659f55912c..02d50acc4e9a 100644
--- a/CRM/Mailing/BAO/Mailing.php
+++ b/CRM/Mailing/BAO/Mailing.php
@@ -1409,7 +1409,11 @@ public function &getGroupNames() {
    * @return CRM_Mailing_DAO_Mailing
    */
   public static function add(&$params, $ids = array()) {
-    $id = CRM_Utils_Array::value('mailing_id', $ids, CRM_Utils_Array::value('id', $params));
+    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('mailing_id', $ids));
+
+    if (empty($params['id']) && !empty($ids)) {
+      \Civi::log('Parameter $ids is no longer used by Mailing::add. Use the api or just pass $params', ['civi.tag' => 'deprecated']);
+    }
 
     if ($id) {
       CRM_Utils_Hook::pre('edit', 'Mailing', $id, $params);
@@ -1443,7 +1447,7 @@ public static function add(&$params, $ids = array()) {
       $result->modified_date = $mailing->modified_date;
     }
 
-    if (!empty($ids['mailing'])) {
+    if ($id) {
       CRM_Utils_Hook::post('edit', 'Mailing', $mailing->id, $mailing);
     }
     else {
@@ -1482,15 +1486,16 @@ public static function add(&$params, $ids = array()) {
    * @throws \Exception
    */
   public static function create(&$params, $ids = array()) {
-    // WTH $ids
-    if (empty($ids) && isset($params['id'])) {
-      $ids['mailing_id'] = $ids['id'] = $params['id'];
+
+    if (empty($params['id']) && (array_filter($ids) !== [])) {
+      $params['id'] = isset($ids['mailing_id']) ? $ids['mailing_id'] : $ids['id'];
+      \Civi::log('Parameter $ids is no longer used by Mailing::create. Use the api or just pass $params', ['civi.tag' => 'deprecated']);
     }
 
     // CRM-12430
     // Do the below only for an insert
     // for an update, we should not set the defaults
-    if (!isset($ids['id']) && !isset($ids['mailing_id'])) {
+    if (!isset($params['id'])) {
       // Retrieve domain email and name for default sender
       $domain = civicrm_api(
         'Domain',
@@ -1559,7 +1564,7 @@ public static function create(&$params, $ids = array()) {
 
     $transaction = new CRM_Core_Transaction();
 
-    $mailing = self::add($params, $ids);
+    $mailing = self::add($params);
 
     if (is_a($mailing, 'CRM_Core_Error')) {
       $transaction->rollback();
diff --git a/api/v3/Mailing.php b/api/v3/Mailing.php
index 22aba4bfda39..32c3fe1a33b6 100644
--- a/api/v3/Mailing.php
+++ b/api/v3/Mailing.php
@@ -77,7 +77,7 @@ function civicrm_api3_mailing_create($params) {
 
   // FlexMailer is a refactoring of CiviMail which provides new hooks/APIs/docs. If the sysadmin has opted to enable it, then use that instead of CiviMail.
   $safeParams['_evil_bao_validator_'] = \CRM_Utils_Constant::value('CIVICRM_FLEXMAILER_HACK_SENDABLE', 'CRM_Mailing_BAO_Mailing::checkSendable');
-  $result = _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $safeParams);
+  $result = _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $safeParams, 'Mailing');
   return _civicrm_api3_mailing_get_formatResult($result);
 }
 
diff --git a/tests/phpunit/api/v3/SyntaxConformanceTest.php b/tests/phpunit/api/v3/SyntaxConformanceTest.php
index efb57a26d56f..8322260cbdb6 100644
--- a/tests/phpunit/api/v3/SyntaxConformanceTest.php
+++ b/tests/phpunit/api/v3/SyntaxConformanceTest.php
@@ -271,6 +271,7 @@ public static function custom_data_incl_non_std_entities_get() {
     $customDataEntities[] = ['UFGroup'];
     $customDataEntities[] = ['PriceSet'];
     $customDataEntities[] = ['PaymentToken'];
+    $customDataEntities[] = ['Mailing'];
     return $customDataEntities;
   }