Completed
Pull Request — master (#1)
by Agaletskiy
04:38 queued 01:44
created

RateLimitMiddleware::__construct()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 8
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 1
nop 3
dl 0
loc 8
ccs 4
cts 4
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Lamoda\Tactician\RateLimit;
6
7
use Lamoda\Tactician\RateLimit\RateLimiter\RateLimitProviderInterface;
8
use Lamoda\Tactician\RateLimit\RateLimiter\RateLimiterInterface;
9
use League\Tactician\Middleware;
10
use Psr\Log\LoggerInterface;
11
use Psr\Log\NullLogger;
12
13
final class RateLimitMiddleware implements Middleware
14
{
15
    /**
16
     * @var RateLimitProviderInterface
17
     */
18
    private $rateLimitProvider;
19
    /**
20
     * @var RateLimiterInterface
21
     */
22
    private $rateLimiter;
23
    /**
24
     * @var LoggerInterface
25
     */
26
    private $logger;
27
28 3
    public function __construct(
29
        RateLimitProviderInterface $rateLimitProvider,
30
        RateLimiterInterface $rateLimiter,
31
        LoggerInterface $logger = null
32
    ) {
33 3
        $this->rateLimitProvider = $rateLimitProvider;
34 3
        $this->rateLimiter = $rateLimiter;
35 3
        $this->logger = $logger ?: new NullLogger();
36 3
    }
37
38 3
    public function execute($command, callable $next)
39
    {
40 3
        $rateLimit = $this->rateLimitProvider->provide($command);
41
42 3
        if (null !== $rateLimit) {
43 2
            $this->logger->info('Throttling command with key {key} for {limit} on {time} ms', [
44 2
                'key' => $rateLimit->getKey(),
45 2
                'limit' => $rateLimit->getLimit(),
46 2
                'time' => $rateLimit->getMilliseconds(),
47
            ]);
48 2
            $this->rateLimiter->throttle($rateLimit);
49
        }
50
51 3
        return $next($command);
52
    }
53
}
54