From 5a763050a6b66fe83493f79a36187d933502c344 Mon Sep 17 00:00:00 2001 From: Nina Pypchenko <22447785+nina-py@users.noreply.github.com> Date: Wed, 2 Dec 2020 02:42:05 +1100 Subject: [PATCH] DRY up image uploading code (#2477) --- .../Controller/UploadFaviconController.php | 59 +++---------- src/Api/Controller/UploadImageController.php | 87 +++++++++++++++++++ src/Api/Controller/UploadLogoController.php | 50 ++--------- 3 files changed, 108 insertions(+), 88 deletions(-) create mode 100644 src/Api/Controller/UploadImageController.php diff --git a/src/Api/Controller/UploadFaviconController.php b/src/Api/Controller/UploadFaviconController.php index 09b9de790..7278f789c 100644 --- a/src/Api/Controller/UploadFaviconController.php +++ b/src/Api/Controller/UploadFaviconController.php @@ -9,69 +9,36 @@ 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; + protected $filePathSettingKey = 'favicon_path'; - /** - * @var FilesystemInterface - */ - protected $uploadDir; - - /** - * @param SettingsRepositoryInterface $settings - * @param FilesystemInterface $uploadDir - */ - public function __construct(SettingsRepositoryInterface $settings, FilesystemInterface $uploadDir) - { - $this->settings = $settings; - $this->uploadDir = $uploadDir; - } + protected $filenamePrefix = 'favicon'; /** * {@inheritdoc} */ - public function data(ServerRequestInterface $request, Document $document) + protected function makeImage(UploadedFileInterface $file): Image { - $request->getAttribute('actor')->assertAdmin(); + $this->fileExtension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); - $file = Arr::get($request->getUploadedFiles(), 'favicon'); - $extension = 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'; + $this->fileExtension = 'png'; } - if (($path = $this->settings->get('favicon_path')) && $this->uploadDir->has($path)) { - $this->uploadDir->delete($path); - } - - $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 000000000..28cae290e --- /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 8d73f7653..ba760b527 100644 --- a/src/Api/Controller/UploadLogoController.php +++ b/src/Api/Controller/UploadLogoController.php @@ -9,61 +9,27 @@ 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; + protected $filePathSettingKey = 'logo_path'; - /** - * @var FilesystemInterface - */ - protected $uploadDir; - - /** - * @param SettingsRepositoryInterface $settings - * @param FilesystemInterface $uploadDir - */ - public function __construct(SettingsRepositoryInterface $settings, FilesystemInterface $uploadDir) - { - $this->settings = $settings; - $this->uploadDir = $uploadDir; - } + protected $filenamePrefix = 'logo'; /** * {@inheritdoc} */ - public function data(ServerRequestInterface $request, Document $document) + protected function makeImage(UploadedFileInterface $file): Image { - $request->getAttribute('actor')->assertAdmin(); - - $file = Arr::get($request->getUploadedFiles(), 'logo'); - - $manager = new ImageManager; + $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; } }