Files
conservatorio-tomadini/plugins/system/nrframework/NRFramework/Integrations/GetResponse.php
2024-12-31 11:07:09 +01:00

297 lines
6.5 KiB
PHP

<?php
/**
* @author Tassos Marinos <info@tassos.gr>
* @link https://www.tassos.gr
* @copyright Copyright © 2024 Tassos All Rights Reserved
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/
namespace NRFramework\Integrations;
// No direct access
defined('_JEXEC') or die;
class GetResponse extends Integration
{
/**
* Create a new instance
*
* @param array $options The service's required options
*/
public function __construct($options)
{
parent::__construct();
$this->setKey($options);
$this->endpoint = 'https://api.getresponse.com/v3';
$this->options->set('headers.X-Auth-Token', 'api-key ' . $this->key);
$this->options->set('headers.Accept-Encoding', 'gzip,deflate');
}
/**
* Subscribe user to GetResponse Campaign
*
* https://apidocs.getresponse.com/v3/resources/contacts#contacts.create
*
* TODO: Update existing contact
*
* @param string $email Email of the Contact
* @param string $name The name of the Contact
* @param int $dayOfCycle Enter 0 to add to the start day of the cycle.
* @param object $campaign Campaign ID
* @param object $customFields Collection of custom fields
* @param object $update_existing Update existing contact
* @param array $tags Set user tags
* @param string $tags_replace Determines what changes to make to the subscriber's tags. Values: add_only, replace_all
*
* @return void
*/
public function subscribe($email, $name, $campaign, $customFields, $update_existing, $dayOfCycle = 0, $tags = [], $tags_replace = 'add_only')
{
$data = [
'email' => $email,
'name' => $name,
'dayOfCycle' => $dayOfCycle,
'campaign' => ['campaignId' => $campaign],
'customFieldValues' => $this->validateCustomFields($customFields),
'ipAddress' => \NRFramework\User::getIP()
];
if (empty($name) || is_null($name))
{
unset($data['name']);
}
$contactId = null;
$service_tags = [];
if ($tags)
{
$service_tags = $this->getServiceTags();
}
// Replace all existing contact tags with new ones
if ($tags && $tags_replace === 'replace_all')
{
$data['tags'] = $this->validateTags($tags, $service_tags, $tags_replace);
}
if ($update_existing)
{
$contactId = $this->getContact($email);
}
$endpoint = 'contacts';
$endpoint = !empty($contactId) ? $endpoint . '/' . $contactId : $endpoint;
$this->post($endpoint, $data);
// Add new tags to the contact
if ($tags && $tags_replace === 'add_only' && $contactId)
{
$data = ['tags' => $this->validateTags($tags, $service_tags, $tags_replace)];
$this->post('contacts/' . $contactId . '/tags', $data);
}
}
/**
* Return all service tags.
*
* @return array
*/
private function getServiceTags()
{
$tags = [];
foreach ($this->get('tags') as $tag)
{
$tags[$tag['tagId']] = $tag['name'];
}
return $tags;
}
/**
* Validates and returns the valid tags.
*
* @param array $tags
* @param array $service_tags
*
* @return array
*/
private function validateTags($tags = [], $service_tags = [], $tags_replace = 'add_only')
{
$final_tags = [];
foreach ($tags as $index => $tag)
{
$valid = false;
// Find tag in service tags and add it to final tags list
foreach ($service_tags as $tagId => $tagName)
{
if ($tagId === $tag || $tagName === $tag)
{
$valid = true;
// Add to final list
$final_tags[] = [
'tagId' => $tagId
];
}
}
// Add invalid tags
if (!$valid && $tags_replace == 'add_only')
{
$new_tag = $this->createTag($tag);
$final_tags[] = [
'tagId' => $new_tag['tagId']
];
}
}
return $final_tags;
}
private function createTag($tag)
{
$data = [
'name' => $tag
];
return $this->post('tags', $data);
}
/**
* Returns a new array with valid only custom fields
*
* @param array $customFields Array of custom fields
*
* @return array Array of valid only custom fields
*/
public function validateCustomFields($customFields)
{
$fields = [];
if (!is_array($customFields))
{
return $fields;
}
$accountCustomFields = $this->get('custom-fields');
if (!$this->request_successful)
{
return $fields;
}
foreach ($accountCustomFields as $key => $customField)
{
if (!isset($customFields[$customField['name']]))
{
continue;
}
$fields[] = [
'customFieldId' => $customField['customFieldId'],
'value' => [$customFields[$customField['name']]]
];
}
return $fields;
}
/**
* Get the last error returned by either the network transport, or by the API.
* If something didn't work, this should contain the string describing the problem.
*
* @return string describing the error
*/
public function getLastError()
{
$body = $this->last_response->body;
if (!isset($body['context']) || !isset($body['context'][0]))
{
return $body['codeDescription'] . ' - ' . $body['message'];
}
$error = $body['context'][0];
// GetResponse returns a JSON string as $error and we try to decode it so we can return a more human-friendly error message
$error = is_string($error) && json_encode($error, true) ? json_decode($error, true) : $error;
if (is_array($error) && isset($error['fieldName']))
{
$errorFieldName = is_array($error['fieldName']) ? implode(' ', $error['fieldName']) : $error['fieldName'];
return $errorFieldName . ': ' . $error['message'];
}
return (is_array($error)) ? implode(' ', $error) : $error;
}
/**
* Returns all available GetResponse campaigns
*
* https://apidocs.getresponse.com/v3/resources/campaigns#campaigns.get.all
*
* @return array
*/
public function getLists()
{
$data = $this->get('campaigns');
if (!$this->success())
{
return;
}
if (!is_array($data) || !count($data))
{
return;
}
$lists = [];
foreach ($data as $key => $list)
{
$lists[] = [
'id' => $list['campaignId'],
'name' => $list['name']
];
}
return $lists;
}
/**
* Get the Contact resource
*
* @param string $email The email of the contact which we want to retrieve
*
* @return string The Contact ID
*/
public function getContact($email)
{
if (!isset($email))
{
return;
}
$data = $this->get('contacts', ['query[email]' => $email]);
if (empty($data))
{
return;
}
// the returned data is an array with only one contact
$contactId = $data[0]['contactId'];
return ($contactId) ? $contactId : null;
}
}