Hubspot_Helpers
Class Hubspot_Helpers
Source Source
File: src/integrations/hubspot/helpers/hubspot-helpers.php
class Hubspot_Helpers { /** * The API endpoint address. * * @var API_ENDPOINT The endpoint adress. */ const API_ENDPOINT = 'v2/hubspot'; /** * @var Hubspot_Helpers */ public $options; /** * @var Hubspot_Helpers */ public $setting_tab; /** * @var bool */ public $load_options; /** * Hubspot_Helpers constructor. */ public function __construct() { $this->automator_api = AUTOMATOR_API_URL . 'v2/hubspot'; add_action( 'init', array( $this, 'capture_oauth_tokens' ), 100, 3 ); add_action( 'init', array( $this, 'disconnect' ), 100, 3 ); $this->load_settings(); } public function load_settings() { $this->setting_tab = 'hubspot-api'; $this->tab_url = admin_url( 'edit.php' ) . '?post_type=uo-recipe&page=uncanny-automator-config&tab=premium-integrations&integration=' . $this->setting_tab; include_once __DIR__ . '/../settings/settings-hubspot.php'; new Hubspot_Settings( $this ); } /** * @param Hubspot_Helpers $options */ public function setOptions( Hubspot_Helpers $options ) { // phpcs:ignore $this->options = $options; } /** * * @return array $tokens */ public function get_client() { $tokens = get_option( '_automator_hubspot_settings', array() ); if ( empty( $tokens['access_token'] ) || empty( $tokens['refresh_token'] ) ) { throw new \Exception( __( "HubSpot is not connected", 'uncanny-automator' ) ); } $tokens = $this->maybe_refresh_token( $tokens ); return $tokens; } /** * store_client * * @param mixed $tokens * @return void */ public function store_client( $tokens ) { $tokens['stored_at'] = time(); update_option( '_automator_hubspot_settings', $tokens ); delete_transient( '_automator_hubspot_token_info' ); return $tokens; } /** * Capture tokens returned by Automator API. * * @return mixed */ public function capture_oauth_tokens() { if ( automator_filter_input( 'integration' ) !== $this->setting_tab ) { return; } $automator_message = automator_filter_input( 'automator_api_message' ); if ( empty( $automator_message ) ) { return; } $nonce = wp_create_nonce( 'automator_hubspot_api_authentication' ); $tokens = (array) Automator_Helpers_Recipe::automator_api_decode_message( $automator_message, $nonce ); $redirect_url = $this->tab_url; if ( $tokens ) { $this->store_client( $tokens ); $redirect_url .= '&connect=1'; } else { $redirect_url .= '&connect=2'; } wp_safe_redirect( $redirect_url ); die; } /** * disconnect * * @return void */ public function disconnect() { if ( automator_filter_input( 'integration' ) !== $this->setting_tab ) { return; } if ( ! automator_filter_has_var( 'disconnect' ) ) { return; } delete_transient( '_automator_hubspot_token_info' ); delete_option( '_automator_hubspot_settings' ); $redirect_url = $this->tab_url; wp_safe_redirect( $redirect_url ); die; } /** * maybe_refresh_token * * @param mixed $tokens * @return void */ public function maybe_refresh_token( $tokens ) { $expiration_timestamp = $tokens['stored_at'] + $tokens['expires_in']; // Check if token will expire in the next minute if ( time() > $expiration_timestamp - MINUTE_IN_SECONDS ) { // Token is expired or will expire soon, refresh it return $this->api_refresh_token( $tokens ); } return $tokens; } /** * api_refresh_token * * @param mixed $tokens * @return void */ public function api_refresh_token( $tokens ) { $params = array( 'endpoint' => self::API_ENDPOINT, 'body' => array( 'action' => 'refresh_token', 'client' => wp_json_encode( $tokens ), ), ); $last_call = get_option( '_automator_hubspot_last_refresh_token_call', 0 ); // Rate limit token refresh calls if they fail if ( time() - $last_call < 10 ) { throw new \Exception( __( 'HubSpot token refresh timeout, please try to reconnect HubSpot from settings', 'uncanny-automator' ) ); } $response = Api_Server::api_call( $params ); if ( empty( $response['data']['access_token'] ) ) { update_option( '_automator_hubspot_last_refresh_token_call', time() ); $error_msg = __( 'Could not refresh HubSpot token.', 'uncanny-automator' ); if ( ! empty( $response['data']['message'] ) ) { $error_msg = $response['data']['message']; } throw new \Exception( $error_msg, $response['statusCode'] ); } $tokens = $this->store_client( $response['data'] ); return $tokens; } /** * api_token_info * * @return void */ public function api_token_info() { $token_info = get_transient( '_automator_hubspot_token_info' ); if ( ! $token_info ) { $params = array( 'action' => 'access_token_info', ); try { $response = $this->api_request( $params ); $token_info = $response['data']; set_transient( '_automator_hubspot_token_info', $token_info, DAY_IN_SECONDS ); } catch ( \Exception $e ) { $token_info = false; } } return $token_info; } /** * create_contact * * @param mixed $email * @return void */ public function create_contact( $properties, $update = true, $action_data = null ) { $action = 'create_contact'; if ( $update ) { $action = 'create_or_update_contact'; } $params = array( 'action' => $action, 'properties' => wp_json_encode( $properties ), ); $response = $this->api_request( $params, $action_data ); return $response; } /** * Method extract_error * * @param $response * @param $user_id * @param $action_data * @param $recipe_id * * @return void */ public function check_for_errors( $response ) { if ( 200 !== intval( $response['statusCode'] ) ) { throw new \Exception( __( 'API returned an error: ', 'uncanny-automator' ) . $response['statusCode'], $response['statusCode'] ); } if ( isset( $response['data']['status'] ) && 'error' === $response['data']['status'] ) { throw new \Exception( $response['data']['message'] ); } } /** * Method log_action_error * * @param $response * @param $user_id * @param $action_data * @param $recipe_id * * @return void */ public function log_action_error( $error, $user_id, $action_data, $recipe_id ) { $action_data['do-nothing'] = true; $action_data['complete_with_errors'] = true; Automator()->complete_action( $user_id, $action_data, $recipe_id, $error ); } /** * Method api_request * * @param $params * * @return void */ public function api_request( $body, $action_data = null, $timeout = null ) { $body = apply_filters( 'automator_hubspot_api_request_params', $body ); $client = $this->get_client(); $body['client'] = $client; $params = array( 'endpoint' => self::API_ENDPOINT, 'body' => $body, 'action' => $action_data ); if ( null !== $timeout ) { $params['timeout'] = $timeout; } $response = Api_Server::api_call( $params ); $response = apply_filters( 'automator_hubspot_api_response', $response ); $this->check_for_errors( $response ); return $response; } /** * get_fields * * @return void */ public function get_fields( $exclude = array() ) { $fields = array(); $request_params = array( 'action' => 'get_fields', ); try { $response = $this->api_request( $request_params ); $fields[] = array( 'value' => '', 'text' => __( 'Select a field', 'uncanny-automator' ), ); foreach ( $response['data'] as $field ) { if ( in_array( $field['name'], $exclude, true ) ) { continue; } if ( $field['readOnlyValue'] ) { continue; } $fields[] = array( 'value' => $field['name'], 'text' => $field['label'], ); } } catch ( \Exception $e ) { $fields[] = array( 'value' => '', 'text' => $e->getMessage(), ); } return $fields; } /** * get_lists * * @return void */ public function get_lists() { $options = array(); $params = array( 'action' => 'get_lists', ); try { $response = $this->api_request( $params ); $options[] = array( 'value' => '', 'text' => __( 'Select a list', 'uncanny-automator' ), ); foreach ( $response['data']['lists'] as $list ) { if ( 'STATIC' !== $list['listType'] ) { continue; } $options[] = array( 'value' => $list['listId'], 'text' => $list['name'], ); } } catch ( \Exception $e ) { $options[] = array( 'value' => '', 'text' => $e->getMessage(), ); } return apply_filters( 'automator_hubspot_options_get_lists', $options ); } /** * add_contact_to_list * * @param mixed $email * @return void */ public function add_contact_to_list( $list, $email, $action_data ) { if ( empty( $email ) ) { throw new \Exception( __( 'Email is missing', 'uncanny-automator' ) ); } if ( empty( $list ) ) { throw new \Exception( __( 'List is missing', 'uncanny-automator' ) ); } $params = array( 'action' => 'add_contact_to_list', 'email' => $email, 'list' => $list, ); $response = $this->api_request( $params, $action_data ); // If the email was already in the list if ( ! empty( $response['data']['discarded'] ) ) { throw new \Exception( __( 'Contact with such email address was already in the list', 'uncanny-automator' ) ); } // If the email was not found in contacts if ( ! empty( $response['data']['invalidEmails'] ) ) { throw new \Exception( __( 'Contact with such email address was not found', 'uncanny-automator' ) ); } return $response; } /** * remove_contact_from_list * * @param mixed $list * @param mixed $email * @return void */ public function remove_contact_from_list( $list, $email, $action_data ) { if ( empty( $email ) ) { throw new \Exception( __( 'Email is missing', 'uncanny-automator' ) ); } if ( empty( $list ) ) { throw new \Exception( __( 'List is missing', 'uncanny-automator' ) ); } $params = array( 'action' => 'remove_contact_from_list', 'email' => $email, 'list' => $list, ); $response = $this->api_request( $params, $action_data ); // If the email was not found in contacts if ( ! empty( $response['data']['discarded'] ) ) { throw new \Exception( __( 'Contact with such email address was not found in the list', 'uncanny-automator' ) ); } return $response; } public function disconnect_url() { return $this->tab_url . '&disconnect=1'; } public function connect_url() { $nonce = wp_create_nonce( 'automator_hubspot_api_authentication' ); $plugin_ver = AUTOMATOR_PLUGIN_VERSION; $api_ver = '1.0'; $action = 'authorization_request'; $redirect_url = rawurlencode( $this->tab_url ); $url = $this->automator_api . "?action={$action}&redirect_url={$redirect_url}&nonce={$nonce}&api_ver={$api_ver}&plugin_ver={$plugin_ver}"; return $url; } }
Expand full source code Collapse full source code View on Github
Methods Methods
- __construct — Hubspot_Helpers constructor.
- add_contact_to_list — add_contact_to_list
- api_refresh_token — api_refresh_token
- api_request — Method api_request
- api_token_info — api_token_info
- capture_oauth_tokens — Capture tokens returned by Automator API.
- check_for_errors — Method extract_error
- connect_url
- create_contact — create_contact
- disconnect — disconnect
- disconnect_url
- get_client
- get_fields — get_fields
- get_lists — get_lists
- load_settings
- log_action_error — Method log_action_error
- maybe_refresh_token — maybe_refresh_token
- remove_contact_from_list — remove_contact_from_list
- setOptions
- store_client — store_client