Multiple fixes
* Implemented ScriptRunner with environment expansion and cleaner code. * Added ApiClient plugin (com.noccy.apiclient) * Renamed CHANGELOG.md to VERSIONS.md * Shuffled buildtools * Added first unittests
This commit is contained in:
100
plugins/com.noccy.apiclient/Request/RequestBuilder.php
Normal file
100
plugins/com.noccy.apiclient/Request/RequestBuilder.php
Normal file
@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
namespace SparkPlug\Com\Noccy\ApiClient\Request;
|
||||
|
||||
use SparkPlug\Com\Noccy\ApiClient\Api\Catalog;
|
||||
use SparkPlug\Com\Noccy\ApiClient\Api\Method;
|
||||
use SparkPlug\Com\Noccy\ApiClient\Api\Profile;
|
||||
|
||||
class RequestBuilder
|
||||
{
|
||||
public static $Protocols = [
|
||||
'http' => HttpRequest::class,
|
||||
'websocket' => WebSocketRequest::class,
|
||||
'jsonrpc' => JsonRpcRequest::class,
|
||||
];
|
||||
|
||||
private ?Catalog $catalog = null;
|
||||
|
||||
private ?Method $method = null;
|
||||
|
||||
private ?Profile $profile = null;
|
||||
|
||||
private array $props = [];
|
||||
|
||||
public function setCatalog(?Catalog $catalog)
|
||||
{
|
||||
$this->catalog = $catalog;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setMethod(?Method $method)
|
||||
{
|
||||
$this->method = $method;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setProfile(?Profile $profile)
|
||||
{
|
||||
$this->profile = $profile;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setProperties(array $properties)
|
||||
{
|
||||
$this->props = $properties;
|
||||
}
|
||||
|
||||
public function addProperties(array $properties)
|
||||
{
|
||||
$this->props = array_merge(
|
||||
$this->props,
|
||||
$properties
|
||||
);
|
||||
}
|
||||
|
||||
private function buildProperties()
|
||||
{
|
||||
$props = [];
|
||||
if ($this->catalog) {
|
||||
$add = $this->catalog->getProperties();
|
||||
$props = array_merge($props, $add);
|
||||
}
|
||||
if ($this->method) {
|
||||
$add = $this->method->getProperties();
|
||||
$props = array_merge($props, $add);
|
||||
}
|
||||
if ($this->profile) {
|
||||
$add = $this->profile->getProperties();
|
||||
$props = array_merge($props, $add);
|
||||
}
|
||||
$props = array_merge($props, $this->props);
|
||||
$props = array_filter($props);
|
||||
return $props;
|
||||
}
|
||||
|
||||
public function getCalculatedProperty(string $name)
|
||||
{
|
||||
$props = $this->buildProperties();
|
||||
return $props[$name] ?? null;
|
||||
}
|
||||
|
||||
public function getRequest(): Request
|
||||
{
|
||||
$props = $this->buildProperties();
|
||||
$protocol = $props['protocol']??'http';
|
||||
|
||||
if (!$handler = self::$Protocols[$protocol]??null) {
|
||||
throw new \Exception("Invalid protocol for request: {$protocol}");
|
||||
}
|
||||
|
||||
$base = $props['urlbase']??null;
|
||||
$url = $props['url']??null;
|
||||
if ($base) {
|
||||
$props['url'] = $base . $url;
|
||||
}
|
||||
|
||||
$request = new $handler($props);
|
||||
return $request;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user