component skeleton for managing base product schemas, rename Client to TopClient to avoid collisions with PSR-18 clients
This commit is contained in:
parent
12410f5a40
commit
341585c523
21
README.md
21
README.md
@ -16,12 +16,12 @@ Details about those third-party libraries and why you need to install them can b
|
|||||||
2. Instantiate client like that:
|
2. Instantiate client like that:
|
||||||
```php
|
```php
|
||||||
use RetailCrm\Component\AppData;
|
use RetailCrm\Component\AppData;
|
||||||
use RetailCrm\Builder\ClientBuilder;
|
use RetailCrm\Builder\TopClientBuilder;
|
||||||
use RetailCrm\Builder\ContainerBuilder;
|
use RetailCrm\Builder\ContainerBuilder;
|
||||||
use RetailCrm\Component\Authenticator\TokenAuthenticator;
|
use RetailCrm\Component\Authenticator\TokenAuthenticator;
|
||||||
|
|
||||||
$appData = new AppData(AppData::OVERSEAS_ENDPOINT, 'appKey', 'appSecret');
|
$appData = new AppData(AppData::OVERSEAS_ENDPOINT, 'appKey', 'appSecret');
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer(ContainerBuilder::create()->build())
|
->setContainer(ContainerBuilder::create()->build())
|
||||||
->setAppData($appData)
|
->setAppData($appData)
|
||||||
->setAuthenticator(new TokenAuthenticator('session token here'))
|
->setAuthenticator(new TokenAuthenticator('session token here'))
|
||||||
@ -35,12 +35,12 @@ use RetailCrm\Model\Request\Taobao\HttpDnsGetRequest;
|
|||||||
|
|
||||||
$request = new HttpDnsGetRequest();
|
$request = new HttpDnsGetRequest();
|
||||||
```
|
```
|
||||||
4. Send request using `Client::sendRequest` or `Client::sendAuthenticatedRequest` (you can't send authenticated request using client without authenticator). `taobao.httpdns.get` can be sent like this:
|
4. Send request using `TopClient::sendRequest` or `TopClient::sendAuthenticatedRequest` (you can't send authenticated request using client without authenticator). `taobao.httpdns.get` can be sent like this:
|
||||||
```php
|
```php
|
||||||
/** @var \RetailCrm\Model\Response\Taobao\HttpDnsGetResponse $response */
|
/** @var \RetailCrm\Model\Response\Taobao\HttpDnsGetResponse $response */
|
||||||
$response = $client->sendRequest(new HttpDnsGetRequest());
|
$response = $client->sendRequest(new HttpDnsGetRequest());
|
||||||
```
|
```
|
||||||
This particular request doesn't require authorization, so, it can be sent via `Client::sendRequest` method. For any other requests which require authorization you must use `Client::sendAuthenticatedRequest` method (an example of such request would be `aliexpress.solution.seller.category.tree.query`, which class FQN is `\RetailCrm\Model\Request\AliExpress\SolutionSellerCategoryTreeQuery`).
|
This particular request doesn't require authorization, so, it can be sent via `TopClient::sendRequest` method. For any other requests which require authorization you must use `TopClient::sendAuthenticatedRequest` method (an example of such request would be `aliexpress.solution.seller.category.tree.query`, which class FQN is `\RetailCrm\Model\Request\AliExpress\SolutionSellerCategoryTreeQuery`).
|
||||||
|
|
||||||
**Friendly note.** Use response type annotations. Both client methods which returns responses actually returns `ResponseInterface` (not the PSR one). Actual response type will be determined by the request model. Your IDE will not recognize any response options unless you put a proper type annotation for the response variable.
|
**Friendly note.** Use response type annotations. Both client methods which returns responses actually returns `ResponseInterface` (not the PSR one). Actual response type will be determined by the request model. Your IDE will not recognize any response options unless you put a proper type annotation for the response variable.
|
||||||
**Another friendly note.**
|
**Another friendly note.**
|
||||||
@ -49,17 +49,18 @@ This particular request doesn't require authorization, so, it can be sent via `C
|
|||||||
This library uses Container pattern under the hood. You can pass additional dependencies using `ContainerBuilder`. For example:
|
This library uses Container pattern under the hood. You can pass additional dependencies using `ContainerBuilder`. For example:
|
||||||
```php
|
```php
|
||||||
use Http\Client\Curl\Client;
|
use Http\Client\Curl\Client;
|
||||||
use Nyholm\Psr7\Factory\Psr17Factory;
|
|
||||||
use RetailCrm\Component\AppData;
|
use RetailCrm\Component\AppData;
|
||||||
use RetailCrm\Component\Environment;
|
use RetailCrm\Component\Environment;
|
||||||
use RetailCrm\Component\Logger\StdoutLogger;
|
use Nyholm\Psr7\Factory\Psr17Factory;
|
||||||
use RetailCrm\Builder\ClientBuilder;
|
use RetailCrm\Builder\TopClientBuilder;
|
||||||
use RetailCrm\Builder\ContainerBuilder;
|
use RetailCrm\Builder\ContainerBuilder;
|
||||||
|
use RetailCrm\Component\Logger\StdoutLogger;
|
||||||
|
use RetailCrm\Component\Authenticator\TokenAuthenticator;
|
||||||
|
|
||||||
$client = new Client();
|
$client = new Client();
|
||||||
$logger = new StdoutLogger();
|
$logger = new StdoutLogger();
|
||||||
$factory = new Psr17Factory();
|
$factory = new Psr17Factory();
|
||||||
$authenticator = new TokenAuthenticator('appKey', 'token');
|
$authenticator = new TokenAuthenticator('token');
|
||||||
$appData = new AppData(AppData::OVERSEAS_ENDPOINT, 'appKey', 'appSecret');
|
$appData = new AppData(AppData::OVERSEAS_ENDPOINT, 'appKey', 'appSecret');
|
||||||
$container = ContainerBuilder::create()
|
$container = ContainerBuilder::create()
|
||||||
->setEnv(Environment::TEST)
|
->setEnv(Environment::TEST)
|
||||||
@ -69,11 +70,11 @@ $container = ContainerBuilder::create()
|
|||||||
->setRequestFactory($factory)
|
->setRequestFactory($factory)
|
||||||
->setUriFactory($factory)
|
->setUriFactory($factory)
|
||||||
->build();
|
->build();
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($container)
|
->setContainer($container)
|
||||||
->setAppData($appData)
|
->setAppData($appData)
|
||||||
->build();
|
->build();
|
||||||
```
|
```
|
||||||
Logger should implement `Psr\Log\LoggerInterface` (PSR-3), HTTP client should implement `Psr\Http\Client\ClientInterface` (PSR-18), HTTP objects must be compliant to PSR-7.
|
Logger should implement `Psr\Log\LoggerInterface` (PSR-3), HTTP client should implement `Psr\Http\TopClient\TopClientInterface` (PSR-18), HTTP objects must be compliant to PSR-7.
|
||||||
|
|
||||||
You can use your own container - it must be compliant to PSR-11. This is strongly discouraged because it'll be much easier to just integrate library with your own application, and your own DI system.
|
You can use your own container - it must be compliant to PSR-11. This is strongly discouraged because it'll be much easier to just integrate library with your own application, and your own DI system.
|
||||||
|
@ -20,19 +20,11 @@
|
|||||||
<rule ref="rulesets/codesize.xml">
|
<rule ref="rulesets/codesize.xml">
|
||||||
<exclude name="TooManyPublicMethods" />
|
<exclude name="TooManyPublicMethods" />
|
||||||
</rule>
|
</rule>
|
||||||
<rule ref="rulesets/design.xml">
|
|
||||||
<exclude name="CouplingBetweenObjects" />
|
|
||||||
</rule>
|
|
||||||
<rule ref="rulesets/codesize.xml/TooManyPublicMethods">
|
<rule ref="rulesets/codesize.xml/TooManyPublicMethods">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="maxmethods" value="15" />
|
<property name="maxmethods" value="15" />
|
||||||
</properties>
|
</properties>
|
||||||
</rule>
|
</rule>
|
||||||
<rule ref="rulesets/design.xml/CouplingBetweenObjects">
|
|
||||||
<properties>
|
|
||||||
<property name="maximum" value="20" />
|
|
||||||
</properties>
|
|
||||||
</rule>
|
|
||||||
<rule ref="rulesets/naming.xml/ShortVariable">
|
<rule ref="rulesets/naming.xml/ShortVariable">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="minimum" value="2" />
|
<property name="minimum" value="2" />
|
||||||
|
@ -28,6 +28,7 @@ use RetailCrm\Component\DependencyInjection\Container;
|
|||||||
use RetailCrm\Component\Environment;
|
use RetailCrm\Component\Environment;
|
||||||
use RetailCrm\Component\ServiceLocator;
|
use RetailCrm\Component\ServiceLocator;
|
||||||
use RetailCrm\Factory\FileItemFactory;
|
use RetailCrm\Factory\FileItemFactory;
|
||||||
|
use RetailCrm\Factory\ProductSchemaStorageFactory;
|
||||||
use RetailCrm\Factory\SerializerFactory;
|
use RetailCrm\Factory\SerializerFactory;
|
||||||
use RetailCrm\Factory\TopRequestFactory;
|
use RetailCrm\Factory\TopRequestFactory;
|
||||||
use RetailCrm\Interfaces\BuilderInterface;
|
use RetailCrm\Interfaces\BuilderInterface;
|
||||||
@ -223,6 +224,9 @@ class ContainerBuilder implements BuilderInterface
|
|||||||
$container->set(FileItemFactoryInterface::class, function (ContainerInterface $container) {
|
$container->set(FileItemFactoryInterface::class, function (ContainerInterface $container) {
|
||||||
return new FileItemFactory($container->get(StreamFactoryInterface::class));
|
return new FileItemFactory($container->get(StreamFactoryInterface::class));
|
||||||
});
|
});
|
||||||
|
$container->set(ProductSchemaStorageFactory::class, function (ContainerInterface $container) {
|
||||||
|
return new ProductSchemaStorageFactory($container->get(Constants::CACHE));
|
||||||
|
});
|
||||||
$container->set(RequestDataFilter::class, new RequestDataFilter());
|
$container->set(RequestDataFilter::class, new RequestDataFilter());
|
||||||
$container->set(RequestSignerInterface::class, function (ContainerInterface $container) {
|
$container->set(RequestSignerInterface::class, function (ContainerInterface $container) {
|
||||||
return new RequestSigner(
|
return new RequestSigner(
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* PHP version 7.3
|
* PHP version 7.3
|
||||||
*
|
*
|
||||||
* @category ClientBuilder
|
* @category TopClientBuilder
|
||||||
* @package RetailCrm\Builder
|
* @package RetailCrm\Builder
|
||||||
* @author RetailCRM <integration@retailcrm.ru>
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
* @license MIT https://mit-license.org
|
* @license MIT https://mit-license.org
|
||||||
@ -14,26 +14,28 @@ namespace RetailCrm\Builder;
|
|||||||
|
|
||||||
use RetailCrm\Component\Constants;
|
use RetailCrm\Component\Constants;
|
||||||
use RetailCrm\Component\ServiceLocator;
|
use RetailCrm\Component\ServiceLocator;
|
||||||
|
use RetailCrm\Component\Storage\ProductSchemaStorage;
|
||||||
|
use RetailCrm\Factory\ProductSchemaStorageFactory;
|
||||||
use RetailCrm\Interfaces\AppDataInterface;
|
use RetailCrm\Interfaces\AppDataInterface;
|
||||||
use RetailCrm\Interfaces\AuthenticatorInterface;
|
use RetailCrm\Interfaces\AuthenticatorInterface;
|
||||||
use RetailCrm\Interfaces\BuilderInterface;
|
use RetailCrm\Interfaces\BuilderInterface;
|
||||||
use RetailCrm\Interfaces\ContainerAwareInterface;
|
use RetailCrm\Interfaces\ContainerAwareInterface;
|
||||||
use RetailCrm\Interfaces\TopRequestFactoryInterface;
|
use RetailCrm\Interfaces\TopRequestFactoryInterface;
|
||||||
use RetailCrm\Interfaces\TopRequestProcessorInterface;
|
use RetailCrm\Interfaces\TopRequestProcessorInterface;
|
||||||
use RetailCrm\TopClient\Client;
|
use RetailCrm\TopClient\TopClient;
|
||||||
use RetailCrm\Traits\ContainerAwareTrait;
|
use RetailCrm\Traits\ContainerAwareTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ClientBuilder
|
* Class TopClientBuilder
|
||||||
*
|
*
|
||||||
* @category ClientBuilder
|
* @category TopClientBuilder
|
||||||
* @package RetailCrm\Builder
|
* @package RetailCrm\Builder
|
||||||
* @author RetailDriver LLC <integration@retailcrm.ru>
|
* @author RetailDriver LLC <integration@retailcrm.ru>
|
||||||
* @license MIT https://mit-license.org
|
* @license MIT https://mit-license.org
|
||||||
* @link http://retailcrm.ru
|
* @link http://retailcrm.ru
|
||||||
* @see https://help.retailcrm.ru
|
* @see https://help.retailcrm.ru
|
||||||
*/
|
*/
|
||||||
class ClientBuilder implements ContainerAwareInterface, BuilderInterface
|
class TopClientBuilder implements ContainerAwareInterface, BuilderInterface
|
||||||
{
|
{
|
||||||
use ContainerAwareTrait;
|
use ContainerAwareTrait;
|
||||||
|
|
||||||
@ -54,9 +56,9 @@ class ClientBuilder implements ContainerAwareInterface, BuilderInterface
|
|||||||
/**
|
/**
|
||||||
* @param \RetailCrm\Interfaces\AppDataInterface $appData
|
* @param \RetailCrm\Interfaces\AppDataInterface $appData
|
||||||
*
|
*
|
||||||
* @return ClientBuilder
|
* @return TopClientBuilder
|
||||||
*/
|
*/
|
||||||
public function setAppData(AppDataInterface $appData): ClientBuilder
|
public function setAppData(AppDataInterface $appData): TopClientBuilder
|
||||||
{
|
{
|
||||||
$this->appData = $appData;
|
$this->appData = $appData;
|
||||||
return $this;
|
return $this;
|
||||||
@ -65,27 +67,28 @@ class ClientBuilder implements ContainerAwareInterface, BuilderInterface
|
|||||||
/**
|
/**
|
||||||
* @param \RetailCrm\Interfaces\AuthenticatorInterface $authenticator
|
* @param \RetailCrm\Interfaces\AuthenticatorInterface $authenticator
|
||||||
*
|
*
|
||||||
* @return ClientBuilder
|
* @return TopClientBuilder
|
||||||
*/
|
*/
|
||||||
public function setAuthenticator(AuthenticatorInterface $authenticator): ClientBuilder
|
public function setAuthenticator(AuthenticatorInterface $authenticator): TopClientBuilder
|
||||||
{
|
{
|
||||||
$this->authenticator = $authenticator;
|
$this->authenticator = $authenticator;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return \RetailCrm\TopClient\Client
|
* @return \RetailCrm\TopClient\TopClient
|
||||||
* @throws \RetailCrm\Component\Exception\ValidationException
|
* @throws \RetailCrm\Component\Exception\ValidationException
|
||||||
*/
|
*/
|
||||||
public function build(): Client
|
public function build(): TopClient
|
||||||
{
|
{
|
||||||
$client = new Client($this->appData);
|
$client = new TopClient($this->appData);
|
||||||
$client->setHttpClient($this->container->get(Constants::HTTP_CLIENT));
|
$client->setHttpClient($this->container->get(Constants::HTTP_CLIENT));
|
||||||
$client->setSerializer($this->container->get(Constants::SERIALIZER));
|
$client->setSerializer($this->container->get(Constants::SERIALIZER));
|
||||||
$client->setValidator($this->container->get(Constants::VALIDATOR));
|
$client->setValidator($this->container->get(Constants::VALIDATOR));
|
||||||
$client->setRequestFactory($this->container->get(TopRequestFactoryInterface::class));
|
$client->setRequestFactory($this->container->get(TopRequestFactoryInterface::class));
|
||||||
$client->setServiceLocator($this->container->get(ServiceLocator::class));
|
$client->setServiceLocator($this->container->get(ServiceLocator::class));
|
||||||
$client->setProcessor($this->container->get(TopRequestProcessorInterface::class));
|
$client->setProcessor($this->container->get(TopRequestProcessorInterface::class));
|
||||||
|
$client->setProductSchemaStorageFactory($this->container->get(ProductSchemaStorageFactory::class));
|
||||||
|
|
||||||
if (null !== $this->authenticator) {
|
if (null !== $this->authenticator) {
|
||||||
$client->setAuthenticator($this->authenticator);
|
$client->setAuthenticator($this->authenticator);
|
59
src/Component/Storage/ProductSchemaStorage.php
Normal file
59
src/Component/Storage/ProductSchemaStorage.php
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHP version 7.3
|
||||||
|
*
|
||||||
|
* @category ProductSchemaStorage
|
||||||
|
* @package RetailCrm\Component\Storage
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license http://retailcrm.ru Proprietary
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace RetailCrm\Component\Storage;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
use RetailCrm\Interfaces\TopClientInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ProductSchemaStorage
|
||||||
|
*
|
||||||
|
* @category ProductSchemaStorage
|
||||||
|
* @package RetailCrm\Component\Storage
|
||||||
|
* @author RetailDriver LLC <integration@retailcrm.ru>
|
||||||
|
* @license https://retailcrm.ru Proprietary
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see https://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
class ProductSchemaStorage
|
||||||
|
{
|
||||||
|
/** @var TopClientInterface */
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
/** @var CacheItemPoolInterface $cache */
|
||||||
|
private $cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ProductSchemaStorage constructor.
|
||||||
|
*
|
||||||
|
* @param \RetailCrm\Interfaces\TopClientInterface $client
|
||||||
|
* @param \Psr\Cache\CacheItemPoolInterface $cache
|
||||||
|
*/
|
||||||
|
public function __construct(TopClientInterface $client, CacheItemPoolInterface $cache)
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
$this->cache = $cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns product schema (updates it automatically if it's TTL has expired)
|
||||||
|
*
|
||||||
|
* @param int $ttl in seconds
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getProductSchema(int $ttl = 86400): string
|
||||||
|
{
|
||||||
|
// TODO: Implement product schema fetching and refreshing.
|
||||||
|
}
|
||||||
|
}
|
66
src/Factory/ProductSchemaStorageFactory.php
Normal file
66
src/Factory/ProductSchemaStorageFactory.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHP version 7.3
|
||||||
|
*
|
||||||
|
* @category ProductSchemaStorageFactory
|
||||||
|
* @package RetailCrm\Factory
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license http://retailcrm.ru Proprietary
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace RetailCrm\Factory;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
use RetailCrm\Component\Storage\ProductSchemaStorage;
|
||||||
|
use RetailCrm\Interfaces\FactoryInterface;
|
||||||
|
use RetailCrm\Interfaces\TopClientInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ProductSchemaStorageFactory
|
||||||
|
*
|
||||||
|
* @category ProductSchemaStorageFactory
|
||||||
|
* @package RetailCrm\Factory
|
||||||
|
* @author RetailDriver LLC <integration@retailcrm.ru>
|
||||||
|
* @license https://retailcrm.ru Proprietary
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see https://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
class ProductSchemaStorageFactory implements FactoryInterface
|
||||||
|
{
|
||||||
|
/** @var CacheItemPoolInterface $cache */
|
||||||
|
private $cache;
|
||||||
|
|
||||||
|
/** @var TopClientInterface $client */
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ProductSchemaStorageFactory constructor.
|
||||||
|
*
|
||||||
|
* @param \Psr\Cache\CacheItemPoolInterface $cache
|
||||||
|
*/
|
||||||
|
public function __construct(CacheItemPoolInterface $cache)
|
||||||
|
{
|
||||||
|
$this->cache = $cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \RetailCrm\Interfaces\TopClientInterface $client
|
||||||
|
*
|
||||||
|
* @return ProductSchemaStorageFactory
|
||||||
|
*/
|
||||||
|
public function setClient(TopClientInterface $client): ProductSchemaStorageFactory
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return new ProductSchemaStorage($this->client, $this->cache);
|
||||||
|
}
|
||||||
|
}
|
80
src/Interfaces/TopClientInterface.php
Normal file
80
src/Interfaces/TopClientInterface.php
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP version 7.3
|
||||||
|
*
|
||||||
|
* @category TopClientInterface
|
||||||
|
* @package RetailCrm\Interfaces
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license MIT https://mit-license.org
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
namespace RetailCrm\Interfaces;
|
||||||
|
|
||||||
|
use RetailCrm\Component\ServiceLocator;
|
||||||
|
use RetailCrm\Model\Request\BaseRequest;
|
||||||
|
use RetailCrm\Model\Response\TopResponseInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TopClientInterface
|
||||||
|
*
|
||||||
|
* @category ContainerBuilder
|
||||||
|
* @package RetailCrm\Interfaces
|
||||||
|
* @author RetailDriver LLC <integration@retailcrm.ru>
|
||||||
|
* @license MIT https://mit-license.org
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see https://help.retailcrm.ru
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
interface TopClientInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param \RetailCrm\Interfaces\AuthenticatorInterface $authenticator
|
||||||
|
*
|
||||||
|
* @return TopClientInterface
|
||||||
|
*/
|
||||||
|
public function setAuthenticator(AuthenticatorInterface $authenticator);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \RetailCrm\Component\ServiceLocator
|
||||||
|
*/
|
||||||
|
public function getServiceLocator(): ServiceLocator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $withState
|
||||||
|
*
|
||||||
|
* @return BuilderInterface
|
||||||
|
*
|
||||||
|
* $withState is passed to AuthorizationUriBuilder.
|
||||||
|
* @see AuthorizationUriBuilder::__construct
|
||||||
|
* @SuppressWarnings(PHPMD.BooleanArgumentFlag)
|
||||||
|
*/
|
||||||
|
public function getAuthorizationUriBuilder(bool $withState = false): BuilderInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send TOP request
|
||||||
|
*
|
||||||
|
* @param \RetailCrm\Model\Request\BaseRequest $request
|
||||||
|
*
|
||||||
|
* @return TopResponseInterface
|
||||||
|
* @throws \RetailCrm\Component\Exception\ValidationException
|
||||||
|
* @throws \RetailCrm\Component\Exception\FactoryException
|
||||||
|
* @throws \RetailCrm\Component\Exception\TopClientException
|
||||||
|
* @throws \RetailCrm\Component\Exception\TopApiException
|
||||||
|
*/
|
||||||
|
public function sendRequest(BaseRequest $request): TopResponseInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send authenticated TOP request
|
||||||
|
*
|
||||||
|
* @param \RetailCrm\Model\Request\BaseRequest $request
|
||||||
|
*
|
||||||
|
* @return \RetailCrm\Model\Response\TopResponseInterface
|
||||||
|
* @throws \RetailCrm\Component\Exception\FactoryException
|
||||||
|
* @throws \RetailCrm\Component\Exception\TopApiException
|
||||||
|
* @throws \RetailCrm\Component\Exception\TopClientException
|
||||||
|
* @throws \RetailCrm\Component\Exception\ValidationException
|
||||||
|
*/
|
||||||
|
public function sendAuthenticatedRequest(BaseRequest $request): TopResponseInterface;
|
||||||
|
}
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* PHP version 7.3
|
* PHP version 7.3
|
||||||
*
|
*
|
||||||
* @category Client
|
* @category TopClient
|
||||||
* @package RetailCrm\TopClient
|
* @package RetailCrm\TopClient
|
||||||
* @author RetailCRM <integration@retailcrm.ru>
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
* @license MIT https://mit-license.org
|
* @license MIT https://mit-license.org
|
||||||
@ -12,9 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
namespace RetailCrm\TopClient;
|
namespace RetailCrm\TopClient;
|
||||||
|
|
||||||
use DateTime;
|
|
||||||
use JMS\Serializer\SerializerInterface;
|
use JMS\Serializer\SerializerInterface;
|
||||||
use Psr\Cache\CacheItemPoolInterface;
|
|
||||||
use Psr\Http\Client\ClientExceptionInterface;
|
use Psr\Http\Client\ClientExceptionInterface;
|
||||||
use Psr\Http\Client\ClientInterface;
|
use Psr\Http\Client\ClientInterface;
|
||||||
use Psr\Http\Message\StreamInterface;
|
use Psr\Http\Message\StreamInterface;
|
||||||
@ -22,8 +20,12 @@ use RetailCrm\Builder\AuthorizationUriBuilder;
|
|||||||
use RetailCrm\Component\Exception\TopApiException;
|
use RetailCrm\Component\Exception\TopApiException;
|
||||||
use RetailCrm\Component\Exception\TopClientException;
|
use RetailCrm\Component\Exception\TopClientException;
|
||||||
use RetailCrm\Component\ServiceLocator;
|
use RetailCrm\Component\ServiceLocator;
|
||||||
|
use RetailCrm\Component\Storage\ProductSchemaStorage;
|
||||||
|
use RetailCrm\Factory\ProductSchemaStorageFactory;
|
||||||
use RetailCrm\Interfaces\AppDataInterface;
|
use RetailCrm\Interfaces\AppDataInterface;
|
||||||
use RetailCrm\Interfaces\AuthenticatorInterface;
|
use RetailCrm\Interfaces\AuthenticatorInterface;
|
||||||
|
use RetailCrm\Interfaces\BuilderInterface;
|
||||||
|
use RetailCrm\Interfaces\TopClientInterface;
|
||||||
use RetailCrm\Interfaces\TopRequestFactoryInterface;
|
use RetailCrm\Interfaces\TopRequestFactoryInterface;
|
||||||
use RetailCrm\Interfaces\TopRequestProcessorInterface;
|
use RetailCrm\Interfaces\TopRequestProcessorInterface;
|
||||||
use RetailCrm\Model\Request\BaseRequest;
|
use RetailCrm\Model\Request\BaseRequest;
|
||||||
@ -33,16 +35,17 @@ use RetailCrm\Traits\ValidatorAwareTrait;
|
|||||||
use Symfony\Component\Validator\Constraints as Assert;
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Client
|
* Class TopClient
|
||||||
*
|
*
|
||||||
* @category Client
|
* @category TopClient
|
||||||
* @package RetailCrm\TopClient
|
* @package RetailCrm\TopClient
|
||||||
* @author RetailDriver LLC <integration@retailcrm.ru>
|
* @author RetailDriver LLC <integration@retailcrm.ru>
|
||||||
* @license MIT https://mit-license.org
|
* @license MIT https://mit-license.org
|
||||||
* @link http://retailcrm.ru
|
* @link http://retailcrm.ru
|
||||||
* @see https://help.retailcrm.ru
|
* @see https://help.retailcrm.ru
|
||||||
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
||||||
*/
|
*/
|
||||||
class Client
|
class TopClient implements TopClientInterface
|
||||||
{
|
{
|
||||||
use ValidatorAwareTrait;
|
use ValidatorAwareTrait;
|
||||||
|
|
||||||
@ -90,7 +93,12 @@ class Client
|
|||||||
protected $authenticator;
|
protected $authenticator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client constructor.
|
* @var ProductSchemaStorageFactory $productSchemaStorageFactory
|
||||||
|
*/
|
||||||
|
protected $productSchemaStorageFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TopClient constructor.
|
||||||
*
|
*
|
||||||
* @param \RetailCrm\Interfaces\AppDataInterface $appData
|
* @param \RetailCrm\Interfaces\AppDataInterface $appData
|
||||||
*/
|
*/
|
||||||
@ -142,9 +150,9 @@ class Client
|
|||||||
/**
|
/**
|
||||||
* @param \RetailCrm\Interfaces\TopRequestProcessorInterface $processor
|
* @param \RetailCrm\Interfaces\TopRequestProcessorInterface $processor
|
||||||
*
|
*
|
||||||
* @return Client
|
* @return TopClient
|
||||||
*/
|
*/
|
||||||
public function setProcessor(TopRequestProcessorInterface $processor): Client
|
public function setProcessor(TopRequestProcessorInterface $processor): TopClient
|
||||||
{
|
{
|
||||||
$this->processor = $processor;
|
$this->processor = $processor;
|
||||||
return $this;
|
return $this;
|
||||||
@ -153,14 +161,25 @@ class Client
|
|||||||
/**
|
/**
|
||||||
* @param \RetailCrm\Interfaces\AuthenticatorInterface $authenticator
|
* @param \RetailCrm\Interfaces\AuthenticatorInterface $authenticator
|
||||||
*
|
*
|
||||||
* @return Client
|
* @return TopClient
|
||||||
*/
|
*/
|
||||||
public function setAuthenticator(AuthenticatorInterface $authenticator): Client
|
public function setAuthenticator(AuthenticatorInterface $authenticator): TopClient
|
||||||
{
|
{
|
||||||
$this->authenticator = $authenticator;
|
$this->authenticator = $authenticator;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \RetailCrm\Factory\ProductSchemaStorageFactory $productSchemaStorageFactory
|
||||||
|
*
|
||||||
|
* @return TopClient
|
||||||
|
*/
|
||||||
|
public function setProductSchemaStorageFactory(ProductSchemaStorageFactory $productSchemaStorageFactory): TopClient
|
||||||
|
{
|
||||||
|
$this->productSchemaStorageFactory = $productSchemaStorageFactory;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return \RetailCrm\Component\ServiceLocator
|
* @return \RetailCrm\Component\ServiceLocator
|
||||||
*/
|
*/
|
||||||
@ -172,16 +191,23 @@ class Client
|
|||||||
/**
|
/**
|
||||||
* @param bool $withState
|
* @param bool $withState
|
||||||
*
|
*
|
||||||
* @return string
|
* @return BuilderInterface
|
||||||
*
|
*
|
||||||
* $withState is passed to AuthorizationUriBuilder.
|
* $withState is passed to AuthorizationUriBuilder.
|
||||||
* @see AuthorizationUriBuilder::__construct
|
* @see AuthorizationUriBuilder::__construct
|
||||||
* @SuppressWarnings(PHPMD.BooleanArgumentFlag)
|
* @SuppressWarnings(PHPMD.BooleanArgumentFlag)
|
||||||
*/
|
*/
|
||||||
public function getAuthorizationUri(bool $withState = false): string
|
public function getAuthorizationUriBuilder(bool $withState = false): BuilderInterface
|
||||||
{
|
{
|
||||||
$builder = new AuthorizationUriBuilder($this->appData->getAppKey(), $this->appData->getAppSecret(), $withState);
|
return new AuthorizationUriBuilder($this->appData->getAppKey(), $this->appData->getAppSecret(), $withState);
|
||||||
return $builder->build();
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \RetailCrm\Component\Storage\ProductSchemaStorage
|
||||||
|
*/
|
||||||
|
public function getProductSchemaStorage(): ProductSchemaStorage
|
||||||
|
{
|
||||||
|
return $this->productSchemaStorageFactory->setClient($this)->create();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -198,7 +224,7 @@ class Client
|
|||||||
public function sendRequest(BaseRequest $request): TopResponseInterface
|
public function sendRequest(BaseRequest $request): TopResponseInterface
|
||||||
{
|
{
|
||||||
if ('json' !== $request->format) {
|
if ('json' !== $request->format) {
|
||||||
throw new TopClientException(sprintf('Client only supports JSON mode, got `%s` mode', $request->format));
|
throw new TopClientException(sprintf('TopClient only supports JSON mode, got `%s` mode', $request->format));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->processor->process($request, $this->appData);
|
$this->processor->process($request, $this->appData);
|
@ -14,9 +14,9 @@ namespace RetailCrm\Tests\Builder;
|
|||||||
|
|
||||||
use RetailCrm\Component\AppData;
|
use RetailCrm\Component\AppData;
|
||||||
use RetailCrm\Component\ServiceLocator;
|
use RetailCrm\Component\ServiceLocator;
|
||||||
use RetailCrm\Builder\ClientBuilder;
|
use RetailCrm\Builder\TopClientBuilder;
|
||||||
use RetailCrm\Test\TestCase;
|
use RetailCrm\Test\TestCase;
|
||||||
use RetailCrm\TopClient\Client;
|
use RetailCrm\TopClient\TopClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ClientBuilderTest
|
* Class ClientBuilderTest
|
||||||
@ -32,12 +32,12 @@ class ClientBuilderTest extends TestCase
|
|||||||
{
|
{
|
||||||
public function testCreateClient()
|
public function testCreateClient()
|
||||||
{
|
{
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer())
|
->setContainer($this->getContainer())
|
||||||
->setAppData(new AppData(AppData::OVERSEAS_ENDPOINT, 'appKey', 'helloworld'))
|
->setAppData(new AppData(AppData::OVERSEAS_ENDPOINT, 'appKey', 'helloworld'))
|
||||||
->build();
|
->build();
|
||||||
|
|
||||||
self::assertInstanceOf(Client::class, $client);
|
self::assertInstanceOf(TopClient::class, $client);
|
||||||
self::assertInstanceOf(ServiceLocator::class, $client->getServiceLocator());
|
self::assertInstanceOf(ServiceLocator::class, $client->getServiceLocator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ namespace RetailCrm\Tests\TopClient;
|
|||||||
|
|
||||||
use Http\Message\RequestMatcher\CallbackRequestMatcher;
|
use Http\Message\RequestMatcher\CallbackRequestMatcher;
|
||||||
use Psr\Http\Message\RequestInterface;
|
use Psr\Http\Message\RequestInterface;
|
||||||
use RetailCrm\Builder\ClientBuilder;
|
use RetailCrm\Builder\TopClientBuilder;
|
||||||
use RetailCrm\Model\Entity\CategoryInfo;
|
use RetailCrm\Model\Entity\CategoryInfo;
|
||||||
use RetailCrm\Model\Enum\FeedOperationTypes;
|
use RetailCrm\Model\Enum\FeedOperationTypes;
|
||||||
use RetailCrm\Model\Enum\FeedStatuses;
|
use RetailCrm\Model\Enum\FeedStatuses;
|
||||||
@ -66,7 +66,7 @@ class ClientTest extends TestCase
|
|||||||
return true;
|
return true;
|
||||||
}), $this->responseJson(400, $errorResponse));
|
}), $this->responseJson(400, $errorResponse));
|
||||||
|
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mockClient))
|
->setContainer($this->getContainer($mockClient))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->build();
|
->build();
|
||||||
@ -78,7 +78,7 @@ class ClientTest extends TestCase
|
|||||||
|
|
||||||
public function testClientRequestXmlUnsupported()
|
public function testClientRequestXmlUnsupported()
|
||||||
{
|
{
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer(self::getMockClient()))
|
->setContainer($this->getContainer(self::getMockClient()))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->build();
|
->build();
|
||||||
@ -86,7 +86,7 @@ class ClientTest extends TestCase
|
|||||||
$request = new HttpDnsGetRequest();
|
$request = new HttpDnsGetRequest();
|
||||||
$request->format = 'xml';
|
$request->format = 'xml';
|
||||||
|
|
||||||
$this->expectExceptionMessage('Client only supports JSON mode, got `xml` mode');
|
$this->expectExceptionMessage('TopClient only supports JSON mode, got `xml` mode');
|
||||||
$client->sendRequest($request);
|
$client->sendRequest($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
@ -200,7 +200,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
@ -253,7 +253,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
@ -296,7 +296,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
@ -347,7 +347,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
@ -404,7 +404,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
@ -451,7 +451,7 @@ EOF;
|
|||||||
]),
|
]),
|
||||||
$this->responseJson(200, $json)
|
$this->responseJson(200, $json)
|
||||||
);
|
);
|
||||||
$client = ClientBuilder::create()
|
$client = TopClientBuilder::create()
|
||||||
->setContainer($this->getContainer($mock))
|
->setContainer($this->getContainer($mock))
|
||||||
->setAppData($this->getEnvAppData())
|
->setAppData($this->getEnvAppData())
|
||||||
->setAuthenticator($this->getEnvTokenAuthenticator())
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
|
Loading…
Reference in New Issue
Block a user