From e8b10ff36015aaa38df0f776e6ef9f19a8656e20 Mon Sep 17 00:00:00 2001 From: Morten Poul Jensen Date: Wed, 18 Apr 2018 12:59:13 +0200 Subject: [PATCH] Refactor config and add handler stack provider --- config/shopify.php | 68 +++++++++++----- src/Http/Middleware/ValidateWebhook.php | 2 +- src/Profiles/ConfigProfile.php | 6 +- src/Providers/DefaultHandlerStackProvider.php | 29 +++++++ src/Providers/DefaultRateLimitProvider.php | 78 +++++++++++++++++++ .../HandlerStackProviderContract.php | 13 ++++ .../SecretProviders/ConfigSecretProvider.php | 2 +- 7 files changed, 176 insertions(+), 22 deletions(-) create mode 100644 src/Providers/DefaultHandlerStackProvider.php create mode 100644 src/Providers/DefaultRateLimitProvider.php create mode 100644 src/Providers/HandlerStackProviderContract.php diff --git a/config/shopify.php b/config/shopify.php index 924fac2..04e48f3 100644 --- a/config/shopify.php +++ b/config/shopify.php @@ -7,27 +7,59 @@ 'profile' => \Signifly\Shopify\Laravel\Profiles\ConfigProfile::class, /* - * The API key from private app credentials. + * The handlerStack to use. */ - 'api_key' => env('SHOPIFY_API_KEY'), + 'handlerStackProvider' => \Signifly\Shopify\Laravel\HandlerStacks\DefaultHandlerStackProvider::class, - /* - * The password from private app credentials. - */ - 'password' => env('SHOPIFY_PASSWORD'), + 'credentials' => [ - /* - * The shopify domain for your shop. - */ - 'domain' => env('SHOPIFY_DOMAIN'), + /* + * The API key from private app credentials. + */ + 'api_key' => env('SHOPIFY_API_KEY'), - /* - * The webhook secret provider to use. - */ - 'webhook_secret_provider' => \Signifly\Shopify\Laravel\Webhooks\SecretProviders\ConfigSecretProvider::class, + /* + * The password from private app credentials. + */ + 'password' => env('SHOPIFY_PASSWORD'), - /* - * The shopify webhook secret. - */ - 'webhook_secret' => env('SHOPIFY_WEBHOOK_SECRET'), + /* + * The shopify domain for your shop. + */ + 'domain' => env('SHOPIFY_DOMAIN'), + + ], + + 'rate_limit' => [ + + /* + * The buffer from the max calls limit. + */ + 'buffer' => 3, + + /* + * The request cycle. + */ + 'cycle' => 0.5, + + /* + * The processes that can run in parallel. + */ + 'processes' => 1, + + ], + + 'webhooks' => [ + + /* + * The webhook secret provider to use. + */ + 'secret_provider' => \Signifly\Shopify\Laravel\Webhooks\SecretProviders\ConfigSecretProvider::class, + + /* + * The shopify webhook secret. + */ + 'secret' => env('SHOPIFY_WEBHOOK_SECRET'), + + ], ]; diff --git a/src/Http/Middleware/ValidateWebhook.php b/src/Http/Middleware/ValidateWebhook.php index 2927c83..b82f232 100644 --- a/src/Http/Middleware/ValidateWebhook.php +++ b/src/Http/Middleware/ValidateWebhook.php @@ -35,7 +35,7 @@ public function handle($request, Closure $next) protected function getSecretProvider() { - $secretProviderClass = config('shopify.webhook_secret_provider'); + $secretProviderClass = config('shopify.webhooks.secret_provider'); return new $secretProviderClass(); } diff --git a/src/Profiles/ConfigProfile.php b/src/Profiles/ConfigProfile.php index 99eea15..9316b0e 100644 --- a/src/Profiles/ConfigProfile.php +++ b/src/Profiles/ConfigProfile.php @@ -8,8 +8,10 @@ class ConfigProfile extends CredentialsProfile { public function __construct() { - $config = config('shopify'); + $config = config('shopify.credentials'); + $providerClass = config('shopify.handlerStackProvider'); + $provider = new $providerClass; - parent::__construct($config['api_key'], $config['password'], $config['domain']); + parent::__construct($config['api_key'], $config['password'], $config['domain'], $provider->getHandlerStack()); } } diff --git a/src/Providers/DefaultHandlerStackProvider.php b/src/Providers/DefaultHandlerStackProvider.php new file mode 100644 index 0000000..1cd0c08 --- /dev/null +++ b/src/Providers/DefaultHandlerStackProvider.php @@ -0,0 +1,29 @@ +push(new RateLimiter($this->getRateLimitProvider())); + return $handlerStack; + } + + protected function getRateLimitProvider() : RateLimitProvider + { + return new DefaultRateLimitProvider( + new DefaultRateLimitCalculator( + config('shopify.rate_limit.buffer'), + config('shopify.rate_limit.cycle'), + config('shopify.rate_limit.processes') + ) + ); + } +} diff --git a/src/Providers/DefaultRateLimitProvider.php b/src/Providers/DefaultRateLimitProvider.php new file mode 100644 index 0000000..c3d03b0 --- /dev/null +++ b/src/Providers/DefaultRateLimitProvider.php @@ -0,0 +1,78 @@ +calculator = $calculator; + } + + /** + * Returns when the last request was made. + * + * @return float|null When the last request was made. + */ + public function getLastRequestTime() + { + return Cache::get('last_request_time'); + } + + /** + * Used to set the current time as the last request time to be queried when + * the next request is attempted. + */ + public function setLastRequestTime() + { + return Cache::forever('last_request_time', microtime(true)); + } + + /** + * Returns what is considered the time when a given request is being made. + * + * @param RequestInterface $request The request being made. + * + * @return float Time when the given request is being made. + */ + public function getRequestTime(RequestInterface $request) + { + return microtime(true); + } + + /** + * Returns the minimum amount of time that is required to have passed since + * the last request was made. This value is used to determine if the current + * request should be delayed, based on when the last request was made. + * + * Returns the allowed time between the last request and the next, which + * is used to determine if a request should be delayed and by how much. + * + * @param RequestInterface $request The pending request. + * + * @return float The minimum amount of time that is required to have passed + * since the last request was made (in seconds). + */ + public function getRequestAllowance(RequestInterface $request) + { + return Cache::get('request_allowance', 0.5); + } + + /** + * Used to set the minimum amount of time that is required to pass between + * this request and the next request. + * + * @param ResponseInterface $response The resolved response. + */ + public function setRequestAllowance(ResponseInterface $response) + { + Cache::forever('request_allowance', $this->calculator->calculate()); + } +} diff --git a/src/Providers/HandlerStackProviderContract.php b/src/Providers/HandlerStackProviderContract.php new file mode 100644 index 0000000..7eceaa3 --- /dev/null +++ b/src/Providers/HandlerStackProviderContract.php @@ -0,0 +1,13 @@ +