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', ]); } }