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

RateLimitMiddleware   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 39
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 4
eloc 15
dl 0
loc 39
ccs 14
cts 14
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A execute() 0 14 2
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