����JFIF��x�x����'
| Server IP : 78.140.185.180  /  Your IP : 216.73.216.38 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/builderbox/././././././www/common/Files/Actions/  | 
Upload File :  | 
<?php
namespace Common\Files\Actions;
use App\User;
use Auth;
use Common\Files\Events\FileEntryCreated;
use Common\Files\FileEntry;
use Common\Workspaces\ActiveWorkspace;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\UploadedFile;
use Arr;
use Str;
class CreateFileEntry
{
    /**
     * @var FileEntry
     */
    private $entry;
    /**
     * @param FileEntry $entry
     */
    public function __construct(FileEntry $entry)
    {
        $this->entry = $entry;
    }
    /**
     * @param UploadedFile|array $fileOrData
     * @param $extra
     * @return FileEntry
     */
    public function execute($fileOrData, $extra)
    {
        if (is_array($fileOrData)) {
            $data = Arr::except($fileOrData, ['contents']);
        } else {
            $data = app(UploadedFileToArray::class)->execute($fileOrData);
        }
        
        // merge extra data specified by user
        $userId = Arr::get($extra, 'userId', Auth::id());
        $data = array_merge($data, [
            'parent_id' => Arr::get($extra, 'parentId'),
            'disk_prefix' => Arr::get($extra, 'diskPrefix'),
            'public' => !!Arr::get($extra, 'diskPrefix'),
            'owner_id' => $userId,
        ]);
        // public files will be stored with extension
        if ($data['public']) {
            $data['file_name'] = $data['file_name'] . '.' . $data['extension'];
        }
        $relativePath = Arr::get($extra, 'relativePath');
        $entries = new Collection();
        // uploading a folder
        if ($relativePath && !$data['public']) {
            $path = $this->createPath($relativePath, $data['parent_id'], $userId);
            $parent = $path['allParents']->last();
            if ($path['allParents']->isNotEmpty()) {
                $entries = $entries->merge($path['allParents']);
                $data['parent_id'] = $parent->id;
            }
        }
        $fileEntry = $this->entry->create($data);
        if ( ! Arr::get($data, 'public')) {
            $fileEntry->generatePath();
        }
        $entries = $entries->push($fileEntry);
        $entryIds = $entries->mapWithKeys(function($entry) {
            return [$entry->id => ['owner' => 1]];
        })->toArray();
        User::find($userId)->entries()->syncWithoutDetaching($entryIds);
        if (isset($path['newlyCreated'])) {
            $path['newlyCreated']->each(function(FileEntry $entry) {
                // make sure new folder gets attached to all
                // users who have access to the parent folder
                event(new FileEntryCreated($entry));
            });
        }
        if (isset($parent) && $parent) {
            $fileEntry->setRelation('parent', $parent);
        } else {
            $fileEntry->load('parent');
        }
        $entries->load('users');
        $fileEntry->setAttribute('all_parents', $path['allParents'] ?? []);
        // prevent eloquent trying to save "all_parents" into database
        $fileEntry->syncOriginalAttribute('all_parents');
        return $fileEntry;
    }
    /**
     * @param string $path
     * @param integer|null $parentId
     * @param integer $userId
     * @return array
     */
    private function createPath($path, $parentId, $userId)
    {
        $newlyCreated = collect();
        // remove file name from path and split into folder names
        $path = collect(explode('/', dirname($path)))->filter();
        if ($path->isEmpty()) return $path;
        $allParents = $path->reduce(function($parents, $name) use($parentId, $userId, $newlyCreated) {
            if ( ! $parents) $parents = collect();
            $parent = $parents->last();
            $values = [
                'type' => 'folder',
                'name' => $name,
                'file_name' => $name,
                'parent_id' => $parent ? $parent->id : $parentId,
                'workspace_id' => app(ActiveWorkspace::class)->id,
            ];
            // check if user already has a folder with that name and parent
            $folder = $this->entry->where($values)
                ->whereUser($userId)
                ->first();
            if ( ! $folder) {
                $folder = $this->entry->create($values);
                $folder->generatePath();
                $newlyCreated->push($folder);
            }
            return $parents->push($folder);
        });
        return ['allParents' => $allParents, 'newlyCreated' => $newlyCreated];
    }
}