Completed
Push — develop ( 74108a...5db66d )
by Alejandro
17s queued 12s
created

QrCodeAction::normalizeSize()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 4.125

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
c 1
b 0
f 0
dl 0
loc 7
rs 10
ccs 1
cts 2
cp 0.5
cc 3
nc 3
nop 1
crap 4.125
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Shlinkio\Shlink\Core\Action;
6
7
use Endroid\QrCode\QrCode;
8
use Endroid\QrCode\Writer\SvgWriter;
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 ShortUrlResolverInterface $urlResolver;
27
    private array $domainConfig;
28
    private LoggerInterface $logger;
29
30 7
    public function __construct(
31
        ShortUrlResolverInterface $urlResolver,
32
        array $domainConfig,
33
        ?LoggerInterface $logger = null
34
    ) {
35 7
        $this->urlResolver = $urlResolver;
36 7
        $this->domainConfig = $domainConfig;
37 7
        $this->logger = $logger ?? new NullLogger();
38 7
    }
39
40 7
    public function process(Request $request, RequestHandlerInterface $handler): Response
41
    {
42 7
        $identifier = ShortUrlIdentifier::fromRedirectRequest($request);
43
44
        try {
45 7
            $shortUrl = $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 5
        $query = $request->getQueryParams();
52 5
        // Size attribute is deprecated
53 5
        $size = $this->normalizeSize((int) $request->getAttribute('size', $query['size'] ?? self::DEFAULT_SIZE));
54
55 5
        $qrCode = new QrCode($shortUrl->toString($this->domainConfig));
56 5
        $qrCode->setSize($size);
57 1
        $qrCode->setMargin(0);
58
59
        $format = $query['format'] ?? 'png';
60 5
        if ($format === 'svg') {
61
            $qrCode->setWriter(new SvgWriter());
62
        }
63 5
64
        return new QrCodeResponse($qrCode);
65 5
    }
66 5
67
    private function normalizeSize(int $size): int
68
    {
69
        if ($size < self::MIN_SIZE) {
70 5
            return self::MIN_SIZE;
71
        }
72
73
        return $size > self::MAX_SIZE ? self::MAX_SIZE : $size;
74
    }
75
}
76