From 060f7ec2dc36249a7c7bf63e6fa7918a9011c112 Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Mon, 12 Apr 2021 10:29:52 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=EF=B8=8F=20improve=20exception=20hand?= =?UTF-8?q?ling=20and=20API=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/BAO/TwingleApiCall.php | 3 ++ api/v3/TwingleProject/Sync.php | 47 ++++++++++++++++------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/CRM/TwingleCampaign/BAO/TwingleApiCall.php b/CRM/TwingleCampaign/BAO/TwingleApiCall.php index cb3999d..20d8c68 100644 --- a/CRM/TwingleCampaign/BAO/TwingleApiCall.php +++ b/CRM/TwingleCampaign/BAO/TwingleApiCall.php @@ -405,6 +405,9 @@ class CRM_TwingleCampaign_BAO_TwingleApiCall { } elseif ($curl_status_code == 500) { throw new Exception('https status code 500 (internal error)'); } + if (sizeof($response) == 1 && isset($response['message'])){ + throw new Exception($response['message']); + } return $response; } diff --git a/api/v3/TwingleProject/Sync.php b/api/v3/TwingleProject/Sync.php index b55f8a3..aae2b47 100644 --- a/api/v3/TwingleProject/Sync.php +++ b/api/v3/TwingleProject/Sync.php @@ -140,7 +140,7 @@ function civicrm_api3_twingle_project_Sync(array $params): array { else { // Counter for sync errors - $errors_occurred = 0; + $errors = []; // Get all projects from Twingle $projects_from_twingle = $twingleApi->getProject(); @@ -172,7 +172,7 @@ function civicrm_api3_twingle_project_Sync(array $params): array { // push project to Twingle $result = _pushProjectToTwingle($project, $twingleApi, $params); if ($result['is_error'] != 0) { - $errors_occurred++; + $errors[$result['id']] = $result['error_message']; $returnValues[$project->getId()] = $project->getResponse($result['error_message']); } @@ -199,7 +199,7 @@ function civicrm_api3_twingle_project_Sync(array $params): array { $returnValues[$project->getId()] = $project->getResponse('TwingleProject created'); } catch (Exception $e) { - $errors_occurred++; + $errors[$result['id']] = $result['error_message']; Civi::log()->error( E::LONG_NAME . ' could not create TwingleProject: ' . @@ -245,13 +245,29 @@ function civicrm_api3_twingle_project_Sync(array $params): array { } // Return results - if ($errors_occurred > 0) { - $errorMessage = ($errors_occurred > 1) - ? "$errors_occurred synchronisation processes resulted with an error" + if (sizeof($errors) > 0) { + + $errorCount = sizeof($errors); + $errorMessage = ($errorCount > 1) + ? "$errorCount synchronisation processes resulted with an error" : "1 synchronisation process resulted with an error"; + + // Log errors + Civi::log()->error(E::LONG_NAME . ': ' . $errorMessage, $errors); + + // Return API Error + $errorMessage = $errorMessage . ': ['; + foreach ($errors as $key => $value) { + $errorMessage = + $errorMessage . + " ['project_id' => '$key', 'error_message' => '$value'],"; + } + $errorMessage = + substr($errorMessage, 0, strlen($errorMessage) - 1) . ' ]'; + return civicrm_api3_create_error( $errorMessage, - $returnValues + $errors ); } else { @@ -286,8 +302,10 @@ function _updateProjectLocally(array $project_from_twingle, // If this is a test, do not make db changes if (array_key_exists('is_test', $params) && $params['is_test']) { + $response[$project->getId()] = + $project->getResponse('TwingleProject ready to update'); return civicrm_api3_create_success( - $project->getResponse('TwingleProject ready to update'), + $response, $params, 'TwingleProject', 'Sync' @@ -295,7 +313,8 @@ function _updateProjectLocally(array $project_from_twingle, } // ... else, update local TwingleProject campaign $project->create(TRUE); - $response = $project->getResponse('TwingleProject updated successfully'); + $response[$project->getId()] = + $project->getResponse('TwingleProject updated successfully'); return civicrm_api3_create_success( $response, $params, @@ -333,8 +352,10 @@ function _pushProjectToTwingle(TwingleProject $project, // If this is a test, do not make db changes if ($params['is_test']) { + $response[$project->getId] = + $project->getResponse('TwingleProject ready to push to Twingle'); return civicrm_api3_create_success( - $project->getResponse('TwingleProject ready to push to Twingle'), + $response, $params, 'TwingleProject', 'Sync' @@ -363,7 +384,8 @@ function _pushProjectToTwingle(TwingleProject $project, try { // Create updated campaign $project->create(TRUE); - $response = $project->getResponse('TwingleProject pushed to Twingle'); + $response[$project->getId()] = + $project->getResponse('TwingleProject pushed to Twingle'); return civicrm_api3_create_success( $response, $params, @@ -441,7 +463,8 @@ function _projectSync(TwingleProject $project, // If both versions are still synchronized else { - $response = $project->getResponse('TwingleProject up to date'); + $response[$project->getId()] = + $project->getResponse('TwingleProject up to date'); return civicrm_api3_create_success( $response, $params,