'required', 'model_type' => 'required', 'collection_name' => 'required', 'name' => 'required,alpha_spaces', 'file_name' => 'required', 'mime_type' => 'required', 'disk' => 'required', 'size' => 'required', 'manipulations' => 'required', 'custom_properties' => 'required', 'responsive_images' => 'required', 'order_column' => 'required', ]; } /** * The binary UUID attributes that should be converted to text. * * @var array */ protected $ids = [ 'model_id', ]; 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 === 'slideshow') { return self::COLLECTION_SLIDESHOW; } return null; } /** * Override the default boot method to allow access to lifecycle hooks * * @return null */ public static function boot() { parent::boot(); self::creating(function ($media) { $user = pmUser(); if (!$media->hasCustomProperty('createdBy')) { $media->setCustomProperty('createdBy', $user ? $user->id : null); } $media->setCustomProperty('updatedBy', $user ? $user->id : null); }); self::saving(function ($media) { if ($media->model instanceof ProcessRequest) { if (empty($media->getCustomProperty('data_name'))) { throw ValidationException::withMessages(['data_name' => 'data_name is required']); } } $media->setCustomProperty('updatedBy', pmUser() ? pmUser()->id : null); }); } public function isPublicFile() { if ($this->model instanceof ProcessRequest) { if ($this->model->process && $this->model->process->package_key == 'package-files/public-files') { return true; } } return false; } public function getManagerNameAttribute() { if (isset($this->custom_properties['data_name'])) { return last(explode('/', $this->custom_properties['data_name'])); } else { return $this->name; } } public function getManagerUrlAttribute() { if ($this->isPublicFile()) { $route = route('file-manager.index'); return $route . '#/public/' . $this->custom_properties['data_name']; } else { return route('requests.show.files.viewer', [ 'request' => $this->model, 'filePath' => $this->custom_properties['data_name'], ]); } } /** * Save the media related to the Process * * @param Process $process * @param array $properties * @param string $key * @param string $mediaType * * @return void */ public function saveProcessMedia(Process $process, $properties, $key = 'uuid', $mediaType = 'launchpad') { // Validate if the image smaller than 2MB $maxFileSize = 2 * 1024 * 1024; $imageData = base64_decode($properties['url']); if (strlen($imageData) > $maxFileSize) { return; } // Validate four images $mediaCount = $process->getMedia()->count(); if ($mediaCount > 4) { return; } // Get collection name to save $collectionName = self::determineCollectionName($process, $mediaType); // Check if exist $exist = $process->media()->where($key, $properties[$key])->exists(); if (!$exist) { // Define the custom properties $customProperties = [ 'media_type' => $mediaType, 'type' => $properties['type'], ]; if ($mediaType === 'slideshow') { $customProperties['node_id'] = $properties['node_id'] ?? ''; $customProperties['alternative'] = $properties['alternative'] ?? ''; } // Store the images related move to MEDIA $media = $process->addMediaFromBase64($properties['url']) ->withCustomProperties($customProperties); // Only if the file_name exist this will save if (isset($properties['file_name']) && !empty($properties['file_name'])) { $media->usingFileName($properties['file_name']); } // Add the media $media->toMediaCollection($collectionName); } } /** * getFilesRequest * * @param ProcessRequest $request * @return Collection | Media */ public static function getFilesRequest(ProcessRequest $request, $id = null) { $requestTokenIds = [$request->id]; if ($request->collaboration && $request->collaboration->requests()) { // Get all processes and subprocesses request token id's .. $requestTokenIds = $request->collaboration->requests->pluck('id')->toArray(); } // Return a single file when $id is set if ($id) { try { $mediaById = self::findOrFail($id); } catch (\Exception) { abort(400, __('Something went wrong and the file cannot be previewed or downloaded.')); } if (!in_array($mediaById->process_request_id, $requestTokenIds)) { abort(404, __('File is not part of this request')); } return $mediaById; } // Get all files for process and all subprocesses .. return self::where('model_type', ProcessRequest::class) ->whereIn('model_id', $requestTokenIds)->get(); } public function getProcessRequestIdAttribute() { if ($this->model_type == TaskDraft::class) { return $this->model->processRequestToken->processRequest->id; } elseif ($this->model_type == ProcessRequest::class) { return $this->model->id; } return null; } public function toArray() { $array = parent::toArray(); $array['process_request_id'] = $this->process_request_id; return $array; } /** * Check if the S3 is ready to use */ public static function s3IsReady() { return config('filesystems.disks.s3.key') && config('filesystems.disks.s3.secret') && config('filesystems.disks.s3.region') && config('filesystems.disks.s3.bucket'); } }