From 07fa9639b5bdf264064bd2d078014f0c573ddf4c Mon Sep 17 00:00:00 2001 From: Andy Heathershaw Date: Sat, 13 Jul 2019 10:27:35 +0100 Subject: [PATCH] #123: The setting tab now only lists compatible storages. Added support for IAnalysisQueueSource to the LocalFileSystemSource driver --- app/AlbumSources/LocalFilesystemSource.php | 85 ++++++++++++++++++- app/Helpers/AnalysisQueueHelper.php | 39 +++++++++ .../Controllers/Admin/DefaultController.php | 7 +- .../themes/base/admin/settings.blade.php | 2 +- 4 files changed, 126 insertions(+), 7 deletions(-) diff --git a/app/AlbumSources/LocalFilesystemSource.php b/app/AlbumSources/LocalFilesystemSource.php index d2640bc..e2e31bc 100644 --- a/app/AlbumSources/LocalFilesystemSource.php +++ b/app/AlbumSources/LocalFilesystemSource.php @@ -3,6 +3,7 @@ namespace App\AlbumSources; use App\Album; +use App\Helpers\FileHelper; use App\Helpers\MiscHelper; use App\Photo; use App\Services\PhotoService; @@ -13,7 +14,7 @@ use Symfony\Component\HttpFoundation\File\File; * Driver for managing files on the local filesystem. * @package App\AlbumSources */ -class LocalFilesystemSource extends AlbumSourceBase implements IAlbumSource +class LocalFilesystemSource extends AlbumSourceBase implements IAlbumSource, IAnalysisQueueSource { public function deleteAlbumContents() { @@ -120,4 +121,86 @@ class LocalFilesystemSource extends AlbumSourceBase implements IAlbumSource rmdir($directory); } + + /** + * Deletes a photo to be analysed from the storage source + * @param string $queueToken Queue token holding the photo + * @param string $fileName Filename of the photo to download + * @return void + */ + public function deleteItemFromAnalysisQueue($queueToken, $fileName) + { + $queueFolder = $this->getQueuePath($queueToken); + $filePath = $this->getQueueItemPath($queueToken, $fileName); + @unlink($filePath); + + // Delete the parent folder if empty + FileHelper::deleteIfEmpty($queueFolder); + } + + /** + * Downloads a photo to be analysed from the storage source to a temporary file + * @param string $queueToken Queue token holding the photo + * @param string $fileName Filename of the photo to download + * @return string Path to the photo that was downloaded + */ + public function fetchItemFromAnalysisQueue($queueToken, $fileName) + { + // Don't actually need to download anything as it's already local + return $this->getQueueItemPath($queueToken, $fileName); + } + + /** + * Uploads a new file to the analysis queue specified by queue token. + * + * @param string $sourceFilePath Path to the file to upload to the analysis queue + * @param string $queueToken Queue token to hold the photo + * @param string $overrideFilename Use a specific filename, or false to set a specific name + * @return string Path to the file + */ + public function uploadToAnalysisQueue($sourceFilePath, $queueToken, $overrideFilename = null) + { + $uploadedFile = new File($sourceFilePath); + + $tempFilename = $this->getQueueItemPath( + $queueToken, + is_null($overrideFilename) ? MiscHelper::randomString(20) : basename($overrideFilename) + ); + + // Only add an extension if an override filename was not given, assume this is present + if (is_null($overrideFilename)) + { + $extension = $uploadedFile->guessExtension(); + if (!is_null($extension)) + { + $tempFilename .= '.' . $extension; + } + } + + $uploadedFile->move(dirname($tempFilename), basename($tempFilename)); + return $tempFilename; + } + + private function getQueueItemPath($queueToken, $fileName) + { + return join(DIRECTORY_SEPARATOR, [$this->getQueuePath($queueToken), $fileName]); + } + + private function getQueuePath($queueUid) + { + $path = join(DIRECTORY_SEPARATOR, [ + dirname(dirname(__DIR__)), + 'storage', + 'app', + 'analysis-queue', + str_replace(['.', '/', '\\'], '', $queueUid) + ]); + + if (!file_exists($path)) + { + @mkdir($path, 0755, true); + } + + return $path; + } } \ No newline at end of file diff --git a/app/Helpers/AnalysisQueueHelper.php b/app/Helpers/AnalysisQueueHelper.php index b62da67..2f45811 100644 --- a/app/Helpers/AnalysisQueueHelper.php +++ b/app/Helpers/AnalysisQueueHelper.php @@ -16,10 +16,49 @@ class AnalysisQueueHelper { $queueStorage = Storage::find(UserConfig::get('analysis_queue_storage_location')); + $queueSource = self::createStorageSource($queueStorage); + if (is_null($queueSource)) + { + throw new \Exception(sprintf('Queue storage \'%s\' does not support the analysis queue', $queueStorage->name)); + } + + return $queueSource; + } + + /** + * Gets a list of compatible storage sources for the analysis queue. + * @return array + */ + public static function getCompatibleStorages() + { + $storageSources = []; + + foreach (Storage::where('is_active', true)->orderBy('name')->get() as $storage) + { + $queueSource = self::createStorageSource($storage); + + if (is_null($queueSource)) + { + continue; + } + + $storageSources[$storage->id] = $storage->name; + } + + return $storageSources; + } + + private static function createStorageSource(Storage $queueStorage) + { $fullClassName = sprintf('App\AlbumSources\%s', $queueStorage->source); /** @var IAnalysisQueueSource $source */ $source = new $fullClassName; + if (!$source instanceof IAnalysisQueueSource) + { + return null; + } + $source->setConfiguration($queueStorage); return $source; diff --git a/app/Http/Controllers/Admin/DefaultController.php b/app/Http/Controllers/Admin/DefaultController.php index 803f354..f4b2546 100644 --- a/app/Http/Controllers/Admin/DefaultController.php +++ b/app/Http/Controllers/Admin/DefaultController.php @@ -7,6 +7,7 @@ use App\Configuration; use App\Facade\Theme; use App\Facade\UserConfig; use App\Group; +use App\Helpers\AnalysisQueueHelper; use App\Helpers\ConfigHelper; use App\Helpers\DbHelper; use App\Helpers\MiscHelper; @@ -370,11 +371,7 @@ class DefaultController extends Controller $themeNamesLookup = UserConfig::allowedThemeNames(); // Storage sources for the Image Processing tab - $storageSources = []; - foreach (Storage::where('is_active', true)->orderBy('name')->get() as $storage) - { - $storageSources[$storage->id] = $storage->name; - } + $storageSources = AnalysisQueueHelper::getCompatibleStorages(); return Theme::render('admin.settings', [ 'config' => $config, diff --git a/resources/views/themes/base/admin/settings.blade.php b/resources/views/themes/base/admin/settings.blade.php index 335364a..db32136 100644 --- a/resources/views/themes/base/admin/settings.blade.php +++ b/resources/views/themes/base/admin/settings.blade.php @@ -201,7 +201,7 @@

@lang('admin.settings.analysis_queue_storage_intro')

@lang('admin.settings.analysis_queue_storage_intro_2')

-
+

@lang('admin.settings.analysis_queue_storage_warning')