From c5ecc8f839d44cd31c27c3ef8e559a663047d9a4 Mon Sep 17 00:00:00 2001 From: snipe Date: Sun, 11 May 2025 16:05:05 +0100 Subject: [PATCH] Use uploads presenter Signed-off-by: snipe --- .../Api/AssetModelFilesController.php | 139 ++++++++---------- .../Transformers/UploadedFilesTransformer.php | 14 ++ app/Presenters/UploadsPresenter.php | 77 ++++++++++ resources/views/blade/filestable.blade.php | 113 +------------- 4 files changed, 158 insertions(+), 185 deletions(-) create mode 100644 app/Presenters/UploadsPresenter.php diff --git a/app/Http/Controllers/Api/AssetModelFilesController.php b/app/Http/Controllers/Api/AssetModelFilesController.php index d0a4747bf4..4df801c32b 100644 --- a/app/Http/Controllers/Api/AssetModelFilesController.php +++ b/app/Http/Controllers/Api/AssetModelFilesController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\Api; use App\Helpers\StorageHelper; +use App\Http\Transformers\UploadedFilesTransformer; +use App\Models\Asset; use Illuminate\Support\Facades\Storage; use App\Helpers\Helper; use App\Http\Controllers\Controller; @@ -35,131 +37,118 @@ class AssetModelFilesController extends Controller * @since [v7.0.12] * @author [r-xyz] */ - public function store(UploadFileRequest $request, $assetModelId = null) : JsonResponse + public function store(UploadFileRequest $request, AssetModel $model) : JsonResponse { - // Start by checking if the asset being acted upon exists - if (! $assetModel = AssetModel::find($assetModelId)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); - } - + \Log::error('model files controller touched'); // Make sure we are allowed to update this asset - $this->authorize('update', $assetModel); + $this->authorize('update', $model); - if ($request->hasFile('file')) { - // If the file storage directory doesn't exist; create it - if (! Storage::exists('private_uploads/assetmodels')) { - Storage::makeDirectory('private_uploads/assetmodels', 775); - } - // Loop over the attached files and add them to the asset - foreach ($request->file('file') as $file) { - $file_name = $request->handleFile('private_uploads/assetmodels/','model-'.$assetModel->id, $file); - - $assetModel->logUpload($file_name, e($request->get('notes'))); - } - // All done - report success - return response()->json(Helper::formatStandardApiResponse('success', $assetModel, trans('admin/models/message.upload.success'))); + if ($request->hasFile('file')) { + // If the file storage directory doesn't exist, create it + if (! Storage::exists('private_uploads/assetmodels')) { + Storage::makeDirectory('private_uploads/assetmodels', 775); } - // We only reach here if no files were included in the POST, so tell the user this + // Loop over the attached files and add them to the asset + foreach ($request->file('file') as $file) { + $file_name = $request->handleFile('private_uploads/assetmodels/','model-'.$model->id, $file); + $files[] = $file_name; + $model->logUpload($file_name, $request->get('notes')); + \Log::error($file_name); + } + $files = Actionlog::select('action_logs.*')->where('action_type', '=', 'uploaded') + ->where('item_type', '=', AssetModel::class) + ->where('item_id', '=', $model->id)->whereIn('filename', $files) + ->get(); + + return response()->json(Helper::formatStandardApiResponse('success', (new UploadedFilesTransformer())->transformFilesArray($files, count($files)), trans('admin/hardware/message.upload.success'))); + } + + // No files were submitted return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.upload.nofiles')), 500); } /** * List the files for an asset. * - * @param int $assetmodel + * @param AssetModel $model * @since [v7.0.12] * @author [r-xyz] */ - public function list($assetmodel_id) : JsonResponse | array + public function list(AssetModel $model) : JsonResponse | array { - // Start by checking if the asset being acted upon exists - if (! $assetModel = AssetModel::find($assetmodel_id)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); - } - $assetmodel = AssetModel::with('uploads')->find($assetmodel_id); - $this->authorize('view', $assetmodel); - return (new AssetModelsTransformer)->transformAssetModelFiles($assetmodel, $assetmodel->uploads()->count()); + $assetmodel = AssetModel::with('uploads')->find($model); + $this->authorize('view', $model); + return (new AssetModelsTransformer)->transformAssetModelFiles($model, $model->uploads()->count()); } /** * Check for permissions and display the file. * - * @param int $assetModelId + * @param AssetModel $model * @param int $fileId * @return \Illuminate\Http\JsonResponse * @throws \Illuminate\Auth\Access\AuthorizationException * @since [v7.0.12] * @author [r-xyz] */ - public function show($assetModelId = null, $fileId = null) : JsonResponse | StreamedResponse | Storage | StorageHelper | BinaryFileResponse + public function show(AssetModel $model, $fileId = null) : JsonResponse | StreamedResponse | Storage | StorageHelper | BinaryFileResponse { - // Start by checking if the asset being acted upon exists - if (! $assetModel = AssetModel::find($assetModelId)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); + + $this->authorize('view', $model); + + // Check that the file being requested exists for the asset + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $model->id)->find($fileId)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.no_match', ['id' => $fileId])), 404); } - // the asset is valid - if (isset($assetModel->id)) { - $this->authorize('view', $assetModel); + // Form the full filename with path + $file = 'private_uploads/assetmodels/'.$log->filename; + Log::debug('Checking for '.$file); - // Check that the file being requested exists for the asset - if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $assetModel->id)->find($fileId)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.no_match', ['id' => $fileId])), 404); - } - - // Form the full filename with path - $file = 'private_uploads/assetmodels/'.$log->filename; - Log::debug('Checking for '.$file); - - if ($log->action_type == 'audit') { - $file = 'private_uploads/audits/'.$log->filename; - } - - // Check the file actually exists on the filesystem - if (! Storage::exists($file)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.does_not_exist', ['id' => $fileId])), 404); - } - - if (request('inline') == 'true') { - - $headers = [ - 'Content-Disposition' => 'inline', - ]; - - return Storage::download($file, $log->filename, $headers); - } - - return StorageHelper::downloader($file); + if ($log->action_type == 'audit') { + $file = 'private_uploads/audits/'.$log->filename; } + // Check the file actually exists on the filesystem + if (! Storage::exists($file)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.does_not_exist', ['id' => $fileId])), 404); + } + + if (request('inline') == 'true') { + + $headers = [ + 'Content-Disposition' => 'inline', + ]; + + return Storage::download($file, $log->filename, $headers); + } + + return StorageHelper::downloader($file); // Send back an error message + + //@TODO: respond if file doesn't exist return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.error', ['id' => $fileId])), 500); } /** * Delete the associated file * - * @param int $assetModelId + * @param AssetModel $model * @param int $fileId * @since [v7.0.12] * @author [r-xyz] */ - public function destroy($assetModelId = null, $fileId = null) : JsonResponse + public function destroy(AssetModel $model, $fileId = null) : JsonResponse { - // Start by checking if the asset being acted upon exists - if (! $assetModel = AssetModel::find($assetModelId)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); - } - $rel_path = 'private_uploads/assetmodels'; // the asset is valid - if (isset($assetModel->id)) { - $this->authorize('update', $assetModel); + if (isset($model->id)) { + $this->authorize('update', $model); // Check for the file $log = Actionlog::find($fileId); diff --git a/app/Http/Transformers/UploadedFilesTransformer.php b/app/Http/Transformers/UploadedFilesTransformer.php index a18c9f9b65..04cee280a0 100644 --- a/app/Http/Transformers/UploadedFilesTransformer.php +++ b/app/Http/Transformers/UploadedFilesTransformer.php @@ -5,6 +5,7 @@ namespace App\Http\Transformers; use App\Helpers\Helper; use App\Models\Actionlog; use App\Models\Asset; +use App\Models\AssetModel; use Illuminate\Support\Facades\Gate; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\Storage; @@ -30,6 +31,8 @@ class UploadedFilesTransformer // This will be used later as we extend out this transformer to handle more types of uploads if ($file->item_type == Asset::class) { $file_url = route('show/assetfile', [$file->item_id, $file->id]); + } elseif ($file->item_type == AssetModel::class) { + $file_url = route('show/modelfile', [$file->item_id, $file->id]); } $array = [ @@ -40,6 +43,7 @@ class UploadedFilesTransformer 'id' => (int) $file->adminuser->id, 'name'=> e($file->adminuser->present()->fullName), ] : null, + 'note' => e($file->note), 'created_at' => Helper::getFormattedDateObject($file->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($file->updated_at, 'datetime'), 'deleted_at' => Helper::getFormattedDateObject($file->deleted_at, 'datetime'), @@ -53,4 +57,14 @@ class UploadedFilesTransformer return $array; } + public function transformFilesArray(Collection $files, $total) + { + $array = []; + foreach ($files as $file) { + $array[] = self::transformFile($file); + } + + return $array; + } + } diff --git a/app/Presenters/UploadsPresenter.php b/app/Presenters/UploadsPresenter.php new file mode 100644 index 0000000000..17c5e3053a --- /dev/null +++ b/app/Presenters/UploadsPresenter.php @@ -0,0 +1,77 @@ + 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, + ], [ + 'field' => 'image', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => true, + ], + [ + 'field' => 'filename', + 'searchable' => true, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.file_name'), + 'visible' => true, + ], + [ + 'field' => 'note', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.notes'), + 'visible' => true, + ], + [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], + [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'available_actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'accessoriesActionsFormatter', + ], + ]; + + return json_encode($layout); + } + +} diff --git a/resources/views/blade/filestable.blade.php b/resources/views/blade/filestable.blade.php index 6c807984f4..8fa5f54d62 100644 --- a/resources/views/blade/filestable.blade.php +++ b/resources/views/blade/filestable.blade.php @@ -9,12 +9,13 @@
- - - - - - - - - - - - - - - - - @foreach ($object->uploads as $file) - - - - - - - - - - - - - - - - @endforeach - -
- {{trans('general.id')}} - - {{trans('general.file_type')}} - - {{ trans('general.image') }} - - {{ trans('general.file_name') }} - - {{ trans('general.filesize') }} - - {{ trans('general.notes') }} - - {{ trans('general.download') }} - - {{ trans('general.created_at') }} - - {{ trans('general.created_by') }} - - {{ trans('table.actions') }} -
- {{ $file->id }} - - @if (Storage::exists($filepath.$file->filename)) - {{ pathinfo($filepath.$file->filename, PATHINFO_EXTENSION) }} - - @endif - - - @if (($file->filename) && (Storage::exists($filepath.$file->filename))) - @if (Helper::checkUploadIsImage($file->get_src(str_plural(strtolower(class_basename(get_class($object))))))) - - - - @else - {{ trans('general.preview_not_available') }} - @endif - @else - - {{ trans('general.file_not_found') }} - @endif - - - {{ $file->filename }} - - {{ (Storage::exists($filepath.$file->filename)) ? Helper::formatFilesizeUnits(Storage::size($filepath.$file->filename)) : '' }} - - @if ($file->note) - {{ $file->note }} - @endif - - @if ($file->filename) - @if (Storage::exists($filepath.$file->filename)) - - - - {{ trans('general.download') }} - - - - - - - @endif - @endif - - {{ $file->created_at }} - - {{ ($file->adminuser) ? $file->adminuser->present()->getFullNameAttribute() : '' }} - - - - {{ trans('general.delete') }} - -
\ No newline at end of file