diff --git a/module/CLI/src/Command/Visit/UpdateDbCommand.php b/module/CLI/src/Command/Visit/UpdateDbCommand.php index ca4963cf..a17c36fd 100644 --- a/module/CLI/src/Command/Visit/UpdateDbCommand.php +++ b/module/CLI/src/Command/Visit/UpdateDbCommand.php @@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\CLI\Command\Visit; use Shlinkio\Shlink\Common\Exception\RuntimeException; use Shlinkio\Shlink\Common\IpGeolocation\GeoLite2\DbUpdaterInterface; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; @@ -47,11 +48,23 @@ class UpdateDbCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): void { $io = new SymfonyStyle($input, $output); + $progressBar = new ProgressBar($output); + $progressBar->start(); try { - $this->geoLiteDbUpdater->downloadFreshCopy(); + $this->geoLiteDbUpdater->downloadFreshCopy(function (int $total, int $downloaded) use ($progressBar) { + $progressBar->setMaxSteps($total); + $progressBar->setProgress($downloaded); + }); + + $progressBar->finish(); + $io->writeln(''); + $io->success($this->translator->translate('GeoLite2 database properly updated')); } catch (RuntimeException $e) { + $progressBar->finish(); + $io->writeln(''); + $io->error($this->translator->translate('An error occurred while updating GeoLite2 database')); if ($io->isVerbose()) { $this->getApplication()->renderException($e, $output); diff --git a/module/CLI/test/Command/Visit/UpdateDbCommandTest.php b/module/CLI/test/Command/Visit/UpdateDbCommandTest.php index eeb4f1ff..9e7d0736 100644 --- a/module/CLI/test/Command/Visit/UpdateDbCommandTest.php +++ b/module/CLI/test/Command/Visit/UpdateDbCommandTest.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace ShlinkioTest\Shlink\CLI\Command\Visit; use PHPUnit\Framework\TestCase; +use Prophecy\Argument; use Prophecy\Prophecy\ObjectProphecy; use Shlinkio\Shlink\CLI\Command\Visit\UpdateDbCommand; use Shlinkio\Shlink\Common\Exception\RuntimeException; @@ -39,7 +40,7 @@ class UpdateDbCommandTest extends TestCase */ public function successMessageIsPrintedIfEverythingWorks() { - $download = $this->dbUpdater->downloadFreshCopy()->will(function () { + $download = $this->dbUpdater->downloadFreshCopy(Argument::type('callable'))->will(function () { }); $this->commandTester->execute([]); @@ -54,7 +55,7 @@ class UpdateDbCommandTest extends TestCase */ public function errorMessageIsPrintedIfAnExceptionIsThrown() { - $download = $this->dbUpdater->downloadFreshCopy()->willThrow(RuntimeException::class); + $download = $this->dbUpdater->downloadFreshCopy(Argument::type('callable'))->willThrow(RuntimeException::class); $this->commandTester->execute([]); $output = $this->commandTester->getDisplay(); diff --git a/module/Common/src/IpGeolocation/GeoLite2/DbUpdater.php b/module/Common/src/IpGeolocation/GeoLite2/DbUpdater.php index e8628cf2..c20ad4ca 100644 --- a/module/Common/src/IpGeolocation/GeoLite2/DbUpdater.php +++ b/module/Common/src/IpGeolocation/GeoLite2/DbUpdater.php @@ -42,22 +42,23 @@ class DbUpdater implements DbUpdaterInterface /** * @throws RuntimeException */ - public function downloadFreshCopy(): void + public function downloadFreshCopy(callable $handleProgress = null): void { $tempDir = $this->options->getTempDir(); $compressedFile = sprintf('%s/%s', $tempDir, self::DB_COMPRESSED_FILE); - $this->downloadDbFile($compressedFile); + $this->downloadDbFile($compressedFile, $handleProgress); $tempFullPath = $this->extractDbFile($compressedFile, $tempDir); $this->copyNewDbFile($tempFullPath); $this->deleteTempFiles([$compressedFile, $tempFullPath]); } - private function downloadDbFile(string $dest): void + private function downloadDbFile(string $dest, callable $handleProgress = null): void { try { $this->httpClient->request(RequestMethod::METHOD_GET, $this->options->getDownloadFrom(), [ RequestOptions::SINK => $dest, + RequestOptions::PROGRESS => $handleProgress, ]); } catch (Throwable | GuzzleException $e) { throw new RuntimeException( diff --git a/module/Common/src/IpGeolocation/GeoLite2/DbUpdaterInterface.php b/module/Common/src/IpGeolocation/GeoLite2/DbUpdaterInterface.php index 1fad0825..bf304c6f 100644 --- a/module/Common/src/IpGeolocation/GeoLite2/DbUpdaterInterface.php +++ b/module/Common/src/IpGeolocation/GeoLite2/DbUpdaterInterface.php @@ -10,5 +10,5 @@ interface DbUpdaterInterface /** * @throws RuntimeException */ - public function downloadFreshCopy(): void; + public function downloadFreshCopy(callable $handleProgress = null): void; }