• File: Refresh.php
  • Full Path: /home/matthif/www/wp-content/plugins/optinmonster/OMAPI/Refresh.php
  • Date Modified: 01/24/2025 1:58 PM
  • File size: 5.55 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
/**
 * Refresh class.
 *
 * @since 1.0.0
 *
 * @package OMAPI
 * @author  Thomas Griffin
 */

// Exit if accessed directly.
if ( ! defined'ABSPATH' ) ) {
    exit;
}

/**
 * Refresh class.
 *
 * @since 1.0.0
 */
class OMAPI_Refresh {

    
/**
     * Holds the class object.
     *
     * @since 1.0.0
     *
     * @var object
     */
    
public static $instance;

    
/**
     * Path to the file.
     *
     * @since 1.0.0
     *
     * @var string
     */
    
public $file __FILE__;

    
/**
     * Holds the base class object.
     *
     * @since 1.0.0
     *
     * @var object
     */
    
public $base;

    
/**
     * Arguments for the API requests.
     *
     * @since 1.6.5
     *
     * @var array
     */
    
protected $api_args = array(
        
'limit'  => 100,
        
'status' => 'all',
    );

    
/**
     * OMAPI_Api object
     *
     * @var null|OMAPI_Api
     */
    
public $api null;

    
/**
     * WP_Error object if refresh fails.
     *
     * @var null|WP_Error
     */
    
public $error null;

    
/**
     * Primary class constructor.
     *
     * @since 1.0.0
     */
    
public function __construct() {

        
// Set our object.
        
$this->set();
    }

    
/**
     * Sets our object instance and base class instance.
     *
     * @since 1.0.0
     */
    
public function set() {
        
self::$instance $this;
        
$this->base     OMAPI::get_instance();
    }

    
/**
     * Refresh the optins.
     *
     * @since  1.0.0
     *
     * @param  string $api_key API key.
     *
     * @return WP_Error|bool True if successful.
     */
    
public function refresh$api_key null ) {
        
$this->api OMAPI_Api::build'v1''optins''GET'$api_key ? array( 'apikey' => $api_key ) : $api_key );
        
$args      $this->setup_api$api_key$this->api_args );

        
$results = array();
        
$body    $this->api->request$args );

        
// Loop through paginated requests until we have fetched all the campaigns.
        
while ( ! is_wp_error$body ) || empty( $body ) ) {
            
$limit       absintwp_remote_retrieve_header$this->api->response'limit' ) );
            
$page        absintwp_remote_retrieve_header$this->api->response'page' ) );
            
$total       absintwp_remote_retrieve_header$this->api->response'total' ) );
            
$total_pages ceil$total $limit );
            
$results     array_merge$results, (array) $body );

            
// If we've reached the end, prevent any further requests.
            
if ( $page >= $total_pages || === $limit ) {
                break;
            }

            
$args['page'] = $page 1;

            
// Request the next page.
            
$body $this->api->request$args );
        }

        if ( 
is_wp_error$body ) ) {
            
$this->handle_error$body );
        } else {
            
// Store the optin data.
            
$this->base->save->store_optins$results );

            
// Update our sites as well.
            
$result $this->base->sites->fetch$api_key );

            
// Update the option to remove stale error messages.
            
$option                $this->base->get_option();
            
$option['is_invalid']  = false;
            
$option['is_expired']  = false;
            
$option['is_disabled'] = false;
            
$option['connected']   = time();
            if ( 
is_wp_error$result ) ) {
                
$this->error $result;
            } else {
                
$option array_merge$option$result );
            }

            
$this->base->save->update_option$option );
        }

        return 
$this->error $this->error true;
    }

    
/**
     * Trigger a refresh for given campaign.
     *
     * @since  1.9.10
     *
     * @param  string $campaign_id The campaign id (slug).
     *
     * @return WP_Error|bool True if successful.
     */
    
public function sync$campaign_id ) {
        
$time time();
        
$path "for-wp/{$campaign_id}?t={$time}";

        
$this->api OMAPI_Api::build'v1'$path'GET' );

        
$body $this->api->request$this->setup_api() );

        if ( 
is_wp_error$body ) ) {

            
// If campaign is gone, delete the optin.
            
if (
                
'campaign-error' === $body->get_error_code()
                && (string) 
'404' === (string) $body->get_error_data()
            ) {
                
$result $this->base->save->delete_optin$campaign_idtrue );
            }

            
$this->handle_error$body );
        } else {

            
// Store the optin data.
            
$this->base->save->add_optins( (array) $bodyfalse );
        }

        return 
$this->error $this->error true;
    }

    
/**
     * Gets contextual info for API requests.
     *
     * @since  1.9.10
     *
     * @param  array $args Array of args.
     *
     * @return arry        Modified array of args.
     */
    
public function get_info_args$args = array() ) {

        
// Set additional flags.
        
$args['wp'] = $GLOBALS['wp_version'];
        
$args['av'] = $this->base->asset_version();
        
$args['v']  = $this->base->version;

        if ( 
OMAPI_WooCommerce::is_active() ) {
            
$args['wc'] = OMAPI_WooCommerce::version();
        }

        
$args array_merge$argsOMAPI_Api::get_url_args() );

        return 
$args;
    }

    
/**
     * Handles setting up the API request.
     *
     * @since  1.9.10
     *
     * @param  string $api_key API key.
     * @param  array  $args    Array of request args.
     *
     * @return arry             Modified array of request args.
     */
    
protected function setup_api$api_key null$args = array() ) {
        if ( 
$api_key ) {
            
$this->api->set'apikey'$api_key );
        }

        
$this->api->clear_additional_data();

        
// Set additional flags.
        
return $this->get_info_args$args );
    }

    
/**
     * Handles errors occurring during refresh.
     *
     * @since  1.9.10
     *
     * @param  WP_Error $error WP_Error object.
     *
     * @return OMAPI_Refresh
     */
    
protected function handle_error$error ) {
        switch ( 
$error->get_error_code() ) {
            
// If no optins available, make sure they get deleted.
            
case 'optins':
            case 
'no-campaigns-error':
                
$this->base->save->store_optins( array() );
                break;

            case 
'referrer-error':
                
$api    OMAPI_Api::instance();
                
$result $this->base->sites->check_existing_site$api->get_creds() );
                if ( 
is_wp_error$result ) ) {
                    
$error $result;
                }
                break;
        }

        
// Set an error message.
        
$this->error $error;

        return 
$this;
    }

}