<?php
|
namespace JVBase\integrations;
|
|
use JVBase\managers\Cache;
|
use JVBase\managers\IconsManager;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
trait _Base {
|
/**
|
* @var string Unique identifier for this service (ex: square, facebook)
|
*/
|
protected string $service_name;
|
/**
|
* @var int|null The user context. If it is an OAuth integration, users may have their own connections, accessible via their user id
|
*/
|
protected ?int $userID = null;
|
/**
|
* @var string Human-readable service name (ex: 'Google My Business', 'Square', etc)
|
*/
|
public string $title;
|
/**
|
* @var string Phosphoricons icon slug
|
*/
|
public string $icon = '';
|
/**
|
* @var string API version string (ex: 'v2', '2024-01-01')
|
*/
|
protected string $apiVersion;
|
protected Cache $cache;
|
protected ?string $cacheName = null;
|
//Use Trait "Requests" to set this
|
protected bool $hasRequests = false;
|
protected ?RateLimits $requestLimiter = null;
|
//Use Trait "OAuth" to set this
|
protected ?RateLimits $oauthLimiter = null;
|
protected bool $hasOAuth = false;
|
//Use trait "Webhooks" to set this true
|
protected bool $hasWebhooks = false;
|
|
/**
|
* @var array Each item in the array becomes a li element in the ordered list of instructions
|
*/
|
protected array $instructions = [];
|
/**
|
* @var array The required fields for the credentials. Typically a site_key/secret_key or equivalent.
|
*/
|
protected array $credentialFields = [];
|
/**
|
* @var array The required fields for OAuth connection
|
*/
|
protected array $oauthFields = [];
|
/**
|
* @var array Optional fields that just tweak functionality
|
*/
|
protected array $optionalFields = [];
|
protected bool $supportsWebp = true;
|
/**
|
* @var bool Flag to indicate there are extra options that warrant a dedicated options page for this service
|
* Usually used for default field values for syncable services
|
*/
|
public bool $hasExtraOptions = false;
|
public bool $hasBatchCreate = false;
|
public bool $hasBatchUpdate = false;
|
public bool $hasBatchDelete = false;
|
public bool $canCreateOnUpdate = false;
|
/**
|
* Post Syncing Capabilities
|
* Define what sync operations this integration supports
|
*/
|
protected array $canSync = [
|
'initial' => false, // Can share new posts to the service
|
'update' => false, // Can update already-shared posts
|
'delete' => false, // Can remove posts from the service
|
];
|
|
/**
|
* @var array // Post types that can be synced (e.g., ['artwork', 'tattoo']): usually built by Registrar.php if the integration name exists as a key in [ 'integrations' => []]
|
*/
|
protected array $syncPostTypes = [];
|
/**
|
* @var array Taxonomies that can be synced (e.g., ['category', 'section']): usually built by Registrar.php if the integration name exists as a key in [ 'integrations' => []]
|
*/
|
protected array $syncTaxonomies = [];
|
/**
|
* @var array User roles that can be synced (e.g., ['customer']): usually built by Registrar.php if the integration name exists as a key in [ 'integrations' => []]
|
*/
|
protected array $syncUsers = [];
|
/**
|
* @var array Integration's specific content types. An array of [ TYPE => [$fields] ] Set by child classes' setContentTypes
|
*/
|
protected array $contentTypes = [];
|
|
|
/**
|
* Check if integration is properly configured
|
*/
|
public function isSetUp(): bool
|
{
|
return !empty($this->loadCredentials());
|
}
|
|
public function loadCredentials():array
|
{
|
return Auth::getInstance()->getCredentials($this->service_name, $this->userID);
|
}
|
|
protected function logError(string $method, string $message, array $context = []):void
|
{
|
$context['service'] = $this->service_name;
|
JVB()->error()->log('['.self::class.']'.$method, $message, $context);
|
}
|
|
protected function getReturnURL():string
|
{
|
//If we are on the main admin page, we want to go back to our Integrations page on admin
|
//If we are on the custom dashboard, we want to go back to that dashboard page
|
return is_admin() ?
|
admin_url('admin.php?page=jvb-integrations') :
|
get_home_url(null, '/dash/integrations/');
|
}
|
protected function determineOptionPage():string
|
{
|
return is_admin() ?
|
admin_url('admin.php?page=jvb-integrations-'.$this->service_name) :
|
get_home_url(null, '/dash/integrations/'.$this->service_name.'/');
|
}
|
|
protected function outputIcon(string $icon):string
|
{
|
if (is_admin()) {
|
$icons = IconsManager::for('admin');
|
return $icons->getRawSvg($icon);
|
}
|
return jvbDashIcon($icon);
|
}
|
|
protected function initializeRateLimiters():void
|
{
|
$key = $this->service_name;
|
if (!is_null($this->userID)) {
|
$key .= '_'.$this->userID;
|
}
|
|
if ($this->hasRequests && !isset($this->requestLimiter) && !is_null($this->oauthLimiter)) {
|
$this->requestLimiter = new RateLimits($key);
|
}
|
if ($this->hasOAuth && !isset($this->oauthLimiter) && !is_null($this->oauthLimiter)) {
|
$key .= '_oauth';
|
$this->oauthLimiter = new RateLimits($key, ['s' => 1,'m' => 10, 'h' => 100]);
|
}
|
}
|
|
public function response(bool $success, string $message, array $data = []):array
|
{
|
$response = [
|
'success' => $success,
|
'message' => $message
|
];
|
if (!empty($data)) {
|
$response['data'] = $data;
|
}
|
return $response;
|
}
|
}
|