From 383fde488be595e060bc94b5fe04818ceafb7a86 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 7 Feb 2021 08:32:12 +0100 Subject: [PATCH 1/2] Added support to define the margin when generating the QR codes --- module/Core/src/Action/QrCodeAction.php | 26 +++++++++++++++----- module/Core/test/Action/QrCodeActionTest.php | 15 +++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/module/Core/src/Action/QrCodeAction.php b/module/Core/src/Action/QrCodeAction.php index b39159fd..3209d651 100644 --- a/module/Core/src/Action/QrCodeAction.php +++ b/module/Core/src/Action/QrCodeAction.php @@ -50,12 +50,9 @@ class QrCodeAction implements MiddlewareInterface } $query = $request->getQueryParams(); - // Size attribute is deprecated - $size = $this->normalizeSize((int) $request->getAttribute('size', $query['size'] ?? self::DEFAULT_SIZE)); - $qrCode = new QrCode($this->stringifier->stringify($shortUrl)); - $qrCode->setSize($size); - $qrCode->setMargin(0); + $qrCode->setSize($this->resolveSize($request, $query)); + $qrCode->setMargin($this->resolveMargin($query)); $format = $query['format'] ?? 'png'; if ($format === 'svg') { @@ -65,12 +62,29 @@ class QrCodeAction implements MiddlewareInterface return new QrCodeResponse($qrCode); } - private function normalizeSize(int $size): int + private function resolveSize(Request $request, array $query): int { + // Size attribute is deprecated. After v3.0.0, always use the query param instead + $size = (int) $request->getAttribute('size', $query['size'] ?? self::DEFAULT_SIZE); if ($size < self::MIN_SIZE) { return self::MIN_SIZE; } return $size > self::MAX_SIZE ? self::MAX_SIZE : $size; } + + private function resolveMargin(array $query): int + { + if (! isset($query['margin'])) { + return 0; + } + + $margin = $query['margin']; + $intMargin = (int) $margin; + if ($margin !== (string) $intMargin) { + return 0; + } + + return $intMargin < 0 ? 0 : $intMargin; + } } diff --git a/module/Core/test/Action/QrCodeActionTest.php b/module/Core/test/Action/QrCodeActionTest.php index 245ac6de..aeaec13f 100644 --- a/module/Core/test/Action/QrCodeActionTest.php +++ b/module/Core/test/Action/QrCodeActionTest.php @@ -133,5 +133,20 @@ class QrCodeActionTest extends TestCase ServerRequestFactory::fromGlobals()->withAttribute('size', '350')->withQueryParams(['size' => '123']), 350, ]; + yield 'margin' => [ServerRequestFactory::fromGlobals()->withQueryParams(['margin' => '35']), 370]; + yield 'margin and size' => [ + ServerRequestFactory::fromGlobals()->withQueryParams(['margin' => '100', 'size' => '200']), + 400, + ]; + yield 'negative margin' => [ServerRequestFactory::fromGlobals()->withQueryParams(['margin' => '-50']), 300]; + yield 'non-numeric margin' => [ServerRequestFactory::fromGlobals()->withQueryParams(['margin' => 'foo']), 300]; + yield 'negative margin and size' => [ + ServerRequestFactory::fromGlobals()->withQueryParams(['margin' => '-1', 'size' => '150']), + 150, + ]; + yield 'non-numeric margin and size' => [ + ServerRequestFactory::fromGlobals()->withQueryParams(['margin' => 'foo', 'size' => '538']), + 538, + ]; } } From 9f512705fadd910e85b628036dd4dbbae7467943 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 7 Feb 2021 08:35:52 +0100 Subject: [PATCH 2/2] Documented margin param on QR code endpoint --- CHANGELOG.md | 4 +++- docs/swagger/paths/{shortCode}_qr-code.json | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d304c548..8b34f679 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this The file requires the `Long URL` and `Short code` columns, and it also accepts the optional `title`, `domain` and `tags` columns. +* [#1000](https://github.com/shlinkio/shlink/issues/1000) Added support to provide a `margin` query param when generating some URL's QR code. + ### Changed * [#977](https://github.com/shlinkio/shlink/issues/977) Migrated from `laminas/laminas-paginator` to `pagerfanta/core` to handle pagination. * [#986](https://github.com/shlinkio/shlink/issues/986) Updated official docker image to use PHP 8. @@ -24,7 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this All the existing camelCase flags will continue working for now, but will be removed in Shlink 3.0.0 -* [#862](https://github.com/shlinkio/shlink/issues/862) Deprecated endpoint to edit tags for a short URL (`PUT /short-urls/{shortCode}/tags`). +* [#862](https://github.com/shlinkio/shlink/issues/862) Deprecated the endpoint to edit tags for a short URL (`PUT /short-urls/{shortCode}/tags`). The short URL edition endpoint (`PATCH /short-urls/{shortCode}`) now supports setting the tags too. Use it instead. diff --git a/docs/swagger/paths/{shortCode}_qr-code.json b/docs/swagger/paths/{shortCode}_qr-code.json index 3714f802..00502ad5 100644 --- a/docs/swagger/paths/{shortCode}_qr-code.json +++ b/docs/swagger/paths/{shortCode}_qr-code.json @@ -40,6 +40,17 @@ "svg" ] } + }, + { + "name": "margin", + "in": "query", + "description": "The margin around the QR code image.", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0 + } } ], "responses": {