From 9ed9626e9d049836cba12cf6d5264e7c634c5c4e Mon Sep 17 00:00:00 2001 From: Andy Heathershaw Date: Sat, 5 Nov 2016 09:41:07 +0000 Subject: [PATCH] [touch: 33] Added support for uploading files to Rackspace. Split out the OpenStack options into a separate template to match the Amazon one. Added validation to the Amazon options. --- app/AlbumSources/OpenStackSource.php | 4 +- app/AlbumSources/RackspaceSource.php | 63 ++++++++++ app/Helpers/ConfigHelper.php | 4 +- app/Http/Requests/StoreStorageRequest.php | 30 +++++ resources/lang/en/forms.php | 1 + resources/lang/en/global.php | 3 +- .../base/admin/create_storage.blade.php | 107 +---------------- .../themes/base/admin/edit_storage.blade.php | 109 ++---------------- .../themes/base/admin/list_storage.blade.php | 1 + ...admin_storages_openstack_options.blade.php | 102 ++++++++++++++++ ...admin_storages_rackspace_options.blade.php | 53 +++++++++ 11 files changed, 269 insertions(+), 208 deletions(-) create mode 100644 app/AlbumSources/RackspaceSource.php create mode 100644 resources/views/themes/base/partials/admin_storages_openstack_options.blade.php create mode 100644 resources/views/themes/base/partials/admin_storages_rackspace_options.blade.php diff --git a/app/AlbumSources/OpenStackSource.php b/app/AlbumSources/OpenStackSource.php index 630f360..d3b99ee 100644 --- a/app/AlbumSources/OpenStackSource.php +++ b/app/AlbumSources/OpenStackSource.php @@ -140,12 +140,12 @@ class OpenStackSource extends AlbumSourceBase implements IAlbumSource ); } - private function getOriginalsFolder() + protected function getOriginalsFolder() { return '_originals'; } - private function getPathToPhoto(Photo $photo, $thumbnail = null) + protected function getPathToPhoto(Photo $photo, $thumbnail = null) { return sprintf( '%s/%s/%s', diff --git a/app/AlbumSources/RackspaceSource.php b/app/AlbumSources/RackspaceSource.php new file mode 100644 index 0000000..bcb42ee --- /dev/null +++ b/app/AlbumSources/RackspaceSource.php @@ -0,0 +1,63 @@ +configuration->service_region == 'LON') + { + $endpoint = Rackspace::UK_IDENTITY_ENDPOINT; + } + + return new Rackspace($endpoint, [ + 'username' => $this->configuration->username, + 'apiKey' => decrypt($this->configuration->password) + ]); + } + + /** + * Gets the name of this album source. + * @return string + */ + public function getName() + { + return 'global.album_sources.rackspace'; + } + + /** + * Gets the absolute URL to the given photo file. + * @param Photo $photo Photo to get the URL to. + * @param string $thumbnail Thumbnail to get the image to. + * @return string + */ + public function getUrlToPhoto(Photo $photo, $thumbnail = null) + { + $isCdnEnabled = false; + $cdnService = $this->getStorageService()->getCdnService(); + $thisCdnContainer = null; + + foreach ($cdnService->listContainers() as $cdnContainer) + { + if ($cdnContainer->name == $this->configuration->container_name) + { + $isCdnEnabled = true; + $thisCdnContainer = $cdnContainer; + } + } + + if ($isCdnEnabled) + { + return sprintf('%s/%s', $thisCdnContainer->getCdnSslUri(), $this->getPathToPhoto($photo, $thumbnail)); + } + + return parent::getPathToPhoto($photo, $thumbnail); + } +} \ No newline at end of file diff --git a/app/Helpers/ConfigHelper.php b/app/Helpers/ConfigHelper.php index c9ebc50..b03d06a 100644 --- a/app/Helpers/ConfigHelper.php +++ b/app/Helpers/ConfigHelper.php @@ -8,6 +8,7 @@ use App\AlbumSources\IAlbumSource; use App\AlbumSources\LocalFilesystemSource; use App\AlbumSources\OpenStackSource; use App\AlbumSources\OpenStackV1Source; +use App\AlbumSources\RackspaceSource; use App\Configuration; class ConfigHelper @@ -34,7 +35,8 @@ class ConfigHelper $classes = [ LocalFilesystemSource::class, AmazonS3Source::class, - OpenStackSource::class + OpenStackSource::class, + RackspaceSource::class ]; foreach ($classes as $class) { diff --git a/app/Http/Requests/StoreStorageRequest.php b/app/Http/Requests/StoreStorageRequest.php index 7320fda..8c445b9 100644 --- a/app/Http/Requests/StoreStorageRequest.php +++ b/app/Http/Requests/StoreStorageRequest.php @@ -36,6 +36,14 @@ class StoreStorageRequest extends FormRequest switch ($this->get('source')) { + case 'AmazonS3Source': + $result['auth_url'] = 'sometimes|url'; + $result['access_key'] = 'sometimes|required'; + $result['secret_key'] = 'sometimes|required'; + $result['service_region'] = 'sometimes|required'; + $result['container_name'] = 'sometimes|required'; + break; + case 'LocalFilesystemSource': $result['location'] = 'sometimes|required|is_dir|dir_empty|is_writeable'; break; @@ -50,6 +58,13 @@ class StoreStorageRequest extends FormRequest $result['container_name'] = 'sometimes|required'; $result['cdn_url'] = 'sometimes|url'; break; + + case 'RackspaceSource': + $result['username'] = 'sometimes|required'; + $result['password'] = 'sometimes|required'; + $result['service_region'] = 'sometimes|required'; + $result['container_name'] = 'sometimes|required'; + break; } break; @@ -63,6 +78,14 @@ class StoreStorageRequest extends FormRequest switch ($storage->source) { + case 'AmazonS3Source': + $result['auth_url'] = 'sometimes|url'; + $result['access_key'] = 'sometimes|required'; + $result['secret_key'] = 'sometimes|required'; + $result['service_region'] = 'sometimes|required'; + $result['container_name'] = 'sometimes|required'; + break; + case 'OpenStackSource': $result['auth_url'] = 'sometimes|required'; $result['tenant_name'] = 'sometimes|required'; @@ -73,6 +96,13 @@ class StoreStorageRequest extends FormRequest $result['container_name'] = 'sometimes|required'; $result['cdn_url'] = 'sometimes|url'; break; + + case 'RackspaceSource': + $result['username'] = 'sometimes|required'; + $result['password'] = 'sometimes|required'; + $result['service_region'] = 'sometimes|required'; + $result['container_name'] = 'sometimes|required'; + break; } break; } diff --git a/resources/lang/en/forms.php b/resources/lang/en/forms.php index 5b35dfa..ec308d6 100644 --- a/resources/lang/en/forms.php +++ b/resources/lang/en/forms.php @@ -31,6 +31,7 @@ return [ 'settings_restrict_originals_download_help' => 'With this option enabled, only the photo\'s owner can download the original high-resolution images.', 'storage_access_key_label' => 'Access key:', 'storage_active_label' => 'Location is active. Uncheck to prevent creating new albums in this location.', + 'storage_api_key_label' => 'API key:', 'storage_auth_url_label' => 'Authentication URL:', 'storage_bucket_name_label' => 'Bucket name:', 'storage_cdn_url_label' => 'Public CDN URL (if supported and enabled):', diff --git a/resources/lang/en/global.php b/resources/lang/en/global.php index 4905226..c33926c 100644 --- a/resources/lang/en/global.php +++ b/resources/lang/en/global.php @@ -3,7 +3,8 @@ return [ 'album_sources' => [ 'amazon_s3' => 'Amazon S3 (or S3-compatible)', 'filesystem' => 'Local filesystem', - 'openstack' => 'OpenStack cloud storage' + 'openstack' => 'OpenStack cloud storage', + 'rackspace' => 'Rackspace cloud storage' ], 'app_name' => 'Blue Twilight', 'copyright' => '© :years :link_startAndy Heathershaw:link_end', diff --git a/resources/views/themes/base/admin/create_storage.blade.php b/resources/views/themes/base/admin/create_storage.blade.php index 2cf7ac4..561a68f 100644 --- a/resources/views/themes/base/admin/create_storage.blade.php +++ b/resources/views/themes/base/admin/create_storage.blade.php @@ -159,113 +159,16 @@
-
-
-
- {!! Form::label('auth_url', trans('forms.storage_auth_url_label'), ['class' => 'control-label']) !!} - {!! Form::text('auth_url', old('auth_url'), ['class' => 'form-control']) !!} - - @if ($errors->has('auth_url')) - - {{ $errors->first('auth_url') }} - - @endif -
-
-
-
- {!! Form::label('tenant_name', trans('forms.storage_tenant_name_label'), ['class' => 'control-label']) !!} - {!! Form::text('tenant_name', old('tenant_name'), ['class' => 'form-control']) !!} - - @if ($errors->has('tenant_name')) - - {{ $errors->first('tenant_name') }} - - @endif -
-
-
- -
-
-
- {!! Form::label('username', trans('forms.username_label'), ['class' => 'control-label']) !!} - {!! Form::text('username', old('username'), ['class' => 'form-control']) !!} - - @if ($errors->has('username')) - - {{ $errors->first('username') }} - - @endif -
-
-
-
- {!! Form::label('password', trans('forms.password_label'), ['class' => 'control-label']) !!} - {!! Form::text('password', old('password'), ['class' => 'form-control']) !!} - - @if ($errors->has('password')) - - {{ $errors->first('password') }} - - @endif -
-
-
- -
-
-
- {!! Form::label('service_name', trans('forms.storage_service_name_label'), ['class' => 'control-label']) !!} - {!! Form::text('service_name', old('service_name'), ['class' => 'form-control']) !!} - - @if ($errors->has('service_name')) - - {{ $errors->first('service_name') }} - - @endif -
-
-
-
- {!! Form::label('service_region', trans('forms.storage_service_region_label'), ['class' => 'control-label']) !!} - {!! Form::text('service_region', old('service_region'), ['class' => 'form-control']) !!} - - @if ($errors->has('service_region')) - - {{ $errors->first('service_region') }} - - @endif -
-
-
- -
- {!! Form::label('container_name', trans('forms.storage_container_name_label'), ['class' => 'control-label']) !!} - {!! Form::text('container_name', old('container_name'), ['class' => 'form-control']) !!} - - @if ($errors->has('container_name')) - - {{ $errors->first('container_name') }} - - @endif -
- -
- {!! Form::label('cdn_url', trans('forms.storage_cdn_url_label'), ['class' => 'control-label']) !!} - {!! Form::text('cdn_url', old('cdn_url'), ['class' => 'form-control']) !!} - - @if ($errors->has('cdn_url')) - - {{ $errors->first('cdn_url') }} - - @endif -
+ @include(Theme::viewName('partials.admin_storages_openstack_options'))
@include(Theme::viewName('partials.admin_storages_amazon_s3_options'))
+ +
+ @include(Theme::viewName('partials.admin_storages_rackspace_options')) +
diff --git a/resources/views/themes/base/admin/edit_storage.blade.php b/resources/views/themes/base/admin/edit_storage.blade.php index 34c7b88..51912b4 100644 --- a/resources/views/themes/base/admin/edit_storage.blade.php +++ b/resources/views/themes/base/admin/edit_storage.blade.php @@ -50,114 +50,19 @@ @if ($storage->source == 'OpenStackSource')
-
-
-
- {!! Form::label('auth_url', trans('forms.storage_auth_url_label'), ['class' => 'control-label']) !!} - {!! Form::text('auth_url', old('auth_url'), ['class' => 'form-control']) !!} - - @if ($errors->has('auth_url')) - - {{ $errors->first('auth_url') }} - - @endif -
-
-
-
- {!! Form::label('tenant_name', trans('forms.storage_tenant_name_label'), ['class' => 'control-label']) !!} - {!! Form::text('tenant_name', old('tenant_name'), ['class' => 'form-control']) !!} - - @if ($errors->has('tenant_name')) - - {{ $errors->first('tenant_name') }} - - @endif -
-
-
- -
-
-
- {!! Form::label('username', trans('forms.username_label'), ['class' => 'control-label']) !!} - {!! Form::text('username', old('username'), ['class' => 'form-control']) !!} - - @if ($errors->has('username')) - - {{ $errors->first('username') }} - - @endif -
-
-
-
- {!! Form::label('password', trans('forms.password_label'), ['class' => 'control-label']) !!} - {!! Form::text('password', old('password'), ['class' => 'form-control']) !!} - - @if ($errors->has('password')) - - {{ $errors->first('password') }} - - @endif -
-
-
- -
-
-
- {!! Form::label('service_name', trans('forms.storage_service_name_label'), ['class' => 'control-label']) !!} - {!! Form::text('service_name', old('service_name'), ['class' => 'form-control']) !!} - - @if ($errors->has('service_name')) - - {{ $errors->first('service_name') }} - - @endif -
-
-
-
- {!! Form::label('service_region', trans('forms.storage_service_region_label'), ['class' => 'control-label']) !!} - {!! Form::text('service_region', old('service_region'), ['class' => 'form-control']) !!} - - @if ($errors->has('service_region')) - - {{ $errors->first('service_region') }} - - @endif -
-
-
- -
- {!! Form::label('container_name', trans('forms.storage_container_name_label'), ['class' => 'control-label']) !!} - {!! Form::text('container_name', old('container_name'), ['class' => 'form-control']) !!} - - @if ($errors->has('container_name')) - - {{ $errors->first('container_name') }} - - @endif -
- -
- {!! Form::label('cdn_url', trans('forms.storage_cdn_url_label'), ['class' => 'control-label']) !!} - {!! Form::text('cdn_url', old('cdn_url'), ['class' => 'form-control']) !!} - - @if ($errors->has('cdn_url')) - - {{ $errors->first('cdn_url') }} - - @endif -
+ @include(Theme::viewName('partials.admin_storages_openstack_options')) @endif @if ($storage->source == 'AmazonS3Source') +
@include(Theme::viewName('partials.admin_storages_amazon_s3_options')) @endif + @if ($storage->source == 'RackspaceSource') +
+ @include(Theme::viewName('partials.admin_storages_rackspace_options')) + @endif +
@lang('forms.cancel_action') {!! Form::submit(trans('forms.save_action'), ['class' => 'btn btn-success']) !!} diff --git a/resources/views/themes/base/admin/list_storage.blade.php b/resources/views/themes/base/admin/list_storage.blade.php index 2cc177d..02889c9 100644 --- a/resources/views/themes/base/admin/list_storage.blade.php +++ b/resources/views/themes/base/admin/list_storage.blade.php @@ -41,6 +41,7 @@ @if ($storage->source == 'LocalFilesystemSource'){{ $storage->location }}@endif @if ($storage->source == 'OpenStackSource'){{ $storage->container_name }} - {{ $storage->service_name }}, {{ $storage->service_region }}@endif @if ($storage->source == 'AmazonS3Source'){{ $storage->container_name }} - {{ $storage->service_region }}@endif + @if ($storage->source == 'RackspaceSource'){{ $storage->container_name }} - {{ $storage->service_region }}@endif diff --git a/resources/views/themes/base/partials/admin_storages_openstack_options.blade.php b/resources/views/themes/base/partials/admin_storages_openstack_options.blade.php new file mode 100644 index 0000000..19ae431 --- /dev/null +++ b/resources/views/themes/base/partials/admin_storages_openstack_options.blade.php @@ -0,0 +1,102 @@ +
+
+
+ {!! Form::label('auth_url', trans('forms.storage_auth_url_label'), ['class' => 'control-label']) !!} + {!! Form::text('auth_url', old('auth_url'), ['class' => 'form-control']) !!} + + @if ($errors->has('auth_url')) + + {{ $errors->first('auth_url') }} + + @endif +
+
+
+
+ {!! Form::label('tenant_name', trans('forms.storage_tenant_name_label'), ['class' => 'control-label']) !!} + {!! Form::text('tenant_name', old('tenant_name'), ['class' => 'form-control']) !!} + + @if ($errors->has('tenant_name')) + + {{ $errors->first('tenant_name') }} + + @endif +
+
+
+ +
+
+
+ {!! Form::label('username', trans('forms.username_label'), ['class' => 'control-label']) !!} + {!! Form::text('username', old('username'), ['class' => 'form-control']) !!} + + @if ($errors->has('username')) + + {{ $errors->first('username') }} + + @endif +
+
+
+
+ {!! Form::label('password', trans('forms.password_label'), ['class' => 'control-label']) !!} + {!! Form::text('password', old('password'), ['class' => 'form-control']) !!} + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
+
+
+ +
+
+
+ {!! Form::label('service_name', trans('forms.storage_service_name_label'), ['class' => 'control-label']) !!} + {!! Form::text('service_name', old('service_name'), ['class' => 'form-control']) !!} + + @if ($errors->has('service_name')) + + {{ $errors->first('service_name') }} + + @endif +
+
+
+
+ {!! Form::label('service_region', trans('forms.storage_service_region_label'), ['class' => 'control-label']) !!} + {!! Form::text('service_region', old('service_region'), ['class' => 'form-control']) !!} + + @if ($errors->has('service_region')) + + {{ $errors->first('service_region') }} + + @endif +
+
+
+ +
+ {!! Form::label('container_name', trans('forms.storage_container_name_label'), ['class' => 'control-label']) !!} + {!! Form::text('container_name', old('container_name'), ['class' => 'form-control']) !!} + + @if ($errors->has('container_name')) + + {{ $errors->first('container_name') }} + + @endif +
+ +
+ {!! Form::label('cdn_url', trans('forms.storage_cdn_url_label'), ['class' => 'control-label']) !!} + {!! Form::text('cdn_url', old('cdn_url'), ['class' => 'form-control']) !!} + + @if ($errors->has('cdn_url')) + + {{ $errors->first('cdn_url') }} + + @endif +
\ No newline at end of file diff --git a/resources/views/themes/base/partials/admin_storages_rackspace_options.blade.php b/resources/views/themes/base/partials/admin_storages_rackspace_options.blade.php new file mode 100644 index 0000000..e315059 --- /dev/null +++ b/resources/views/themes/base/partials/admin_storages_rackspace_options.blade.php @@ -0,0 +1,53 @@ +
+
+
+ {!! Form::label('username', trans('forms.username_label'), ['class' => 'control-label']) !!} + {!! Form::text('username', old('username'), ['class' => 'form-control']) !!} + + @if ($errors->has('username')) + + {{ $errors->first('username') }} + + @endif +
+
+
+
+ {!! Form::label('password', trans('forms.storage_api_key_label'), ['class' => 'control-label']) !!} + {!! Form::text('password', old('password'), ['class' => 'form-control']) !!} + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
+
+
+ +
+
+
+ {!! Form::label('service_region', trans('forms.storage_service_region_label'), ['class' => 'control-label']) !!} + {!! Form::text('service_region', old('service_region'), ['class' => 'form-control']) !!} + + @if ($errors->has('service_region')) + + {{ $errors->first('service_region') }} + + @endif +
+
+
+
+ {!! Form::label('container_name', trans('forms.storage_container_name_label'), ['class' => 'control-label']) !!} + {!! Form::text('container_name', old('container_name'), ['class' => 'form-control']) !!} + + @if ($errors->has('container_name')) + + {{ $errors->first('container_name') }} + + @endif +
+
+