Skip to content

Commit

Permalink
Merge pull request #33 from answear/Multiple-configurations
Browse files Browse the repository at this point in the history
Multiple configurations
  • Loading branch information
lukasz-falda authored Feb 16, 2021
2 parents 3e5e609 + 1b16b8b commit 36e4fa9
Show file tree
Hide file tree
Showing 13 changed files with 458 additions and 58 deletions.
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
v2.x
===================
* 2.0.0
* [BC BREAK] change default connection timeout from 10s to 4s, request timeout from 10s to 8s
* [BC BREAK] change bundle configuration:

from
```php
answear_luigis_box:
publicKey: 'public'
privateKey: 'private'
```
to
```php
answear_luigis_box:
configs:
your_config_name:
publicKey: 'public'
privateKey: 'private'
```
See [README](README.md) for more details.

v1.x
===================
* 1.4.0
* [BC BREAK] remove casting bool values in url filters.

* 1.3.0
* (feature) Update by query
Expand Down
31 changes: 25 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,33 @@ composer require answear/luigis-box-bundle
```yaml
# config/packages/answear_luigis_box.yaml
answear_luigis_box:
host: 'https://live.luigisbox.com' #default
publicKey: 'your_public_key'
privateKey: 'your_private_key'
connectionTimeout: 10.0 #default
requestTimeout: 10.0 #default
default_config: second_config_name
configs:
your_config_name:
host: 'https://live.luigisbox.com' #default
publicKey: 'your_public_key'
privateKey: 'your_private_key'
connectionTimeout: 4.0 #default
requestTimeout: 8.0 #default
second_config_name:
publicKey: 'your_public_key'
privateKey: 'your_private_key'
```
config will be passed to `\Answear\LuigisBoxBundle\Service\ConfigProvider` class.
If you have only one config you can omit `default_config` node.
Configs will be passed to `\Answear\LuigisBoxBundle\Service\ConfigProvider` class.

If you have more configurations you can change them as follows

```php
use Answear\LuigisBoxBundle\Service\ConfigProvider;
/** @var ConfigProvider $configProvider **/
$configProvider->setConfig('your_config_name');
```

and use application as before.

## Usage

Expand Down
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
"phpro/grumphp": "^1.3.0",
"friendsofphp/php-cs-fixer": "^2.16",
"phpstan/phpstan": "^0.12.32",
"phpstan/phpstan-webmozart-assert": "^0.12.2"
"phpstan/phpstan-webmozart-assert": "^0.12.2",
"matthiasnoback/symfony-config-test": "^4.2"
},
"autoload": {
"psr-4": {
Expand Down
72 changes: 72 additions & 0 deletions src/LuigisBoxBundle/DTO/ConfigDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

declare(strict_types=1);

namespace Answear\LuigisBoxBundle\DTO;

class ConfigDTO
{
/**
* @var string
*/
private $host;

/**
* @var string
*/
private $publicKey;

/**
* @var string
*/
private $privateKey;

/**
* @var float
*/
private $connectionTimeout;

/**
* @var float
*/
private $requestTimeout;

public function __construct(
string $host,
string $publicKey,
string $privateKey,
float $connectionTimeout,
float $requestTimeout
) {
$this->host = $host;
$this->publicKey = $publicKey;
$this->privateKey = $privateKey;
$this->connectionTimeout = $connectionTimeout;
$this->requestTimeout = $requestTimeout;
}

public function getHost(): string
{
return $this->host;
}

public function getPublicKey(): string
{
return $this->publicKey;
}

public function getPrivateKey(): string
{
return $this->privateKey;
}

public function getConnectionTimeout(): float
{
return $this->connectionTimeout;
}

public function getRequestTimeout(): float
{
return $this->requestTimeout;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,18 @@ public function load(array $configs, ContainerBuilder $container): void
$configuration = $this->getConfiguration($configs, $container);
$config = $this->processConfiguration($configuration, $configs);

if (empty($config['default_config']) && \count($config['configs']) > 1) {
throw new \InvalidArgumentException(
'Provide default_config name if more configs provided.'
);
}
$config['default_config'] = $config['default_config'] ?? array_key_first($config['configs']);

$definition = $container->getDefinition(ConfigProvider::class);
$definition->setArguments(
[
rtrim($config['host'], '/'),
$config['publicKey'],
$config['privateKey'],
$config['connectionTimeout'],
$config['requestTimeout'],
$config['default_config'],
$config['configs'],
]
);
}
Expand Down
23 changes: 16 additions & 7 deletions src/LuigisBoxBundle/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,29 @@
class Configuration implements ConfigurationInterface
{
private const HOST = 'https://live.luigisbox.com';
private const CONNECTION_TIMEOUT = 10.0;
private const REQUEST_TIMEOUT = 10.0;
private const CONNECTION_TIMEOUT = 4.0;
private const REQUEST_TIMEOUT = 8.0;

public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('answear_luigis_box');

$treeBuilder->getRootNode()
->children()
->scalarNode('host')->defaultValue(self::HOST)->end()
->scalarNode('publicKey')->cannotBeEmpty()->end()
->scalarNode('privateKey')->cannotBeEmpty()->end()
->floatNode('connectionTimeout')->defaultValue(self::CONNECTION_TIMEOUT)->end()
->floatNode('requestTimeout')->defaultValue(self::REQUEST_TIMEOUT)->end()
->scalarNode('default_config')->defaultValue(null)->end()
->arrayNode('configs')
->isRequired()
->requiresAtLeastOneElement()
->arrayPrototype()
->children()
->scalarNode('host')->cannotBeEmpty()->defaultValue(self::HOST)->end()
->scalarNode('publicKey')->isRequired()->cannotBeEmpty()->end()
->scalarNode('privateKey')->isRequired()->cannotBeEmpty()->end()
->floatNode('connectionTimeout')->defaultValue(self::CONNECTION_TIMEOUT)->end()
->floatNode('requestTimeout')->defaultValue(self::REQUEST_TIMEOUT)->end()
->end()
->end()
->end()
->end();

return $treeBuilder;
Expand Down
96 changes: 62 additions & 34 deletions src/LuigisBoxBundle/Service/ConfigProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

namespace Answear\LuigisBoxBundle\Service;

use Answear\LuigisBoxBundle\DTO\ConfigDTO;
use Answear\LuigisBoxBundle\Util\AuthenticationUtil;
use Webmozart\Assert\Assert;

class ConfigProvider
{
Expand All @@ -13,47 +15,68 @@ class ConfigProvider
/**
* @var string
*/
private $host;
private $configName;

/**
* @var string
* @var ConfigDTO[]
*/
private $publicKey;
private $configs;

/**
* @var string
*/
private $privateKey;
public function __construct(string $defaultConfigName, array $configs)
{
$configsDTO = [];
foreach ($configs as $configName => $item) {
Assert::keyExists($item, 'host');
Assert::keyExists($item, 'publicKey');
Assert::keyExists($item, 'privateKey');
Assert::keyExists($item, 'connectionTimeout');
Assert::keyExists($item, 'requestTimeout');

/**
* @var float
*/
private $connectionTimeout;
$configsDTO[$configName] = new ConfigDTO(
rtrim($item['host'], '/'),
$item['publicKey'],
$item['privateKey'],
$item['connectionTimeout'],
$item['requestTimeout']
);
}

/**
* @var float
*/
private $requestTimeout;

public function __construct(
string $host,
string $publicKey,
string $privateKey,
float $connectionTimeout,
float $requestTimeout
) {
$this->host = $host;
$this->publicKey = $publicKey;
$this->privateKey = $privateKey;
$this->connectionTimeout = $connectionTimeout;
$this->requestTimeout = $requestTimeout;
Assert::allIsInstanceOf($configsDTO, ConfigDTO::class);
Assert::keyExists(
$configsDTO,
$defaultConfigName,
sprintf(
'No configuration with key "%s". Available configurations: %s.',
$defaultConfigName,
implode(', ', array_keys($configsDTO))
)
);

$this->configName = $defaultConfigName;
$this->configs = $configsDTO;
}

public function setConfig(string $configName): void
{
Assert::keyExists(
$this->configs,
$configName,
sprintf(
'No configuration with key "%s". Available configurations: %s.',
$configName,
implode(', ', array_keys($this->configs))
)
);
$this->configName = $configName;
}

public function getRequestHeaders(string $httpMethod, string $endpoint, \DateTimeInterface $date): array
{
$configDTO = $this->getConfigDTO();

return AuthenticationUtil::getRequestHeaders(
$this->publicKey,
$this->privateKey,
$configDTO->getPublicKey(),
$configDTO->getPrivateKey(),
$httpMethod,
$endpoint,
$date
Expand All @@ -62,21 +85,26 @@ public function getRequestHeaders(string $httpMethod, string $endpoint, \DateTim

public function getHost(): string
{
return $this->host;
return $this->getConfigDTO()->getHost();
}

public function getPublicKey(): string
{
return $this->publicKey;
return $this->getConfigDTO()->getPublicKey();
}

public function getConnectionTimeout(): float
{
return $this->connectionTimeout;
return $this->getConfigDTO()->getConnectionTimeout();
}

public function getRequestTimeout(): float
{
return $this->requestTimeout;
return $this->getConfigDTO()->getRequestTimeout();
}

private function getConfigDTO(): ConfigDTO
{
return $this->configs[$this->configName];
}
}
Loading

0 comments on commit 36e4fa9

Please sign in to comment.