220 lines
4.3 KiB
PHP
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'];
|
|
}
|
|
}
|
|
} |