Files
2024-12-31 11:07:09 +01:00

220 lines
4.3 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 HubSpot3 extends Integration
{
/**
* Create a new instance
*
* @param string $key Your HubSpot API key
*/
public function __construct($options)
{
parent::__construct();
$this->setKey($options);
$this->setEndpoint('https://api.hubapi.com/crm/v3');
$this->options->set('headers.Authorization', 'Bearer ' . $this->key);
}
/**
* Create/Update a HubSpot Contact
*
* API References:
* https://developers.hubspot.com/docs/api/crm/contacts
*
* @param string $email User's email address
* @param string $params The forms extra fields
* @param bool $update_existing Set whether to update an existing user
*
* @return void
*/
public function subscribe($email, $params, $update_existing = true)
{
$contact_data = $this->contactExists($email);
if (!$update_existing)
{
if ($contact_data)
{
throw new \Exception('Contact already exists.');
}
}
$default_property = ['email' => $email];
$other_properties = $this->validateCustomFields($params);
$data = [
'properties' => array_merge($default_property, $other_properties)
];
$method = 'post';
$endpoint = 'objects/contacts';
if ($update_existing && $contact_data)
{
$method = 'patch';
$endpoint .= '/' . $contact_data['id'];
};
$this->$method($endpoint, $data);
// If a list exists, add the contact to that list.
if ($this->success() && isset($params['list']) && !empty($params['list']))
{
$this->addContactToStaticList($email, $params['list']);
}
}
/**
* Returns all lists.
*
* @return array
*/
public function getLists()
{
$this->endpoint = $this->getV1Endpoint();
$data = $this->get('lists/static');
if (!$this->success())
{
return;
}
if (!is_array($data) || !count($data) || !isset($data['lists']))
{
return;
}
$lists = [];
foreach ($data['lists'] as $key => $list)
{
$lists[] = [
'id' => $list['listId'],
'name' => $list['name']
];
}
return $lists;
}
/**
* Add contact to a static list.
*
* @param string $email
* @param int $list_id
*
* @return void
*/
public function addContactToStaticList($email, $list_id)
{
$this->endpoint = $this->getV1Endpoint();
$data = (object) [ 'emails' => [ $email ] ];
$this->post('lists/' . $list_id . '/add', $data);
}
/**
* Return the v1 endpoint.
*
* @return string
*/
private function getV1Endpoint()
{
return 'https://api.hubapi.com/contacts/v1';
}
/**
* Check whether contact already exists.
*
* @param string $email
*
* @return bool
*/
public function contactExists($email)
{
$contact = $this->get('objects/contacts/' . $email . '?idProperty=email');
return $this->success() ? $contact : false;
}
/**
* Returns a new array with valid only custom fields
*
* API References:
* https://developers.hubspot.com/docs/api/crm/properties
*
* @param array $formCustomFields Array of custom fields
*
* @return array Array of valid only custom fields
*/
public function validateCustomFields($formCustomFields)
{
$fields = [];
if (!is_array($formCustomFields))
{
return $fields;
}
$contactCustomFields = $this->get('properties/Contact');
if (!$this->request_successful)
{
return $fields;
}
$customFieldNames = array_map(
function ($ar)
{
return $ar['name'];
}, $contactCustomFields['results']
);
$formCustomFieldsKeys = array_keys($formCustomFields);
foreach ($customFieldNames as $accountFieldName)
{
if (!in_array($accountFieldName, $formCustomFieldsKeys))
{
continue;
}
$fields[$accountFieldName] = $formCustomFields[$accountFieldName];
}
return $fields;
}
/**
* Get the last error returned by either the network transport, or by the API.
*
* @return string
*/
public function getLastError()
{
$body = $this->last_response->body;
if (isset($body['status']) && $body['status'] === 'error')
{
return $body['message'];
}
}
}