Compare commits

...

8 Commits

Author SHA1 Message Date
Alejandro Celaya
32fda231ad Merge pull request #1138 from acelaya-forks/feature/fix-import-with-no-visits
Feature/fix import with no visits
2021-08-02 20:34:06 +02:00
Alejandro Celaya
e4d4686717 Ensure visits lists where the page is lower than 1, fall back to page 1 to avoid errors 2021-08-02 20:22:07 +02:00
Alejandro Celaya
ca6c6a1b6e Updated importer to v2.3.1 2021-08-02 18:29:16 +02:00
Alejandro Celaya
51c7d0ed3e Removed deprecated env var for publish release 2021-07-30 18:25:00 +02:00
Alejandro Celaya
b3af493758 Merge pull request #1130 from acelaya-forks/feature/docker-memory-limit
Fixed memory too low limit on docker image
2021-07-30 18:16:40 +02:00
Alejandro Celaya
7b9ebbbb5f Fixed use of ImplicitOptionsMiddleware with its new signature 2021-07-30 18:05:03 +02:00
Alejandro Celaya
ea735fc0a0 Ensured guzzle/psr7 1.7 is used as the project still has deprecated calls 2021-07-30 17:48:43 +02:00
Alejandro Celaya
06227e97d0 Fixed memory too low limit on docker image 2021-07-30 17:39:45 +02:00
8 changed files with 60 additions and 7 deletions

View File

@@ -43,7 +43,6 @@ jobs:
uses: docker://antonyurchenko/git-release:latest uses: docker://antonyurchenko/git-release:latest
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ALLOW_TAG_PREFIX: "true"
ALLOW_EMPTY_CHANGELOG: "true" ALLOW_EMPTY_CHANGELOG: "true"
with: with:
args: | args: |

View File

@@ -4,6 +4,41 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org). The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org).
## [2.7.3] - 2021-08-02
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#1135](https://github.com/shlinkio/shlink/issues/1135) Fixed error when importing short URLs with no visits from another Shlink instance.
* [#1136](https://github.com/shlinkio/shlink/issues/1136) Fixed error when fetching tag/short-url/orphan visits for a page lower than 1.
## [2.7.2] - 2021-07-30
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#1128](https://github.com/shlinkio/shlink/issues/1128) Increased memory limit reserved for the docker image, preventing it from crashing on GeoLite db download.
## [2.7.1] - 2021-05-30 ## [2.7.1] - 2021-05-30
### Added ### Added
* *Nothing* * *Nothing*

View File

@@ -24,6 +24,7 @@
"endroid/qr-code": "^4.0", "endroid/qr-code": "^4.0",
"geoip2/geoip2": "^2.9", "geoip2/geoip2": "^2.9",
"guzzlehttp/guzzle": "^7.0", "guzzlehttp/guzzle": "^7.0",
"guzzlehttp/psr7": "^1.7",
"happyr/doctrine-specification": "^2.0", "happyr/doctrine-specification": "^2.0",
"jaybizzle/crawler-detect": "^1.2", "jaybizzle/crawler-detect": "^1.2",
"laminas/laminas-config": "^3.3", "laminas/laminas-config": "^3.3",
@@ -50,7 +51,7 @@
"shlinkio/shlink-common": "^3.7", "shlinkio/shlink-common": "^3.7",
"shlinkio/shlink-config": "^1.0", "shlinkio/shlink-config": "^1.0",
"shlinkio/shlink-event-dispatcher": "^2.1", "shlinkio/shlink-event-dispatcher": "^2.1",
"shlinkio/shlink-importer": "^2.3", "shlinkio/shlink-importer": "^2.3.1",
"shlinkio/shlink-installer": "^6.0", "shlinkio/shlink-installer": "^6.0",
"shlinkio/shlink-ip-geolocation": "^2.0", "shlinkio/shlink-ip-geolocation": "^2.0",
"symfony/console": "^5.1", "symfony/console": "^5.1",

View File

@@ -1,3 +1,4 @@
log_errors_max_len=0 log_errors_max_len=0
zend.assertions=1 zend.assertions=1
assert.exception=1 assert.exception=1
memory_limit=256M

View File

@@ -15,11 +15,11 @@ final class ShortUrlsParams
public const DEFAULT_ITEMS_PER_PAGE = 10; public const DEFAULT_ITEMS_PER_PAGE = 10;
private int $page; private int $page;
private ?int $itemsPerPage = null;
private ?string $searchTerm; private ?string $searchTerm;
private array $tags; private array $tags;
private ShortUrlsOrdering $orderBy; private ShortUrlsOrdering $orderBy;
private ?DateRange $dateRange; private ?DateRange $dateRange;
private ?int $itemsPerPage = null;
private function __construct() private function __construct()
{ {

View File

@@ -25,11 +25,16 @@ final class VisitsParams
bool $excludeBots = false bool $excludeBots = false
) { ) {
$this->dateRange = $dateRange ?? new DateRange(); $this->dateRange = $dateRange ?? new DateRange();
$this->page = $page; $this->page = $this->determinePage($page);
$this->itemsPerPage = $this->determineItemsPerPage($itemsPerPage); $this->itemsPerPage = $this->determineItemsPerPage($itemsPerPage);
$this->excludeBots = $excludeBots; $this->excludeBots = $excludeBots;
} }
private function determinePage(int $page): int
{
return $page > 0 ? $page : self::FIRST_PAGE;
}
private function determineItemsPerPage(?int $itemsPerPage): int private function determineItemsPerPage(?int $itemsPerPage): int
{ {
if ($itemsPerPage !== null && $itemsPerPage < 0) { if ($itemsPerPage !== null && $itemsPerPage < 0) {
@@ -43,7 +48,7 @@ final class VisitsParams
{ {
return new self( return new self(
parseDateRangeFromQuery($query, 'startDate', 'endDate'), parseDateRangeFromQuery($query, 'startDate', 'endDate'),
(int) ($query['page'] ?? 1), (int) ($query['page'] ?? self::FIRST_PAGE),
isset($query['itemsPerPage']) ? (int) $query['itemsPerPage'] : null, isset($query['itemsPerPage']) ? (int) $query['itemsPerPage'] : null,
isset($query['excludeBots']), isset($query['excludeBots']),
); );

View File

@@ -6,11 +6,18 @@ namespace Shlinkio\Shlink\Rest\Middleware;
use Laminas\Diactoros\Response\EmptyResponse; use Laminas\Diactoros\Response\EmptyResponse;
use Mezzio\Router\Middleware\ImplicitOptionsMiddleware; use Mezzio\Router\Middleware\ImplicitOptionsMiddleware;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
class EmptyResponseImplicitOptionsMiddlewareFactory class EmptyResponseImplicitOptionsMiddlewareFactory
{ {
public function __invoke(): ImplicitOptionsMiddleware public function __invoke(): ImplicitOptionsMiddleware
{ {
return new ImplicitOptionsMiddleware(fn () => new EmptyResponse()); return new ImplicitOptionsMiddleware(new class implements ResponseFactoryInterface {
public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface
{
return new EmptyResponse();
}
});
} }
} }

View File

@@ -7,6 +7,7 @@ namespace ShlinkioTest\Shlink\Rest\Middleware;
use Laminas\Diactoros\Response\EmptyResponse; use Laminas\Diactoros\Response\EmptyResponse;
use Mezzio\Router\Middleware\ImplicitOptionsMiddleware; use Mezzio\Router\Middleware\ImplicitOptionsMiddleware;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ResponseFactoryInterface;
use ReflectionObject; use ReflectionObject;
use Shlinkio\Shlink\Rest\Middleware\EmptyResponseImplicitOptionsMiddlewareFactory; use Shlinkio\Shlink\Rest\Middleware\EmptyResponseImplicitOptionsMiddlewareFactory;
@@ -34,6 +35,10 @@ class EmptyResponseImplicitOptionsMiddlewareFactoryTest extends TestCase
$ref = new ReflectionObject($instance); $ref = new ReflectionObject($instance);
$prop = $ref->getProperty('responseFactory'); $prop = $ref->getProperty('responseFactory');
$prop->setAccessible(true); $prop->setAccessible(true);
self::assertInstanceOf(EmptyResponse::class, $prop->getValue($instance)());
/** @var ResponseFactoryInterface $value */
$value = $prop->getValue($instance);
self::assertInstanceOf(EmptyResponse::class, $value->createResponse());
} }
} }