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