vendor/mailjet/mailjet-apiv3-php/src/Mailjet/Client.php line 290

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * Copyright (C) 2013 Mailgun
  5.  *
  6.  * This software may be modified and distributed under the terms
  7.  * of the MIT license. See the LICENSE file for details.
  8.  */
  9. namespace Mailjet;
  10. class Client
  11. {
  12.     const WRAPPER_VERSION Config::WRAPPER_VERSION;
  13.     /**
  14.      * connect_timeout: (float, default=2) Float describing the number of
  15.      * seconds to wait while trying to connect to a server. Use 0 to wait
  16.      * indefinitely (the default behavior).
  17.      */
  18.     const CONNECT_TIMEOUT 'connect_timeout';
  19.     /**
  20.      * timeout: (float, default=15) Float describing the timeout of the
  21.      * request in seconds. Use 0 to wait indefinitely (the default behavior).
  22.      */
  23.     const TIMEOUT 'timeout';
  24.     /**
  25.      * proxy: (array, default=none) Array describing the proxy options used by guzzle client
  26.      * See guzzle-http for specification.
  27.      */
  28.     const PROXY 'proxy';
  29.     private $apikey;
  30.     private $apisecret;
  31.     private $apitoken;
  32.     private $version Config::MAIN_VERSION;
  33.     private $url Config::MAIN_URL;
  34.     private $secure Config::SECURED;
  35.     private $call true;
  36.     private $settings = [];
  37.     private $changed false;
  38.     private $requestOptions = [
  39.         self::TIMEOUT => 15,
  40.         self::CONNECT_TIMEOUT => 2,
  41.     ];
  42.     private $smsResources = [
  43.         'send',
  44.         'sms',
  45.         'sms-send',
  46.     ];
  47.     private $dataAction = [
  48.         'csverror/text:csv',
  49.         'csvdata/text:plain',
  50.         'JSONError/application:json/LAST',
  51.     ];
  52.     /**
  53.      * Client constructor requires:.
  54.      *
  55.      * @param string $key Mailjet API Key
  56.      * @param string|null $secret Mailjet API Secret
  57.      * @param bool $call performs the call or not
  58.      * @param array $settings
  59.      */
  60.     public function __construct(string $keystring $secret nullbool $call true, array $settings = [])
  61.     {
  62.         $this->setAuthentication($key$secret$call$settings);
  63.     }
  64.     /**
  65.      * Trigger a POST request.
  66.      *
  67.      * @param array $resource Mailjet Resource/Action pair
  68.      * @param array $args Request arguments
  69.      * @param array $options
  70.      * @return Response
  71.      */
  72.     public function post(array $resource, array $args = [], array $options = []): Response
  73.     {
  74.         if (!empty($options)) {
  75.             $this->setOptions($options$resource);
  76.         }
  77.         $result $this->_call('POST'$resource[0], $resource[1], $args);
  78.         if (!empty($this->changed)) {
  79.             $this->setSettings();
  80.         }
  81.         return $result;
  82.     }
  83.     /**
  84.      * Trigger a GET request.
  85.      *
  86.      * @param array $resource Mailjet Resource/Action pair
  87.      * @param array $args Request arguments
  88.      * @param array $options
  89.      * @return Response
  90.      */
  91.     public function get(array $resource, array $args = [], array $options = []): Response
  92.     {
  93.         if (!empty($options)) {
  94.             $this->setOptions($options$resource);
  95.         }
  96.         $result $this->_call('GET'$resource[0], $resource[1], $args);
  97.         if (!empty($this->changed)) {
  98.             $this->setSettings();
  99.         }
  100.         return $result;
  101.     }
  102.     /**
  103.      * Trigger a POST request.
  104.      *
  105.      * @param array $resource Mailjet Resource/Action pair
  106.      * @param array $args Request arguments
  107.      * @param array $options
  108.      * @return Response
  109.      */
  110.     public function put(array $resource, array $args = [], array $options = []): Response
  111.     {
  112.         if (!empty($options)) {
  113.             $this->setOptions($options$resource);
  114.         }
  115.         $result $this->_call('PUT'$resource[0], $resource[1], $args);
  116.         if (!empty($this->changed)) {
  117.             $this->setSettings();
  118.         }
  119.         return $result;
  120.     }
  121.     /**
  122.      * Trigger a GET request.
  123.      *
  124.      * @param array $resource Mailjet Resource/Action pair
  125.      * @param array $args Request arguments
  126.      * @param array $options
  127.      * @return Response
  128.      */
  129.     public function delete(array $resource, array $args = [], array $options = []): Response
  130.     {
  131.         if (!empty($options)) {
  132.             $this->setOptions($options$resource);
  133.         }
  134.         $result $this->_call('DELETE'$resource[0], $resource[1], $args);
  135.         if (!empty($this->changed)) {
  136.             $this->setSettings();
  137.         }
  138.         return $result;
  139.     }
  140.     /**
  141.      * Sets if we need to use https or http protocol while using API Url.
  142.      *
  143.      * @param bool|mixed $bIsSecured True use https / false use http
  144.      *
  145.      * @return bool true if we set value false otherwise
  146.      */
  147.     public function setSecureProtocol($bIsSecured null): bool
  148.     {
  149.         if (\is_bool($bIsSecured)) {
  150.             $this->secure $bIsSecured;
  151.             return true;
  152.         }
  153.         return false;
  154.     }
  155.     /**
  156.      * Set HTTP request Timeout.
  157.      * @param int $timeout
  158.      */
  159.     public function setTimeout(int $timeout): void
  160.     {
  161.         $this->requestOptions[self::TIMEOUT] = $timeout;
  162.     }
  163.     /**
  164.      * Set HTTP proxy options
  165.      * See: http://docs.guzzlephp.org/en/stable/request-options.html#proxy.
  166.      * @param array $proxyArray
  167.      */
  168.     public function setHttpProxy(array $proxyArray): void
  169.     {
  170.         $this->requestOptions[self::PROXY] = $proxyArray;
  171.     }
  172.     /**
  173.      * Set HTTP connection Timeout.
  174.      * @param int $timeout
  175.      */
  176.     public function setConnectionTimeout(int $timeout): void
  177.     {
  178.         $this->requestOptions[self::CONNECT_TIMEOUT] = $timeout;
  179.     }
  180.     /**
  181.      * Get HTTP request Timeout
  182.      * $return int|null.
  183.      */
  184.     public function getTimeout(): ?int
  185.     {
  186.         return $this->requestOptions[self::TIMEOUT];
  187.     }
  188.     /**
  189.      * Get HTTP connection Timeout
  190.      * $return int|null.
  191.      */
  192.     public function getConnectionTimeout(): ?int
  193.     {
  194.         return $this->requestOptions[self::CONNECT_TIMEOUT];
  195.     }
  196.     /**
  197.      * Add a HTTP request option.
  198.      *
  199.      * @param string $key
  200.      * @param mixed $value
  201.      *                     [IMPORTANT]Default options will be overwritten
  202.      *                     if such option is provided
  203.      *
  204.      * @see \GuzzleHttp\RequestOptions for a list of available request options.
  205.      */
  206.     public function addRequestOption(string $key$value): void
  207.     {
  208.         if ((null !== $key) && (null !== $value)) {
  209.             $this->requestOptions[$key] = $value;
  210.         }
  211.     }
  212.     /**
  213.      * Get HTTP connection options
  214.      * $return array.
  215.      */
  216.     public function getRequestOptions(): array
  217.     {
  218.         return $this->requestOptions;
  219.     }
  220.     /**
  221.      * Set auth.
  222.      *
  223.      * @param string $key
  224.      * @param string|null $secret
  225.      * @param bool $call
  226.      * @param array $settings
  227.      */
  228.     private function setAuthentication(string $key, ?string $secretbool $call, array $settings = []): void
  229.     {
  230.         $isBasicAuth $this->isBasicAuthentication($key$secret);
  231.         if ($isBasicAuth) {
  232.             $this->apikey $key;
  233.             $this->apisecret $secret;
  234.         } else {
  235.             $this->apitoken $key;
  236.             $this->version Config::SMS_VERSION;
  237.         }
  238.         $this->initSettings($call$settings);
  239.         $this->setSettings();
  240.     }
  241.     /**
  242.      * Magic method to call a mailjet resource.
  243.      *
  244.      * @param string $method Http method
  245.      * @param string $resource mailjet resource
  246.      * @param string $action mailjet resource action
  247.      * @param array $args Request arguments
  248.      *
  249.      * @return Response server response
  250.      */
  251.     private function _call(string $methodstring $resourcestring $action, array $args): Response
  252.     {
  253.         $args array_merge([
  254.             'id' => '',
  255.             'actionid' => '',
  256.             'filters' => [],
  257.             'body' => 'GET' === $method null '{}',
  258.         ], array_change_key_case($args));
  259.         $url $this->buildURL($resource$action, (string) $args['id'], $args['actionid']);
  260.         $contentType 'application/json';
  261.         if ('csvdata/text:plain' === $action) {
  262.             $contentType 'text/plain';
  263.         } else if ('csverror/text:csv' === $action) {
  264.             $contentType 'text/csv';
  265.         }
  266.         $isBasicAuth $this->isBasicAuthentication($this->apikey$this->apisecret);
  267.         $auth $isBasicAuth ? [$this->apikey$this->apisecret] : [$this->apitoken];
  268.         $request = new Request(
  269.             $auth,
  270.             $method,
  271.             $url,
  272.             $args['filters'],
  273.             $args['body'],
  274.             $contentType,
  275.             $this->requestOptions
  276.         );
  277.         return $request->call($this->call);
  278.     }
  279.     /**
  280.      * Build the base API url depending on wether user need a secure connection
  281.      * or not.
  282.      *
  283.      * @return string the API url;
  284.      */
  285.     private function getApiUrl(): string
  286.     {
  287.         $h true === $this->secure 'https' 'http';
  288.         return sprintf('%s://%s/%s/'$h$this->url$this->version);
  289.     }
  290.     /**
  291.      * Checks that both parameters are strings, which means
  292.      * that basic authentication will be required.
  293.      *
  294.      * @param mixed $key
  295.      * @param mixed $secret
  296.      * @return bool flag
  297.      */
  298.     private function isBasicAuthentication($key$secret): bool
  299.     {
  300.         return !empty($key) && !empty($secret);
  301.     }
  302.     /**
  303.      * Build the final call url without query strings.
  304.      *
  305.      * @param string $resource Mailjet resource
  306.      * @param string $action Mailjet resource action
  307.      * @param string $id mailjet resource id
  308.      * @param string $actionid mailjet resource actionid
  309.      *
  310.      * @return string final call url
  311.      */
  312.     private function buildURL(string $resourcestring $actionstring $idstring $actionid): string
  313.     {
  314.         $path 'REST';
  315.         if (\in_array($resource$this->smsResourcestrue)) {
  316.             $path '';
  317.         } elseif (\in_array($action$this->dataActiontrue)) {
  318.             $path 'DATA';
  319.         } elseif ('v4' === $this->version) {
  320.             $path '';
  321.         }
  322.         $arrayFilter = [$path$resource$id$action$actionid];
  323.         return $this->getApiUrl().implode('/'array_filter($arrayFilter));
  324.     }
  325.     /**
  326.      * Temporary set the variables generating the url.
  327.      *
  328.      * @param array $options contain temporary modifications for the client
  329.      * @param array $resource may contain the version linked to the resource
  330.      */
  331.     private function setOptions(array $options, array $resource): void
  332.     {
  333.         if (isset($options['version'])) {
  334.             $this->version $options['version'];
  335.         } else if (isset($resource[2])) {
  336.             $this->version $resource[2];
  337.         }
  338.         $this->url = (string)($options['url'] ?? Config::MAIN_URL);
  339.         $this->secure $options['secured'] ?? Config::SECURED;
  340.         $this->call $options['call'] ?? true;
  341.         $this->changed true;
  342.     }
  343.     /**
  344.      * set back the variables generating the url.
  345.      */
  346.     private function setSettings(): void
  347.     {
  348.         if (!empty($this->settings['url']) && \is_string($this->settings['url'])) {
  349.             $this->url $this->settings['url'];
  350.         }
  351.         if (!empty($this->settings['version']) && \is_string($this->settings['version'])) {
  352.             $this->version $this->settings['version'];
  353.         }
  354.         if (isset($this->settings['call']) && \is_bool($this->settings['call'])) {
  355.             $this->call $this->settings['call'];
  356.         }
  357.         if (isset($this->settings['secured']) && \is_bool($this->settings['secured'])) {
  358.             $this->secure $this->settings['secured'];
  359.         }
  360.         $this->changed false;
  361.     }
  362.     /**
  363.      * Set a backup if the variables generating the url are change during a call.
  364.      * @param bool $call
  365.      * @param array $settings
  366.      */
  367.     private function initSettings(bool $call, array $settings = []): void
  368.     {
  369.         $this->settings['url'] = $settings['url'] ?? $this->url;
  370.         $this->settings['version'] = $settings['version'] ?? $this->version;
  371.         $this->settings['call'] = $call;
  372.         $this->settings['secured'] = $settings['secured'] ?? $this->secure;
  373.         $this->changed false;
  374.     }
  375. }