171 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
| <?php
 | |
| namespace IpSupply\ChatMessage\Helper;
 | |
| 
 | |
| use GuzzleHttp\ClientInterface;
 | |
| use Psr\Log\LoggerAwareInterface;
 | |
| use Psr\Log\LoggerAwareTrait;
 | |
| use Psr\Log\LoggerInterface;
 | |
| use Psr\Log\NullLogger;
 | |
| use IpSupply\ChatMessage\Helper\Request\GetEventsParameters;
 | |
| use IpSupply\ChatMessage\Helper\Request\MessageParameters;
 | |
| use IpSupply\ChatMessage\Helper\Request\ParametersInterface;
 | |
| use IpSupply\ChatMessage\Helper\Request\RegisterQueueParameters;
 | |
| use IpSupply\ChatMessage\Helper\Request\RequestInterface;
 | |
| use IpSupply\ChatMessage\Helper\Request\ValidationException;
 | |
| 
 | |
| class Client implements LoggerAwareInterface
 | |
| {
 | |
|     use LoggerAwareTrait;
 | |
| 
 | |
|     /**
 | |
|      * @var ClientInterface
 | |
|      */
 | |
|     private $client;
 | |
|     /**
 | |
|      * @var Authentication
 | |
|      */
 | |
|     private $defaultAuthentication;
 | |
|     /**
 | |
|      * @var string
 | |
|      */
 | |
|     private $serverUrl;
 | |
| 
 | |
|     public function __construct($serverUrl, LoggerInterface $logger = null)
 | |
|     {
 | |
|         $this->setLogger(is_null($logger) ? new NullLogger() : $logger);
 | |
|         $this->serverUrl = $serverUrl;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param Authentication $defaultAuthentication
 | |
|      */
 | |
|     public function setDefaultAuthentication($defaultAuthentication)
 | |
|     {
 | |
|         $this->defaultAuthentication = $defaultAuthentication;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Send message to zulip
 | |
|      *
 | |
|      * @param array|MessageParameters $messageParameters
 | |
|      * @return mixed
 | |
|      * @throws ValidationException
 | |
|      * @throws \Exception
 | |
|      */
 | |
|     public function sendMessage($messageParameters)
 | |
|     {
 | |
|         if (is_array($messageParameters)) {
 | |
|             $messageParameters = new MessageParameters($messageParameters);
 | |
|         }
 | |
| 
 | |
|         if (!$messageParameters instanceof MessageParameters) {
 | |
|             throw new \BadMethodCallException('$messageParameter must be an instance of MessageParameters or an array');
 | |
|         }
 | |
| 
 | |
|         return $this->createRequest('\IpSupply\ChatMessage\Helper\Request\MessageRequest', $messageParameters);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register a queue with zulip
 | |
|      *
 | |
|      * @param $queueParameters
 | |
|      * @return mixed
 | |
|      * @throws ValidationException
 | |
|      * @throws \Exception
 | |
|      */
 | |
|     public function registerQueue($queueParameters)
 | |
|     {
 | |
|         if (is_array($queueParameters)) {
 | |
|             $queueParameters = new RegisterQueueParameters($queueParameters);
 | |
|         }
 | |
| 
 | |
|         if (!$queueParameters instanceof RegisterQueueParameters) {
 | |
|             throw new \BadMethodCallException('$queueParameters must be an instance of RegisterQueueParameters or an array');
 | |
|         }
 | |
| 
 | |
|         return $this->createRequest('\IpSupply\ChatMessage\Helper\Request\RegisterQueueRequest', $queueParameters);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get events for queue
 | |
|      *
 | |
|      * @param $params
 | |
|      * @return mixed
 | |
|      * @throws ValidationException
 | |
|      * @throws \Exception
 | |
|      */
 | |
|     public function getEventsFromQueue($params)
 | |
|     {
 | |
|         if (is_array($params)) {
 | |
|             $params = new GetEventsParameters($params);
 | |
|         }
 | |
| 
 | |
|         if (!$params instanceof GetEventsParameters) {
 | |
|             throw new \BadMethodCallException('$params must be an instance of GetEventsParameters or an array');
 | |
|         }
 | |
| 
 | |
|         return $this->createRequest('\IpSupply\ChatMessage\Helper\Request\GetEventsRequest', $params);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return ClientInterface
 | |
|      */
 | |
|     public function getHttpClient()
 | |
|     {
 | |
|         if (empty($this->client)) {
 | |
|             $this->setHttpClient(new \GuzzleHttp\Client());
 | |
|         }
 | |
| 
 | |
|         return $this->client;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param ClientInterface $client
 | |
|      */
 | |
|     public function setHttpClient($client)
 | |
|     {
 | |
|         $this->client = $client;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param $class
 | |
|      * @param ParametersInterface $parameters
 | |
|      * @return mixed
 | |
|      * @throws ValidationException
 | |
|      * @throws \Exception
 | |
|      */
 | |
|     protected function createRequest($class, ParametersInterface $parameters)
 | |
|     {
 | |
|         $this->logger->info("Sending request type: '" . $class. "", ['params' => $parameters->getData()]);
 | |
| 
 | |
|         $authentication = $parameters->getAuthentication();
 | |
|         if (is_null($authentication)) {
 | |
|             $authentication = $this->defaultAuthentication;
 | |
|         }
 | |
| 
 | |
|         if (!$authentication instanceof Authentication) {
 | |
|             throw new \Exception('Missing authentication');
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             /** @var RequestInterface $request */
 | |
|             $request = new $class($this->getHttpClient());
 | |
|             return $request->initialize($this->serverUrl, $parameters, $authentication);
 | |
|         }catch(ValidationException $e) {
 | |
|             $this->logger->error("Error during validation", [
 | |
|                 'message' => $e->getMessage(),
 | |
|                 'errors'  => $e->getErrors(),
 | |
|                 'params'  => $parameters->getData()
 | |
|             ]);
 | |
| 
 | |
|             throw $e;
 | |
|         }catch(\Exception $e) {
 | |
|             $this->logger->error('Exception occurred', [
 | |
|                 'message' => $e->getMessage(),
 | |
|                 'params'  => $parameters->getData()
 | |
|             ]);
 | |
| 
 | |
|             throw $e;
 | |
|         }
 | |
|     }
 | |
| } |