Completed
Pull Request — develop (#645)
by Alejandro
05:15
created

QrCodeAction   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Test Coverage

Coverage 95.24%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
c 1
b 0
f 0
dl 0
loc 50
rs 10
ccs 20
cts 21
cp 0.9524
wmc 7

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A getSizeParam() 0 8 3
A process() 0 18 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Shlinkio\Shlink\Core\Action;
6
7
use Endroid\QrCode\QrCode;
8
use Mezzio\Router\RouterInterface;
9
use Psr\Http\Message\ResponseInterface as Response;
10
use Psr\Http\Message\ServerRequestInterface as Request;
11
use Psr\Http\Server\MiddlewareInterface;
12
use Psr\Http\Server\RequestHandlerInterface;
13
use Psr\Log\LoggerInterface;
14
use Psr\Log\NullLogger;
15
use Shlinkio\Shlink\Common\Response\QrCodeResponse;
16
use Shlinkio\Shlink\Core\Exception\ShortUrlNotFoundException;
17
use Shlinkio\Shlink\Core\Model\ShortUrlIdentifier;
18
use Shlinkio\Shlink\Core\Service\ShortUrl\ShortUrlResolverInterface;
19
20
class QrCodeAction implements MiddlewareInterface
21
{
22
    private const DEFAULT_SIZE = 300;
23
    private const MIN_SIZE = 50;
24
    private const MAX_SIZE = 1000;
25
26
    private RouterInterface $router;
27
    private ShortUrlResolverInterface $urlResolver;
28
    private LoggerInterface $logger;
29
30 3
    public function __construct(
31
        RouterInterface $router,
32
        ShortUrlResolverInterface $urlResolver,
33
        ?LoggerInterface $logger = null
34
    ) {
35 3
        $this->router = $router;
36 3
        $this->urlResolver = $urlResolver;
37 3
        $this->logger = $logger ?: new NullLogger();
38
    }
39
40 3
    public function process(Request $request, RequestHandlerInterface $handler): Response
41
    {
42 3
        $identifier = ShortUrlIdentifier::fromRedirectRequest($request);
43
44
        try {
45 3
            $this->urlResolver->resolveEnabledShortUrl($identifier);
46 2
        } catch (ShortUrlNotFoundException $e) {
47 2
            $this->logger->warning('An error occurred while creating QR code. {e}', ['e' => $e]);
48 2
            return $handler->handle($request);
49
        }
50
51 1
        $path = $this->router->generateUri(RedirectAction::class, ['shortCode' => $identifier->shortCode()]);
52 1
        $size = $this->getSizeParam($request);
53
54 1
        $qrCode = new QrCode((string) $request->getUri()->withPath($path)->withQuery(''));
55 1
        $qrCode->setSize($size);
56 1
        $qrCode->setMargin(0);
57 1
        return new QrCodeResponse($qrCode);
58
    }
59
60
    /**
61
     */
62 1
    private function getSizeParam(Request $request): int
63
    {
64 1
        $size = (int) $request->getAttribute('size', self::DEFAULT_SIZE);
65 1
        if ($size < self::MIN_SIZE) {
66
            return self::MIN_SIZE;
67
        }
68
69 1
        return $size > self::MAX_SIZE ? self::MAX_SIZE : $size;
70
    }
71
}
72