100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |