203 lines
6.8 KiB
PHP
203 lines
6.8 KiB
PHP
<?php
|
|
|
|
use Civi\Mailinglistsync\ADGroupMailingList;
|
|
use Civi\Mailinglistsync\Exceptions\MailinglistException;
|
|
use CRM_Mailinglistsync_ExtensionUtil as E;
|
|
|
|
/**
|
|
* Mailinglistsync.Adgroupsync 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_Adgroupsync_spec(&$spec) {
|
|
$spec['sid'] = [
|
|
'api.required' => 1,
|
|
'type' => CRM_Utils_Type::T_STRING,
|
|
'title' => E::ts('Active Directory SID'),
|
|
'description' => E::ts('The Active Directory SID of the group'),
|
|
];
|
|
$spec['email'] = [
|
|
'api.required' => 1,
|
|
'type' => CRM_Utils_Type::T_EMAIL,
|
|
'title' => 'Email Address',
|
|
'description' => 'Email address of the mailing list',
|
|
];
|
|
$spec['recipients'] = [
|
|
'api.required' => 1,
|
|
'type' => CRM_Utils_Type::T_STRING,
|
|
'title' => E::ts('Recipients'),
|
|
'description' => E::ts('Array of email addresses and SIDs'),
|
|
];
|
|
$spec['name'] = [
|
|
'api.required' => 1,
|
|
'type' => CRM_Utils_Type::T_STRING,
|
|
'title' => E::ts('Mail List Name'),
|
|
'description' => E::ts('Name of the mailing list'),
|
|
];
|
|
$spec['description'] = [
|
|
'api.required' => 1,
|
|
'type' => CRM_Utils_Type::T_LONGTEXT,
|
|
'title' => E::ts('Mail List Description'),
|
|
'description' => E::ts('Description of the mailing list'),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Mailinglistsync.Adgroupsync API
|
|
*
|
|
* @param array $params
|
|
*
|
|
* @return array
|
|
* API result descriptor
|
|
*
|
|
* @throws \Civi\Mailinglistsync\Exceptions\MailinglistException
|
|
* @throws CRM_Core_Exception
|
|
* @see civicrm_api3_create_success
|
|
*/
|
|
function civicrm_api3_mailinglistsync_Adgroupsync($params) {
|
|
|
|
// Filter illegal params
|
|
$allowed_params = [];
|
|
_civicrm_api3_mailinglistsync_Adgroupsync_spec($allowed_params);
|
|
$params = array_intersect_key($params, $allowed_params);
|
|
|
|
// Prepare result array
|
|
$result = [
|
|
'sid' => $params['sid'],
|
|
'email' => $params['email'],
|
|
'name' => $params['name'],
|
|
'description' => $params['description'],
|
|
'group_created' => FALSE,
|
|
'group_updated' => FALSE,
|
|
];
|
|
|
|
try {
|
|
// Try to get mailing list by SID
|
|
$adGroupMailingList = ADGroupMailingList::getBySID($params['sid']);
|
|
|
|
// If no AD group mailing list found, create new
|
|
if (!$adGroupMailingList) {
|
|
try {
|
|
$adGroupMailingList = ADGroupMailingList::createGroup(
|
|
title: $params['name'],
|
|
description: $params['description'],
|
|
email: $params['email'],
|
|
sid: $params['sid'],
|
|
);
|
|
$result['group_created']['group_id'] = $adGroupMailingList->getId();
|
|
$result['group_created']['is_error'] = FALSE;
|
|
}
|
|
catch (MailinglistException $e) {
|
|
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
|
|
$result['group_created']['is_error'] = TRUE;
|
|
}
|
|
}
|
|
|
|
// Sync AD group mailing list values
|
|
else {
|
|
if ($adGroupMailingList->getTitle() !== $params['name']) {
|
|
try {
|
|
$adGroupMailingList->updateGroupTitle($params['name']);
|
|
\Civi::log(E::LONG_NAME)->info(
|
|
"Updated group '{$adGroupMailingList->getId()}' title from '{$adGroupMailingList->getTitle()}' to '{$params['name']}'"
|
|
);
|
|
$result['group_updated']['title'] = [
|
|
'is_error' => FALSE,
|
|
'old' => $adGroupMailingList->getTitle(),
|
|
'new' => $params['name'],
|
|
];
|
|
}
|
|
catch (MailinglistException $e) {
|
|
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
|
|
$result['group_updated']['title'] = [
|
|
'is_error' => TRUE,
|
|
'error' => $e->getLogMessage(),
|
|
];
|
|
}
|
|
}
|
|
if ($adGroupMailingList->getGroupDescription() !== $params['description']) {
|
|
try {
|
|
$adGroupMailingList->updateGroupDescription($params['description']);
|
|
\Civi::log(E::LONG_NAME)->info(
|
|
"Updated group '{$adGroupMailingList->getId()}' description.'"
|
|
);
|
|
$result['group_updated']['description'] = [
|
|
'is_error' => FALSE,
|
|
'old' => $adGroupMailingList->getGroupDescription(),
|
|
'new' => $params['description'],
|
|
];
|
|
}
|
|
catch (MailinglistException $e) {
|
|
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
|
|
$result['group_updated']['description'] = [
|
|
'is_error' => TRUE,
|
|
'error' => $e->getLogMessage(),
|
|
];
|
|
}
|
|
}
|
|
if ($adGroupMailingList->getEmailAddress() !== $params['email']) {
|
|
try {
|
|
$adGroupMailingList->updateEmailAddress($params['email']);
|
|
\Civi::log(E::LONG_NAME)->info(
|
|
"Updated group '{$adGroupMailingList->getId()}' email address from '{$adGroupMailingList->getEmailAddress()}' to '{$params['email']}'"
|
|
);
|
|
$result['group_updated']['email'] = [
|
|
'is_error' => FALSE,
|
|
'old' => $adGroupMailingList->getEmailAddress(),
|
|
'new' => $params['email'],
|
|
];
|
|
}
|
|
catch (MailinglistException $e) {
|
|
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
|
|
$result['group_updated']['email'] = [
|
|
'is_error' => TRUE,
|
|
'error' => $e->getLogMessage(),
|
|
];
|
|
}
|
|
}
|
|
$adGroupMailingList->save();
|
|
|
|
if ($result['group_updated'] ?? FALSE) {
|
|
$result['group_updated']['error_count'] = count(array_filter($result['group_updated'], fn($v) => $v['is_error']));
|
|
$result['group_updated']['is_error'] = $result['group_updated']['error_count'] > 0;
|
|
$result['group_updated']['group_id'] = $adGroupMailingList->getId();
|
|
}
|
|
}
|
|
|
|
// Sync group mailing list members
|
|
$result['recipients_updated'] = $adGroupMailingList->syncRecipients($params['recipients']);
|
|
|
|
// Return error response if any errors occurred
|
|
$totalErrors = (int) ($result['group_created']['is_error'] ?? 0)
|
|
+ ($result['group_updated']['error_count'] ?? 0)
|
|
+ ($result['recipients_updated']['error_count'] ?? 0);
|
|
$result['is_error'] = $totalErrors > 0;
|
|
$result['error_count'] = $totalErrors;
|
|
if ($totalErrors > 0) {
|
|
return civicrm_api3_create_error(
|
|
"Failed to sync recipients. $totalErrors errors occurred.",
|
|
[
|
|
'values' => $result,
|
|
'params' => $params,
|
|
'entity' => 'Mailinglistsync',
|
|
'action' => 'Adgroupsync',
|
|
]);
|
|
|
|
}
|
|
|
|
// Else return success response
|
|
return civicrm_api3_create_success($result, $params, 'Mailinglistsync', 'Adgroupsync');
|
|
}
|
|
catch (MailinglistException $me) {
|
|
\Civi::log(E::LONG_NAME)->error($me->getLogMessage());
|
|
return civicrm_api3_create_error($me->getLogMessage(),
|
|
[
|
|
'params' => $params,
|
|
'entity' => 'Mailinglistsync',
|
|
'action' => 'Adgroupsync',
|
|
]);
|
|
}
|
|
}
|