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

291 lines
9.6 KiB
PHP

<?php
use Civi\Mailinglistsync\ADGroupMailingList;
use Civi\Mailinglistsync\Exceptions\MailinglistException;
use Civi\Mailinglistsync\MailingListSettings;
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' => 0,
'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' => 0,
'type' => CRM_Utils_Type::T_EMAIL,
'title' => 'Email Address',
'description' => 'Email address of the mailing list',
];
$spec['recipients'] = [
'api.required' => 0,
'type' => CRM_Utils_Type::T_STRING,
'title' => E::ts('Recipients'),
'description' => E::ts('Array of email addresses and SIDs'),
];
$spec['name'] = [
'api.required' => 0,
'type' => CRM_Utils_Type::T_STRING,
'title' => E::ts('Mail List Name'),
'description' => E::ts('Name of the mailing list'),
];
$spec['description'] = [
'api.required' => 0,
'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);
// 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', 'Adgroupsync'
);
}
// Validate params
// Decode recipients JSON if it's a string
if (!empty($params['recipients'])) {
if (is_string($params['recipients'])) {
try {
$params['recipients'] = json_decode($params['recipients'], TRUE);
}
catch (Exception $e) {
return civicrm_api3_create_error(
'Failed to decode recipients JSON',
[
'params' => $params,
'entity' => 'Mailinglistsync',
'action' => 'Adgroupsync',
]);
}
}
// Throw error if recipients is not an array
if (!is_array($params['recipients'])) {
return civicrm_api3_create_error(
'Recipients must be an array',
[
'params' => $params,
'entity' => 'Mailinglistsync',
'action' => 'Adgroupsync',
]);
}
}
// If group is updated
if (
!empty($params['sid']) &&
!empty($params['email']) &&
!empty($params['name'])
) {
// Prepare result array
$result = [
'group' =>
[
'sid' => $params['sid'],
'email' => $params['email'],
'name' => $params['name'],
'description' => $params['description'] ?? '',
'created' => FALSE,
'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'],
email: $params['email'],
description: $params['description'],
sid: $params['sid'],
);
$result['group']['created']['group_id'] = $adGroupMailingList->getId();
$result['group']['created']['is_error'] = 0;
}
catch (MailinglistException $e) {
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
$result['group']['created']['is_error'] = 1;
}
}
// 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' => 0,
'old' => $adGroupMailingList->getTitle(),
'new' => $params['name'],
];
}
catch (MailinglistException $e) {
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
$result['group']['updated']['title'] = [
'is_error' => 1,
'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' => 0,
'old' => $adGroupMailingList->getGroupDescription(),
'new' => $params['description'],
];
}
catch (MailinglistException $e) {
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
$result['group']['updated']['description'] = [
'is_error' => 1,
'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' => 0,
'old' => $adGroupMailingList->getEmailAddress(),
'new' => $params['email'],
];
}
catch (MailinglistException $e) {
\Civi::log(E::LONG_NAME)->error($e->getLogMessage());
$result['group']['updated']['email'] = [
'is_error' => 1,
'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'] = (int) ($result['group']['updated']['error_count'] > 0);
}
$result['group']['group_id'] = $adGroupMailingList->getId();
}
}
catch (MailinglistException $me) {
\Civi::log(E::LONG_NAME)->error($me->getLogMessage());
return civicrm_api3_create_error($me->getLogMessage(),
[
'values' => $result,
'params' => $params,
'entity' => 'Mailinglistsync',
'action' => 'Adgroupsync',
]);
}
// Sync group mailing list members
$result['recipients'] = $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']['error_count'] ?? 0);
$result['is_error'] = (int) ($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');
}
// If only recipients are updated
elseif (
!empty($params['recipients']) &&
empty($params['sid']) &&
empty($params['email']) &&
empty($params['name']) &&
empty($params['description'])
) {
$result = [];
// Update recipients
$result['recipients'] = ADGroupMailingList::syncContacts($params['recipients']);
// Return error response if any errors occurred
$totalErrors = $result['recipients']['error_count'] ?? 0;
$result['count'] = $result['recipients']['count'] ?? 0;
$result['is_error'] = (int) ($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 ? $result['count'] : [], $params, 'Mailinglistsync', 'Adgroupsync');
}
else {
return civicrm_api3_create_error(
'Missing required parameters',
[
'params' => $params,
'entity' => 'Mailinglistsync',
'action' => 'Adgroupsync',
]);
}
}