first commit

This commit is contained in:
Roman Pyrih
2026-03-10 09:50:10 +01:00
commit 64c4a90405
7289 changed files with 2645777 additions and 0 deletions

View File

@@ -0,0 +1,102 @@
<?php
namespace Analyst\Http;
use Analyst\ApiResponse;
use Analyst\Contracts\HttpClientContract;
class CurlHttpClient implements HttpClientContract
{
/**
* Make an http request
*
* @param $method
* @param $url
* @param array $body
* @param $headers
* @return mixed
*/
public function request($method, $url, $body, $headers)
{
$method = strtoupper($method);
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => $this->prepareRequestHeaders($headers),
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_FAILONERROR => true,
CURLOPT_HEADER => true,
CURLOPT_TIMEOUT => 30,
];
if ($method === 'POST') {
$options[CURLOPT_POST] = 1;
$options[CURLOPT_POSTFIELDS] = json_encode($body);
}
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
list($rawHeaders, $rawBody) = explode("\r\n\r\n", $response, 2);
$info = curl_getinfo($curl);
curl_close($curl);
$responseHeaders = $this->resolveResponseHeaders($rawHeaders);
$responseBody = json_decode($rawBody, true);
return new ApiResponse($responseBody, $info['http_code'], $responseHeaders);
}
/**
* Must return `true` if client is supported
*
* @return bool
*/
public static function hasSupport()
{
return function_exists('curl_version');
}
/**
* Modify request headers from key value pair
* to vector array
*
* @param array $headers
* @return array
*/
protected function prepareRequestHeaders ($headers)
{
return array_map(function ($key, $value) {
return sprintf('%s:%s', $key, $value);
}, array_keys($headers), $headers);
}
/**
* Resolve raw response headers as
* associative array
*
* @param $rawHeaders
* @return array
*/
private function resolveResponseHeaders($rawHeaders)
{
$headers = [];
foreach (explode("\r\n", $rawHeaders) as $i => $line) {
$parts = explode(': ', $line);
if (count($parts) === 1) {
continue;
}
$headers[$parts[0]] = $parts[1];
}
return $headers;
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace Analyst\Http;
use Analyst\ApiResponse;
use Analyst\Contracts\HttpClientContract;
class DummyHttpClient implements HttpClientContract
{
/**
* Make an http request
*
* @param $method
* @param $url
* @param $body
* @param $headers
* @return ApiResponse
*/
public function request($method, $url, $body, $headers)
{
return new ApiResponse('Dummy response', 200, []);
}
/**
* Must return `true` if client is supported
*
* @return bool
*/
public static function hasSupport()
{
return true;
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestContract;
use Analyst\Contracts\RequestorContract;
abstract class AbstractLoggerRequest implements RequestContract
{
/**
* @var Collector
*/
protected $collector;
/**
* @var integer
*/
protected $id;
/**
* @var string
*/
protected $path;
public function __construct(Collector $collector, $pluginId, $path)
{
$this->collector = $collector;
$this->id = $pluginId;
$this->path = $path;
}
/**
* Cast request data to array
*
* @return array
*/
public function toArray()
{
return [
'plugin_id' => $this->id,
'php_version' => $this->collector->getPHPVersion(),
'wp_version' => $this->collector->getWordPressVersion(),
'plugin_version' => $this->collector->getPluginVersion($this->path),
'url' => $this->collector->getSiteUrl(),
'sdk_version' => $this->collector->getSDKVersion(),
'ip' => $this->collector->getServerIp(),
'mysql_version' => $this->collector->getMysqlVersion(),
'locale' => $this->collector->getSiteLanguage(),
'current_theme' => $this->collector->getCurrentThemeName(),
'active_plugins_list' => implode(', ', $this->collector->getActivePluginsList()),
'email' => $this->collector->getGeneralEmailAddress(),
'name' => $this->collector->getCurrentUserName()
];
}
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public abstract function execute(RequestorContract $requestor);
}

View File

@@ -0,0 +1,42 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestContract;
use Analyst\Contracts\RequestorContract;
/**
* Class ActivateRequest
*
* Is is very similar to install request
* but with different path
*
* @since 0.9.12
*/
class ActivateRequest extends AbstractLoggerRequest
{
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public function execute(RequestorContract $requestor)
{
return $requestor->post('logger/activate', $this->toArray());
}
/**
* Make request instance
*
* @param Collector $collector
* @param $pluginId
* @param $path
* @return static
*/
public static function make(Collector $collector, $pluginId, $path)
{
return new static($collector, $pluginId, $path);
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestorContract;
/**
* Class DeactivateRequest
*
* @since 0.9.10
*/
class DeactivateRequest extends AbstractLoggerRequest
{
/**
* @var string
*/
protected $question;
/**
* @var string
*/
protected $answer;
/**
* @param Collector $collector
* @param $pluginId
* @param $path
* @param $question
* @param $answer
* @return static
*/
public static function make(Collector $collector, $pluginId, $path, $question, $answer)
{
return new static($collector, $pluginId, $path, $question, $answer);
}
public function __construct(Collector $collector, $pluginId, $path, $question, $answer)
{
parent::__construct($collector, $pluginId, $path);
$this->question = $question;
$this->answer = $answer;
}
public function toArray()
{
return array_merge(parent::toArray(), [
'question' => $this->question,
'answer' => $this->answer,
]);
}
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public function execute(RequestorContract $requestor)
{
return $requestor->post('logger/deactivate', $this->toArray());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestorContract;
/**
* Class InstallRequest
*
* @since 0.9.4
*/
class InstallRequest extends AbstractLoggerRequest
{
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public function execute(RequestorContract $requestor)
{
return $requestor->post('logger/install', $this->toArray());
}
/**
* Make request instance
*
* @param Collector $collector
* @param $pluginId
* @param $path
* @return static
*/
public static function make(Collector $collector, $pluginId, $path)
{
return new static($collector, $pluginId, $path);
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestContract;
use Analyst\Contracts\RequestorContract;
/**
* Class OptInRequest
*
* Is is very similar to install request
* but with different path
*
* @since 0.9.5
*/
class OptInRequest extends AbstractLoggerRequest
{
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public function execute(RequestorContract $requestor)
{
return $requestor->post('logger/opt-in', $this->toArray());
}
/**
* Make request instance
*
* @param Collector $collector
* @param $pluginId
* @param $path
* @return static
*/
public static function make(Collector $collector, $pluginId, $path)
{
return new static($collector, $pluginId, $path);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestContract;
use Analyst\Contracts\RequestorContract;
/**
* Class OptOutRequest
*
* Is is very similar to install request
* but with different path
*
* @since 0.9.9
*/
class OptOutRequest extends AbstractLoggerRequest
{
/**
* @param Collector $collector
* @param $pluginId
* @param $path
* @return static
*/
public static function make(Collector $collector, $pluginId, $path)
{
return new static($collector, $pluginId, $path);
}
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public function execute(RequestorContract $requestor)
{
return $requestor->post('logger/opt-out', $this->toArray());
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Analyst\Http\Requests;
use Analyst\ApiResponse;
use Analyst\Collector;
use Analyst\Contracts\RequestorContract;
/**
* Class DeactivateRequest
*
* @since 0.9.13
*/
class UninstallRequest extends AbstractLoggerRequest
{
/**
* @param Collector $collector
* @param $pluginId
* @param $path
* @return static
*/
public static function make(Collector $collector, $pluginId, $path)
{
return new static($collector, $pluginId, $path);
}
/**
* Execute the request
* @param RequestorContract $requestor
* @return ApiResponse
*/
public function execute(RequestorContract $requestor)
{
return $requestor->post('logger/uninstall', $this->toArray());
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace Analyst\Http;
use WP_Error;
use Analyst\ApiResponse;
use Analyst\Contracts\HttpClientContract;
use Requests_Utility_CaseInsensitiveDictionary;
class WordPressHttpClient implements HttpClientContract
{
/**
* Make an http request
*
* @param $method
* @param $url
* @param $body
* @param $headers
* @return ApiResponse
*/
public function request($method, $url, $body, $headers)
{
$options = [
'body' => json_encode($body),
'headers' => $headers,
'method' => $method,
'timeout' => 30,
];
$response = wp_remote_request($url, $options);
$body = [];
$responseHeaders = [];
if ($response instanceof WP_Error) {
$code = $response->get_error_code();
} else {
/** @var Requests_Utility_CaseInsensitiveDictionary $headers */
$responseHeaders = $response['headers']->getAll();
$body = json_decode($response['body'], true);
$code = $response['response']['code'];
}
return new ApiResponse(
$body,
$code,
$responseHeaders
);
}
/**
* Must return `true` if client is supported
*
* @return bool
*/
public static function hasSupport()
{
return function_exists('wp_remote_request');
}
}