de.propeace.mailinglistsync/api/v3/Mailinglistsync/Mlmmjsync.php
2025-03-28 19:07:48 +01:00

145 lines
4.1 KiB
PHP

<?php
use Civi\Mailinglistsync\MailingListSettings;
use Civi\Mailinglistsync\QueueHelper;
use Civi\Mailinglistsync\MailingListRecipient;
use CRM_Mailinglist_ExtensionUtil as E;
/**
* Mailinglistsync.Mlmmjsync API specification (optional)
* This is used for documentation and validation.
*
* @param array $spec description of fields supported by this API call
*
* @see https://docs.civicrm.org/dev/en/latest/framework/api-architecture/
*/
function _civicrm_api3_mailinglistsync_Mlmmjsync_spec(&$spec) {
return $spec;
}
/**
* Mailinglistsync.Mlmmjsync API
*
* @param array $params
*
* @return array
* API result descriptor
*
* @throws CRM_Core_Exception
* @see civicrm_api3_create_success
*
*/
function civicrm_api3_mailinglistsync_Mlmmjsync($params) {
try {
// Check if the mailing list sync is enabled
$enabled = (bool) MailingListSettings::get('enable');
if (!$enabled) {
return civicrm_api3_create_success(
['message' => 'Mailing list sync is disabled'], [], 'Mailinglist', 'Mlmmjsync'
);
}
$is_error = FALSE;
// Get queues
$qh = QueueHelper::getInstance();
$groupQueue = $qh->getGroupQueue();
$eventQueue = $qh->getEventQueue();
$emailQueue = $qh->getEmailQueue();
// Create runners
$groupRunner = new CRM_Queue_Runner([
'title' => ts('ProPeace GroupMailinglist Runner'),
'queue' => $groupQueue,
'errorMode' => CRM_Queue_Runner::ERROR_CONTINUE,
]);
$eventRunner = new CRM_Queue_Runner([
'title' => ts('ProPeace EventMailinglist Runner'),
'queue' => $eventQueue,
'errorMode' => CRM_Queue_Runner::ERROR_CONTINUE,
]);
$emailRunner = new CRM_Queue_Runner([
'title' => ts('ProPeace EmailMailinglist Runner'),
'queue' => $emailQueue,
'errorMode' => CRM_Queue_Runner::ERROR_CONTINUE,
]);
// Run runners
$results = [];
foreach ([$groupRunner, $eventRunner, $emailRunner] as $runner) {
$continue = TRUE;
$count = 0;
$errors = [];
while ($continue) {
$count++;
$result = $runner->runNext(FALSE);
$continue = $result['is_continue'];
if ($result['is_error']) {
$error = $result['exception']->getMessage();
// If the error is 'Failed to claim next task' we should stop the runner
if ($error === 'Failed to claim next task') {
$continue = FALSE;
}
else {
$errors[] = $error;
}
}
}
$results['runners'][$runner->title][] = [
'task_count' => $count,
'errors' => $errors,
];
$is_error = !empty($errors) || $is_error;
}
$groups = $qh->getGroups();
$events = $qh->getEvents();
$emails = $qh->getEmails();
// Sync groups and events just once and invoke syncing
$mailingListsToSync = [];
foreach ($groups as $group) {
$mailingListsToSync[$group->getId()] = $group;
}
foreach ($events as $event) {
$mailingListsToSync[$event->getId()] = $event;
}
foreach ($emails as $email) {
$recipient = MailingListRecipient::getContactIdEmail($email);
$emailGroups = $recipient->getMailingLists();
$emailEvents = $recipient->getEventMailingLists();
foreach ($emailGroups as $group) {
$mailingListsToSync[$group->getId()] = $group;
}
foreach ($emailEvents as $event) {
$mailingListsToSync[$event->getId()] = $event;
}
}
foreach ($mailingListsToSync as $mailingList) {
$results['mailing_lists'][$mailingList->getEmailAddress()] = $mailingList->sync(); // TODO: re-add failed task to queue
}
if ($is_error) {
return civicrm_api3_create_error('One or more errors occurred during the sync process', [
'params' => $params,
'results' => $results,
'entity' => 'Mailinglistsync',
'action' => 'Mlmmjsync',
]);
}
return civicrm_api3_create_success($results, [], 'Mailinglist', 'Mlmmjsync');
}
catch (Exception $e) {
return civicrm_api3_create_error($e->getMessage(), [
'params' => $params,
'entity' => 'Mailinglistsync',
'action' => 'Mlmmjsync',
]);
}
}