From 54ba15186a557ea32d3f9da9f7e440896fc2c627 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Mon, 10 Jun 2024 14:39:27 -0400 Subject: [PATCH 1/5] FOUR-15798 --- .../Controllers/Api/SlideshowController.php | 55 +++++++++++++++++++ .../Exporters/ProcessExporter.php | 5 +- ProcessMaker/Models/Media.php | 19 ++++++- routes/api.php | 6 ++ 4 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 ProcessMaker/Http/Controllers/Api/SlideshowController.php diff --git a/ProcessMaker/Http/Controllers/Api/SlideshowController.php b/ProcessMaker/Http/Controllers/Api/SlideshowController.php new file mode 100644 index 0000000000..b3a211895f --- /dev/null +++ b/ProcessMaker/Http/Controllers/Api/SlideshowController.php @@ -0,0 +1,55 @@ +input('imagesSlideshow'); + if (!empty($content)) { + foreach ($content as $row) { + $media = new Media(); + $media->saveProcessMedia($process, $row, 'uuid', Media::COLLECTION_SLIDESHOW); + } + } + } catch (\Exception $e) { + return response()->json(['error' => $e->getMessage()], 400); + } + + return new ApiResource([ + 'success' => true, + 'message' => 'File uploaded successfully', + 'data' => $media + ], 201); + } + + public function delete(Request $request, Process $process) + { + // Get UUID in the table + $uuid = $request->input('uuid'); + + $media = Media::where('uuid', $uuid) + ->first(); + + // Check if embed before delete + if ($media) { + $media->delete(); + } + } +} diff --git a/ProcessMaker/ImportExport/Exporters/ProcessExporter.php b/ProcessMaker/ImportExport/Exporters/ProcessExporter.php index 5a030af513..f569118e52 100644 --- a/ProcessMaker/ImportExport/Exporters/ProcessExporter.php +++ b/ProcessMaker/ImportExport/Exporters/ProcessExporter.php @@ -9,6 +9,7 @@ use ProcessMaker\ImportExport\Psudomodels\Signal; use ProcessMaker\ImportExport\Utils; use ProcessMaker\Models\Group; +use ProcessMaker\Models\Media; use ProcessMaker\Models\Process; use ProcessMaker\Models\ProcessCategory; use ProcessMaker\Models\Screen; @@ -67,7 +68,6 @@ public function export() : void $this->exportSubprocesses(); $this->exportProcessLaunchpad(); $this->exportMedia(); - $this->exportEmbed(); } @@ -437,11 +437,12 @@ public function importEmbed(): void */ public function exportMedia(): void { - $this->model->media->each(function ($media) { + $this->model->media->where('collection_name', '!=', Media::COLLECTION_SLIDESHOW)->each(function ($media) { $this->addDependent(DependentType::MEDIA, $media, MediaExporter::class); }); } + /** * Imports media for the process. */ diff --git a/ProcessMaker/Models/Media.php b/ProcessMaker/Models/Media.php index 98a2008270..1f37240d2f 100644 --- a/ProcessMaker/Models/Media.php +++ b/ProcessMaker/Models/Media.php @@ -65,6 +65,8 @@ class Media extends MediaLibraryModel protected $table = 'media'; + const COLLECTION_SLIDESHOW = 'slideshow'; + /** * The attributes that are mass assignable. * @@ -119,6 +121,16 @@ public static function rules($existing = null) 'model_id', ]; + public function determineCollectionName(Process $process, $name) + { + if ($name === 'launchpad') { + return $process->uuid . '_' . 'images_carousel'; + } elseif ($name === self::COLLECTION_SLIDESHOW) { + return 'images_slideshow'; + } + return null; + } + /** * Override the default boot method to allow access to lifecycle hooks * @@ -184,10 +196,11 @@ public function getManagerUrlAttribute() * @param Process $process * @param array $properties * @param string $key + * @param string $subtype * * @return void */ - public function saveProcessMedia(Process $process, $properties, $key = 'uuid') + public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $subtype = 'launchpad') { // Validate if the image smaller than 2MB $maxFileSize = 2 * 1024 * 1024; @@ -200,8 +213,8 @@ public function saveProcessMedia(Process $process, $properties, $key = 'uuid') if ($mediaCount > 4) { return; } - // Get information to save - $collectionName = $process->uuid . '_images_carousel'; + // Get collection name to save + $collectionName = self::determineCollectionName($process, $subtype); $exist = $process->media()->where($key, $properties[$key])->exists(); if (!$exist) { // Store the images related move to MEDIA diff --git a/routes/api.php b/routes/api.php index 7ca9f54b60..63b20f2713 100644 --- a/routes/api.php +++ b/routes/api.php @@ -30,6 +30,7 @@ use ProcessMaker\Http\Controllers\Api\SecurityLogController; use ProcessMaker\Http\Controllers\Api\SettingController; use ProcessMaker\Http\Controllers\Api\SignalController; +use ProcessMaker\Http\Controllers\Api\SlideshowController; use ProcessMaker\Http\Controllers\Api\TaskAssignmentController; use ProcessMaker\Http\Controllers\Api\TaskController; use ProcessMaker\Http\Controllers\Api\TaskDraftController; @@ -182,6 +183,11 @@ Route::get('processes/{process}/media', [ProcessController::class, 'getMediaImages'])->name('processes.media')->middleware('can:view-processes'); Route::delete('processes/{process}/media', [ProcessController::class, 'deleteMediaImages'])->name('processes.delete-media')->middleware('can:view-processes'); + // Process Slideshow + Route::get('slideshow/{process}', [SlideshowController::class, 'index'])->name('slideshow.index')->middleware('can:edit-processes,process'); + Route::put('slideshow/{process}', [SlideshowController::class, 'store'])->name('slideshow.store')->middleware('can:edit-processes,process'); + Route::delete('slideshow/{process}', [SlideshowController::class, 'delete'])->name('slideshow.delete')->middleware('can:edit-processes,process'); + // Permissions Route::get('permissions', [PermissionController::class, 'index'])->name('permissions.index'); Route::put('permissions', [PermissionController::class, 'update'])->name('permissions.update')->middleware('can:edit-users'); From 4f28b70956557567d1ebdb065ee2798662853aa1 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Mon, 10 Jun 2024 15:50:28 -0400 Subject: [PATCH 2/5] Define the slideShow key into media --- .../Controllers/Api/ProcessLaunchpadController.php | 3 ++- .../Http/Controllers/Api/SlideshowController.php | 13 +++++++++++-- ProcessMaker/Models/Media.php | 8 +++++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/ProcessLaunchpadController.php b/ProcessMaker/Http/Controllers/Api/ProcessLaunchpadController.php index a25e7452e6..dfa57ef036 100644 --- a/ProcessMaker/Http/Controllers/Api/ProcessLaunchpadController.php +++ b/ProcessMaker/Http/Controllers/Api/ProcessLaunchpadController.php @@ -76,7 +76,8 @@ public function index(Request $request, Process $process) // Get the embed related $processes = Process::with('launchpad') ->with(['media' => function ($query) { - $query->orderBy('order_column', 'asc'); + $query->where('collection_name', '!=', Media::COLLECTION_SLIDESHOW) + ->orderBy('order_column', 'asc'); }]) ->with(['embed' => function ($query) { $query->orderBy('order_column', 'asc'); diff --git a/ProcessMaker/Http/Controllers/Api/SlideshowController.php b/ProcessMaker/Http/Controllers/Api/SlideshowController.php index b3a211895f..4266caf9b4 100644 --- a/ProcessMaker/Http/Controllers/Api/SlideshowController.php +++ b/ProcessMaker/Http/Controllers/Api/SlideshowController.php @@ -4,6 +4,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Validator; use ProcessMaker\Http\Resources\ApiCollection; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Resources\ApiResource; @@ -19,13 +20,22 @@ public function index (Request $request, Process $process) } public function store(Request $request, Process $process) { + $validator = Validator::make($request->all(), [ + 'imagesSlideshow' => 'required|array', + 'imagesSlideshow.url' => 'image|max:2048', + ]); + + if ($validator->fails()) { + return response()->json(['errors' => $validator->errors()], 422); + } + try { // Store the Slideshow images $content = $request->input('imagesSlideshow'); if (!empty($content)) { foreach ($content as $row) { $media = new Media(); - $media->saveProcessMedia($process, $row, 'uuid', Media::COLLECTION_SLIDESHOW); + $media->saveProcessMedia($process, $row, 'uuid', 'slideshow'); } } } catch (\Exception $e) { @@ -35,7 +45,6 @@ public function store(Request $request, Process $process) return new ApiResource([ 'success' => true, 'message' => 'File uploaded successfully', - 'data' => $media ], 201); } diff --git a/ProcessMaker/Models/Media.php b/ProcessMaker/Models/Media.php index 1f37240d2f..8c8d1bc1a6 100644 --- a/ProcessMaker/Models/Media.php +++ b/ProcessMaker/Models/Media.php @@ -65,7 +65,7 @@ class Media extends MediaLibraryModel protected $table = 'media'; - const COLLECTION_SLIDESHOW = 'slideshow'; + const COLLECTION_SLIDESHOW = 'images_slideshow'; /** * The attributes that are mass assignable. @@ -123,10 +123,11 @@ public static function rules($existing = null) public function determineCollectionName(Process $process, $name) { + // In order to differentiate them from other process-related images ['launchpad', 'slideshow'] if ($name === 'launchpad') { return $process->uuid . '_' . 'images_carousel'; - } elseif ($name === self::COLLECTION_SLIDESHOW) { - return 'images_slideshow'; + } elseif ($name === 'slideshow') { + return self::COLLECTION_SLIDESHOW; } return null; } @@ -215,6 +216,7 @@ public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $ } // Get collection name to save $collectionName = self::determineCollectionName($process, $subtype); + // Check if exist $exist = $process->media()->where($key, $properties[$key])->exists(); if (!$exist) { // Store the images related move to MEDIA From 9b4bb79b031faa1b996558103e46d61764dd840a Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Wed, 12 Jun 2024 13:05:11 -0400 Subject: [PATCH 3/5] FOUR-15798: moving the API into the package --- .../Controllers/Api/SlideshowController.php | 64 ------------------- .../Exporters/ProcessExporter.php | 1 - routes/api.php | 6 -- 3 files changed, 71 deletions(-) delete mode 100644 ProcessMaker/Http/Controllers/Api/SlideshowController.php diff --git a/ProcessMaker/Http/Controllers/Api/SlideshowController.php b/ProcessMaker/Http/Controllers/Api/SlideshowController.php deleted file mode 100644 index 4266caf9b4..0000000000 --- a/ProcessMaker/Http/Controllers/Api/SlideshowController.php +++ /dev/null @@ -1,64 +0,0 @@ -all(), [ - 'imagesSlideshow' => 'required|array', - 'imagesSlideshow.url' => 'image|max:2048', - ]); - - if ($validator->fails()) { - return response()->json(['errors' => $validator->errors()], 422); - } - - try { - // Store the Slideshow images - $content = $request->input('imagesSlideshow'); - if (!empty($content)) { - foreach ($content as $row) { - $media = new Media(); - $media->saveProcessMedia($process, $row, 'uuid', 'slideshow'); - } - } - } catch (\Exception $e) { - return response()->json(['error' => $e->getMessage()], 400); - } - - return new ApiResource([ - 'success' => true, - 'message' => 'File uploaded successfully', - ], 201); - } - - public function delete(Request $request, Process $process) - { - // Get UUID in the table - $uuid = $request->input('uuid'); - - $media = Media::where('uuid', $uuid) - ->first(); - - // Check if embed before delete - if ($media) { - $media->delete(); - } - } -} diff --git a/ProcessMaker/ImportExport/Exporters/ProcessExporter.php b/ProcessMaker/ImportExport/Exporters/ProcessExporter.php index f569118e52..94a425902b 100644 --- a/ProcessMaker/ImportExport/Exporters/ProcessExporter.php +++ b/ProcessMaker/ImportExport/Exporters/ProcessExporter.php @@ -442,7 +442,6 @@ public function exportMedia(): void }); } - /** * Imports media for the process. */ diff --git a/routes/api.php b/routes/api.php index 63b20f2713..7ca9f54b60 100644 --- a/routes/api.php +++ b/routes/api.php @@ -30,7 +30,6 @@ use ProcessMaker\Http\Controllers\Api\SecurityLogController; use ProcessMaker\Http\Controllers\Api\SettingController; use ProcessMaker\Http\Controllers\Api\SignalController; -use ProcessMaker\Http\Controllers\Api\SlideshowController; use ProcessMaker\Http\Controllers\Api\TaskAssignmentController; use ProcessMaker\Http\Controllers\Api\TaskController; use ProcessMaker\Http\Controllers\Api\TaskDraftController; @@ -183,11 +182,6 @@ Route::get('processes/{process}/media', [ProcessController::class, 'getMediaImages'])->name('processes.media')->middleware('can:view-processes'); Route::delete('processes/{process}/media', [ProcessController::class, 'deleteMediaImages'])->name('processes.delete-media')->middleware('can:view-processes'); - // Process Slideshow - Route::get('slideshow/{process}', [SlideshowController::class, 'index'])->name('slideshow.index')->middleware('can:edit-processes,process'); - Route::put('slideshow/{process}', [SlideshowController::class, 'store'])->name('slideshow.store')->middleware('can:edit-processes,process'); - Route::delete('slideshow/{process}', [SlideshowController::class, 'delete'])->name('slideshow.delete')->middleware('can:edit-processes,process'); - // Permissions Route::get('permissions', [PermissionController::class, 'index'])->name('permissions.index'); Route::put('permissions', [PermissionController::class, 'update'])->name('permissions.update')->middleware('can:edit-users'); From f630a4eee998c25dc1cd5d40ad7defeed26f58d0 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Thu, 13 Jun 2024 12:41:25 -0400 Subject: [PATCH 4/5] Adding the media_type --- ProcessMaker/Models/Media.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ProcessMaker/Models/Media.php b/ProcessMaker/Models/Media.php index 8c8d1bc1a6..4452b0208e 100644 --- a/ProcessMaker/Models/Media.php +++ b/ProcessMaker/Models/Media.php @@ -197,11 +197,11 @@ public function getManagerUrlAttribute() * @param Process $process * @param array $properties * @param string $key - * @param string $subtype + * @param string $mediaType * * @return void */ - public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $subtype = 'launchpad') + public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $mediaType = 'launchpad') { // Validate if the image smaller than 2MB $maxFileSize = 2 * 1024 * 1024; @@ -215,13 +215,17 @@ public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $ return; } // Get collection name to save - $collectionName = self::determineCollectionName($process, $subtype); + $collectionName = self::determineCollectionName($process, $mediaType); // Check if exist $exist = $process->media()->where($key, $properties[$key])->exists(); if (!$exist) { // Store the images related move to MEDIA $process->addMediaFromBase64($properties['url']) - ->withCustomProperties(['type' => $properties['type']]) + ->withCustomProperties([ + 'media_type' => $mediaType, + 'type' => $properties['type'], + 'id' => $properties['node_identifier'], + ]) ->toMediaCollection($collectionName); } } From 9ed59c895d5d78c44919fbeb721fa30a94668c80 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Thu, 13 Jun 2024 15:03:10 -0400 Subject: [PATCH 5/5] update the name of node --- ProcessMaker/Models/Media.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Models/Media.php b/ProcessMaker/Models/Media.php index 4452b0208e..36a3d43b0f 100644 --- a/ProcessMaker/Models/Media.php +++ b/ProcessMaker/Models/Media.php @@ -224,7 +224,7 @@ public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $ ->withCustomProperties([ 'media_type' => $mediaType, 'type' => $properties['type'], - 'id' => $properties['node_identifier'], + 'node_id' => $properties['node_id'], ]) ->toMediaCollection($collectionName); }