From 1615efd8007214a2b7f117427924eca4d7dd2e65 Mon Sep 17 00:00:00 2001 From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com> Date: Mon, 30 Nov 2020 21:00:31 +1100 Subject: [PATCH 1/4] DRY up image uploading code Abstracted common functionality into a generic UploadImageController class. --- .../Controller/UploadFaviconController.php | 57 ++++-------- src/Api/Controller/UploadImageController.php | 87 +++++++++++++++++++ src/Api/Controller/UploadLogoController.php | 48 +++------- 3 files changed, 114 insertions(+), 78 deletions(-) create mode 100644 src/Api/Controller/UploadImageController.php diff --git a/src/Api/Controller/UploadFaviconController.php b/src/Api/Controller/UploadFaviconController.php index 09b9de7901..1fc65d35db 100644 --- a/src/Api/Controller/UploadFaviconController.php +++ b/src/Api/Controller/UploadFaviconController.php @@ -10,68 +10,43 @@ namespace Flarum\Api\Controller; use Flarum\Settings\SettingsRepositoryInterface; -use Illuminate\Support\Arr; -use Illuminate\Support\Str; +use Intervention\Image\Image; use Intervention\Image\ImageManager; use League\Flysystem\FilesystemInterface; -use Psr\Http\Message\ServerRequestInterface; -use Tobscure\JsonApi\Document; +use Psr\Http\Message\UploadedFileInterface; -class UploadFaviconController extends ShowForumController +class UploadFaviconController extends UploadImageController { /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - /** - * @var FilesystemInterface - */ - protected $uploadDir; - - /** - * @param SettingsRepositoryInterface $settings - * @param FilesystemInterface $uploadDir + * {@inheritdoc} */ public function __construct(SettingsRepositoryInterface $settings, FilesystemInterface $uploadDir) { - $this->settings = $settings; - $this->uploadDir = $uploadDir; + parent::__construct($settings, $uploadDir); + + $this->filenamePrefix = 'favicon'; + $this->filePathSettingKey = 'favicon_path'; } /** * {@inheritdoc} */ - public function data(ServerRequestInterface $request, Document $document) - { - $request->getAttribute('actor')->assertAdmin(); - - $file = Arr::get($request->getUploadedFiles(), 'favicon'); - $extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); + protected function makeImage(UploadedFileInterface $file): Image { + $this->fileExtension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); - if ($extension === 'ico') { - $image = $file->getStream(); + if ($this->fileExtension === 'ico') { + $encodedImage = $file->getStream(); } else { - $manager = new ImageManager; + $manager = new ImageManager(); - $image = $manager->make($file->getStream())->resize(64, 64, function ($constraint) { + $encodedImage = $manager->make($file->getStream())->resize(64, 64, function ($constraint) { $constraint->aspectRatio(); $constraint->upsize(); })->encode('png'); - $extension = 'png'; - } - - if (($path = $this->settings->get('favicon_path')) && $this->uploadDir->has($path)) { - $this->uploadDir->delete($path); + $this->fileExtension = 'png'; } - $uploadName = 'favicon-'.Str::lower(Str::random(8)).'.'.$extension; - - $this->uploadDir->write($uploadName, $image); - - $this->settings->set('favicon_path', $uploadName); - - return parent::data($request, $document); + return $encodedImage; } } diff --git a/src/Api/Controller/UploadImageController.php b/src/Api/Controller/UploadImageController.php new file mode 100644 index 0000000000..33f760dc8b --- /dev/null +++ b/src/Api/Controller/UploadImageController.php @@ -0,0 +1,87 @@ +settings = $settings; + $this->uploadDir = $uploadDir; + } + + /** + * {@inheritdoc} + */ + public function data(ServerRequestInterface $request, Document $document) + { + $request->getAttribute('actor')->assertAdmin(); + + $file = Arr::get($request->getUploadedFiles(), $this->filenamePrefix); + + $encodedImage = $this->makeImage($file); + + if (($path = $this->settings->get($this->filePathSettingKey)) && $this->uploadDir->has($path)) { + $this->uploadDir->delete($path); + } + + $uploadName = $this->filenamePrefix.'-'.Str::lower(Str::random(8)).'.'.$this->fileExtension; + + $this->uploadDir->write($uploadName, $encodedImage); + + $this->settings->set($this->filePathSettingKey, $uploadName); + + return parent::data($request, $document); + } + + /** + * @param UploadedFileInterface $file + * @return Image + */ + abstract protected function makeImage(UploadedFileInterface $file): Image; +} diff --git a/src/Api/Controller/UploadLogoController.php b/src/Api/Controller/UploadLogoController.php index 8d73f7653e..246a102c97 100644 --- a/src/Api/Controller/UploadLogoController.php +++ b/src/Api/Controller/UploadLogoController.php @@ -10,60 +10,34 @@ namespace Flarum\Api\Controller; use Flarum\Settings\SettingsRepositoryInterface; -use Illuminate\Support\Arr; -use Illuminate\Support\Str; +use Intervention\Image\Image; use Intervention\Image\ImageManager; use League\Flysystem\FilesystemInterface; -use Psr\Http\Message\ServerRequestInterface; -use Tobscure\JsonApi\Document; +use Psr\Http\Message\UploadedFileInterface; -class UploadLogoController extends ShowForumController +class UploadLogoController extends UploadImageController { /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - /** - * @var FilesystemInterface - */ - protected $uploadDir; - - /** - * @param SettingsRepositoryInterface $settings - * @param FilesystemInterface $uploadDir + * {@inheritdoc} */ public function __construct(SettingsRepositoryInterface $settings, FilesystemInterface $uploadDir) { - $this->settings = $settings; - $this->uploadDir = $uploadDir; + parent::__construct($settings, $uploadDir); + + $this->filenamePrefix = 'logo'; + $this->filePathSettingKey = 'logo_path'; } /** * {@inheritdoc} */ - public function data(ServerRequestInterface $request, Document $document) - { - $request->getAttribute('actor')->assertAdmin(); - - $file = Arr::get($request->getUploadedFiles(), 'logo'); - - $manager = new ImageManager; + protected function makeImage(UploadedFileInterface $file): Image { + $manager = new ImageManager(); $encodedImage = $manager->make($file->getStream())->heighten(60, function ($constraint) { $constraint->upsize(); })->encode('png'); - if (($path = $this->settings->get('logo_path')) && $this->uploadDir->has($path)) { - $this->uploadDir->delete($path); - } - - $uploadName = 'logo-'.Str::lower(Str::random(8)).'.png'; - - $this->uploadDir->write($uploadName, $encodedImage); - - $this->settings->set('logo_path', $uploadName); - - return parent::data($request, $document); + return $encodedImage; } } From 6b0b975cd548ebfcbed0c5ca40500eb9e012e059 Mon Sep 17 00:00:00 2001 From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com> Date: Mon, 30 Nov 2020 21:14:08 +1100 Subject: [PATCH 2/4] Fixing StyleCI issues --- src/Api/Controller/UploadFaviconController.php | 3 ++- src/Api/Controller/UploadLogoController.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Api/Controller/UploadFaviconController.php b/src/Api/Controller/UploadFaviconController.php index 1fc65d35db..2a01a60458 100644 --- a/src/Api/Controller/UploadFaviconController.php +++ b/src/Api/Controller/UploadFaviconController.php @@ -31,7 +31,8 @@ public function __construct(SettingsRepositoryInterface $settings, FilesystemInt /** * {@inheritdoc} */ - protected function makeImage(UploadedFileInterface $file): Image { + protected function makeImage(UploadedFileInterface $file): Image + { $this->fileExtension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); if ($this->fileExtension === 'ico') { diff --git a/src/Api/Controller/UploadLogoController.php b/src/Api/Controller/UploadLogoController.php index 246a102c97..48fdb9eeec 100644 --- a/src/Api/Controller/UploadLogoController.php +++ b/src/Api/Controller/UploadLogoController.php @@ -31,7 +31,8 @@ public function __construct(SettingsRepositoryInterface $settings, FilesystemInt /** * {@inheritdoc} */ - protected function makeImage(UploadedFileInterface $file): Image { + protected function makeImage(UploadedFileInterface $file): Image + { $manager = new ImageManager(); $encodedImage = $manager->make($file->getStream())->heighten(60, function ($constraint) { From 58abbd8ef21e46d1eab78ebdf4104a7564ec3a96 Mon Sep 17 00:00:00 2001 From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com> Date: Tue, 1 Dec 2020 12:04:14 +1100 Subject: [PATCH 3/4] Addressed review comments --- src/Api/Controller/UploadFaviconController.php | 13 ++----------- src/Api/Controller/UploadLogoController.php | 13 ++----------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/Api/Controller/UploadFaviconController.php b/src/Api/Controller/UploadFaviconController.php index 2a01a60458..7278f789c8 100644 --- a/src/Api/Controller/UploadFaviconController.php +++ b/src/Api/Controller/UploadFaviconController.php @@ -9,24 +9,15 @@ namespace Flarum\Api\Controller; -use Flarum\Settings\SettingsRepositoryInterface; use Intervention\Image\Image; use Intervention\Image\ImageManager; -use League\Flysystem\FilesystemInterface; use Psr\Http\Message\UploadedFileInterface; class UploadFaviconController extends UploadImageController { - /** - * {@inheritdoc} - */ - public function __construct(SettingsRepositoryInterface $settings, FilesystemInterface $uploadDir) - { - parent::__construct($settings, $uploadDir); + protected $filePathSettingKey = 'favicon_path'; - $this->filenamePrefix = 'favicon'; - $this->filePathSettingKey = 'favicon_path'; - } + protected $filenamePrefix = 'favicon'; /** * {@inheritdoc} diff --git a/src/Api/Controller/UploadLogoController.php b/src/Api/Controller/UploadLogoController.php index 48fdb9eeec..ba760b5277 100644 --- a/src/Api/Controller/UploadLogoController.php +++ b/src/Api/Controller/UploadLogoController.php @@ -9,24 +9,15 @@ namespace Flarum\Api\Controller; -use Flarum\Settings\SettingsRepositoryInterface; use Intervention\Image\Image; use Intervention\Image\ImageManager; -use League\Flysystem\FilesystemInterface; use Psr\Http\Message\UploadedFileInterface; class UploadLogoController extends UploadImageController { - /** - * {@inheritdoc} - */ - public function __construct(SettingsRepositoryInterface $settings, FilesystemInterface $uploadDir) - { - parent::__construct($settings, $uploadDir); + protected $filePathSettingKey = 'logo_path'; - $this->filenamePrefix = 'logo'; - $this->filePathSettingKey = 'logo_path'; - } + protected $filenamePrefix = 'logo'; /** * {@inheritdoc} From f1c486ae9e24c99e34235d27f9c4e5c536f0c11d Mon Sep 17 00:00:00 2001 From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com> Date: Tue, 1 Dec 2020 12:12:52 +1100 Subject: [PATCH 4/4] Adding empty string defaults to new class variables --- src/Api/Controller/UploadImageController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Api/Controller/UploadImageController.php b/src/Api/Controller/UploadImageController.php index 33f760dc8b..28cae290e4 100644 --- a/src/Api/Controller/UploadImageController.php +++ b/src/Api/Controller/UploadImageController.php @@ -38,12 +38,12 @@ abstract class UploadImageController extends ShowForumController /** * @var string */ - protected $filePathSettingKey; + protected $filePathSettingKey = ''; /** * @var string */ - protected $filenamePrefix; + protected $filenamePrefix = ''; /** * @param SettingsRepositoryInterface $settings