146 lines
4.2 KiB
PHP
146 lines
4.2 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::getContactByEmail($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) {
|
|
/* @var \Civi\Mailinglistsync\BaseMailingList $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',
|
|
]);
|
|
}
|
|
}
|