From 178972298b49159af2d453bc064439f923e9543f Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 24 Feb 2022 16:30:56 +0200 Subject: [PATCH 01/65] fix --- database/seeders/TypeSeeder.php | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/database/seeders/TypeSeeder.php b/database/seeders/TypeSeeder.php index 5d7609b..3ab8d6f 100644 --- a/database/seeders/TypeSeeder.php +++ b/database/seeders/TypeSeeder.php @@ -20,21 +20,20 @@ class TypeSeeder extends Seeder { public function run() { - $this - // ->avatars() - // ->recent() - // ->favorites() - // ->sharedWithYou() - // ->sharedByYou() - // ->uploads() - // ->exports() - // ->imports() - // ->rejectedImports() - // ->documents() - // ->productPictures() - // ->brands() - // ->carouselSlides() - // ->howToPosters() + $this->avatars() + ->recent() + ->favorites() + ->sharedWithYou() + ->sharedByYou() + ->uploads() + ->exports() + ->imports() + ->rejectedImports() + ->documents() + ->productPictures() + ->brands() + ->carouselSlides() + ->howToPosters() ->howToVideos(); } From ca1a74fb3e7de09cbd56d274a9a53f365c0475ec Mon Sep 17 00:00:00 2001 From: Manuela Mindroc Date: Thu, 24 Feb 2022 17:54:54 +0200 Subject: [PATCH 02/65] drops suffic for form and table --- .styleci.yml | 4 +-- src/Forms/Builders/Type.php | 33 +++++++++++++++++++ src/Forms/Builders/TypeForm.php | 28 ---------------- src/Http/Controllers/Type/Create.php | 4 +-- src/Http/Controllers/Type/Edit.php | 6 ++-- src/Http/Controllers/Type/ExportExcel.php | 4 +-- src/Http/Controllers/Type/InitTable.php | 4 +-- src/Http/Controllers/Type/TableData.php | 4 +-- .../Builders/{TypeTable.php => Type.php} | 8 ++--- 9 files changed, 49 insertions(+), 46 deletions(-) create mode 100644 src/Forms/Builders/Type.php delete mode 100644 src/Forms/Builders/TypeForm.php rename src/Tables/Builders/{TypeTable.php => Type.php} (56%) diff --git a/.styleci.yml b/.styleci.yml index 98eac9f..802dc83 100644 --- a/.styleci.yml +++ b/.styleci.yml @@ -5,9 +5,7 @@ preset: laravel enabled: - strict - unalign_double_arrow - - phpdoc_order - - phpdoc_separation - + disabled: - short_array_syntax diff --git a/src/Forms/Builders/Type.php b/src/Forms/Builders/Type.php new file mode 100644 index 0000000..e513fcf --- /dev/null +++ b/src/Forms/Builders/Type.php @@ -0,0 +1,33 @@ +form = (new Form($this->templatePath())); + } + + public function create() + { + return $this->form->create(); + } + + public function edit(Model $type) + { + return $this->form->edit($type); + } + + protected function templatePath(): string + { + return self::TemplatePath; + } +} diff --git a/src/Forms/Builders/TypeForm.php b/src/Forms/Builders/TypeForm.php deleted file mode 100644 index 255eaa4..0000000 --- a/src/Forms/Builders/TypeForm.php +++ /dev/null @@ -1,28 +0,0 @@ -form = (new Form(static::FormPath)); - } - - public function create() - { - return $this->form->create(); - } - - public function edit(Type $type) - { - return $this->form->edit($type); - } -} diff --git a/src/Http/Controllers/Type/Create.php b/src/Http/Controllers/Type/Create.php index e5d518a..a58ce78 100644 --- a/src/Http/Controllers/Type/Create.php +++ b/src/Http/Controllers/Type/Create.php @@ -3,11 +3,11 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use LaravelEnso\Files\Forms\Builders\TypeForm; +use LaravelEnso\Files\Forms\Builders\Type; class Create extends Controller { - public function __invoke(TypeForm $form) + public function __invoke(Type $form) { return ['form' => $form->create()]; } diff --git a/src/Http/Controllers/Type/Edit.php b/src/Http/Controllers/Type/Edit.php index 55fb248..7451a25 100644 --- a/src/Http/Controllers/Type/Edit.php +++ b/src/Http/Controllers/Type/Edit.php @@ -3,12 +3,12 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use LaravelEnso\Files\Forms\Builders\TypeForm; -use LaravelEnso\Files\Models\Type; +use LaravelEnso\Files\Forms\Builders\Type; +use LaravelEnso\Files\Models\Type as Model; class Edit extends Controller { - public function __invoke(Type $type, TypeForm $form) + public function __invoke(Model $type, Type $form) { return ['form' => $form->edit($type)]; } diff --git a/src/Http/Controllers/Type/ExportExcel.php b/src/Http/Controllers/Type/ExportExcel.php index c0a69fb..c70943f 100644 --- a/src/Http/Controllers/Type/ExportExcel.php +++ b/src/Http/Controllers/Type/ExportExcel.php @@ -3,12 +3,12 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use LaravelEnso\Files\Tables\Builders\TypeTable; +use LaravelEnso\Files\Tables\Builders\Type; use LaravelEnso\Tables\Traits\Excel; class ExportExcel extends Controller { use Excel; - protected $tableClass = TypeTable::class; + protected $tableClass = Type::class; } diff --git a/src/Http/Controllers/Type/InitTable.php b/src/Http/Controllers/Type/InitTable.php index 4a00ad4..691c919 100644 --- a/src/Http/Controllers/Type/InitTable.php +++ b/src/Http/Controllers/Type/InitTable.php @@ -3,12 +3,12 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use LaravelEnso\Files\Tables\Builders\TypeTable; +use LaravelEnso\Files\Tables\Builders\Type; use LaravelEnso\Tables\Traits\Init; class InitTable extends Controller { use Init; - protected string $tableClass = TypeTable::class; + protected string $tableClass = Type::class; } diff --git a/src/Http/Controllers/Type/TableData.php b/src/Http/Controllers/Type/TableData.php index 95057b7..c5e7db9 100644 --- a/src/Http/Controllers/Type/TableData.php +++ b/src/Http/Controllers/Type/TableData.php @@ -3,12 +3,12 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use LaravelEnso\Files\Tables\Builders\TypeTable; +use LaravelEnso\Files\Tables\Builders\Type; use LaravelEnso\Tables\Traits\Data; class TableData extends Controller { use Data; - protected string $tableClass = TypeTable::class; + protected string $tableClass = Type::class; } diff --git a/src/Tables/Builders/TypeTable.php b/src/Tables/Builders/Type.php similarity index 56% rename from src/Tables/Builders/TypeTable.php rename to src/Tables/Builders/Type.php index 9a990d6..a64afd2 100644 --- a/src/Tables/Builders/TypeTable.php +++ b/src/Tables/Builders/Type.php @@ -3,16 +3,16 @@ namespace LaravelEnso\Files\Tables\Builders; use Illuminate\Database\Eloquent\Builder; -use LaravelEnso\Files\Models\Type; +use LaravelEnso\Files\Models\Type as Model; use LaravelEnso\Tables\Contracts\Table; -class TypeTable implements Table +class Type implements Table { - protected const TemplatePath = __DIR__.'/../Templates/types.json'; + private const TemplatePath = __DIR__ . '/../Templates/types.json'; public function query(): Builder { - return Type::selectRaw('id, name, icon, folder, model, is_browsable, is_system'); + return Model::selectRaw('id, name, icon, folder, model, is_browsable, is_system'); } public function templatePath(): string From e7622d298e4a56acd0508a575b1cef977454ff5f Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Thu, 24 Feb 2022 15:55:20 +0000 Subject: [PATCH 03/65] Apply fixes from StyleCI --- src/Http/Requests/ValidateType.php | 1 - src/Services/Validate.php | 2 +- src/Tables/Builders/Type.php | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Http/Requests/ValidateType.php b/src/Http/Requests/ValidateType.php index 65c93c1..93a968f 100644 --- a/src/Http/Requests/ValidateType.php +++ b/src/Http/Requests/ValidateType.php @@ -5,7 +5,6 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; -use Illuminate\Validation\Rules\Unique; use ReflectionClass; class ValidateType extends FormRequest diff --git a/src/Services/Validate.php b/src/Services/Validate.php index 42b29c9..ba0b6f0 100644 --- a/src/Services/Validate.php +++ b/src/Services/Validate.php @@ -13,7 +13,7 @@ class Validate private ?array $mimeTypes; public function __construct( - protected File | UploadedFile $file + protected File|UploadedFile $file ) { $this->extensions = null; $this->mimeTypes = null; diff --git a/src/Tables/Builders/Type.php b/src/Tables/Builders/Type.php index a64afd2..c9087ba 100644 --- a/src/Tables/Builders/Type.php +++ b/src/Tables/Builders/Type.php @@ -8,7 +8,7 @@ class Type implements Table { - private const TemplatePath = __DIR__ . '/../Templates/types.json'; + private const TemplatePath = __DIR__.'/../Templates/types.json'; public function query(): Builder { From e084353d7c23f0b2c6727395c48ee1869ab3706a Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 25 Feb 2022 08:06:28 +0200 Subject: [PATCH 04/65] adds file_id in uploads table; --- .../migrations/2018_08_25_102000_create_uploads_table.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/database/migrations/2018_08_25_102000_create_uploads_table.php b/database/migrations/2018_08_25_102000_create_uploads_table.php index 5f89618..719edec 100644 --- a/database/migrations/2018_08_25_102000_create_uploads_table.php +++ b/database/migrations/2018_08_25_102000_create_uploads_table.php @@ -11,6 +11,10 @@ public function up() Schema::create('uploads', function (Blueprint $table) { $table->increments('id'); + $table->unsignedBigInteger('file_id')->nullable(); + $table->foreign('file_id')->references('id')->on('files') + ->onUpdate('restrict')->onDelete('cascade'); + $table->timestamps(); }); } From 4634168dd9cd24b7ad227ec090be9a87b1180669 Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 25 Feb 2022 08:29:03 +0200 Subject: [PATCH 05/65] adds portal icons to move files upgrade --- src/Upgrades/MoveFiles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Upgrades/MoveFiles.php b/src/Upgrades/MoveFiles.php index bfbcb87..e902e14 100644 --- a/src/Upgrades/MoveFiles.php +++ b/src/Upgrades/MoveFiles.php @@ -12,7 +12,7 @@ class MoveFiles implements MigratesData { - private const ToMove = ['files', 'imports', 'pictures', 'carousel', 'wiki_logos', 'howToVideos']; + private const ToMove = ['files', 'imports', 'pictures', 'carousel', 'wiki_logos', 'howToVideos', 'portalIcons']; public function isMigrated(): bool { From 54a01e1d60a516a4e09123e1de32bea7a1478dd2 Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 25 Feb 2022 11:26:33 +0200 Subject: [PATCH 06/65] adds is_public --- composer.json | 3 +- .../2018_08_25_100000_create_files_table.php | 4 +- ...8_25_101000_create_structure_for_files.php | 4 +- database/seeders/TypeSeeder.php | 40 +++---------------- routes/app/files.php | 8 ++-- src/Http/Controllers/File/Destroy.php | 2 +- src/Http/Controllers/File/MakePrivate.php | 22 ++++++++++ src/Http/Controllers/File/MakePublic.php | 22 ++++++++++ src/Http/Controllers/File/SharedByYou.php | 15 ------- src/Http/Controllers/File/SharedWithYou.php | 15 ------- src/Http/Resources/File.php | 3 +- src/Models/File.php | 6 ++- src/Models/Type.php | 12 ++++++ src/Policies/File.php | 8 ++-- src/Services/Upload.php | 4 +- src/Upgrades/FileIsPublic.php | 28 +++++++++++++ src/Upgrades/Permissions.php | 4 +- src/UploadServiceProvider.php | 11 ----- 18 files changed, 115 insertions(+), 96 deletions(-) create mode 100644 src/Http/Controllers/File/MakePrivate.php create mode 100644 src/Http/Controllers/File/MakePublic.php delete mode 100644 src/Http/Controllers/File/SharedByYou.php delete mode 100644 src/Http/Controllers/File/SharedWithYou.php create mode 100644 src/Upgrades/FileIsPublic.php delete mode 100644 src/UploadServiceProvider.php diff --git a/composer.json b/composer.json index d7ea546..a6fa8a8 100644 --- a/composer.json +++ b/composer.json @@ -37,8 +37,7 @@ "providers": [ "LaravelEnso\\Files\\AppServiceProvider", "LaravelEnso\\Files\\AuthServiceProvider", - "LaravelEnso\\Files\\EnumServiceProvider", - "LaravelEnso\\Files\\UploadServiceProvider" + "LaravelEnso\\Files\\EnumServiceProvider" ] } } diff --git a/database/migrations/2018_08_25_100000_create_files_table.php b/database/migrations/2018_08_25_100000_create_files_table.php index d411e71..edb0063 100644 --- a/database/migrations/2018_08_25_100000_create_files_table.php +++ b/database/migrations/2018_08_25_100000_create_files_table.php @@ -11,7 +11,7 @@ public function up() Schema::create('files', function (Blueprint $table) { $table->id(); - $table->unsignedBigInteger('type_id')->nullable(); + $table->unsignedBigInteger('type_id'); $table->foreign('type_id')->references('id')->on('file_types'); $table->nullableMorphs('attachable'); @@ -21,6 +21,8 @@ public function up() $table->integer('size'); $table->string('mime_type')->nullable(); + $table->boolean('is_public'); + $table->integer('created_by')->unsigned()->nullable(); $table->foreign('created_by')->references('id')->on('users'); diff --git a/database/migrations/2018_08_25_101000_create_structure_for_files.php b/database/migrations/2018_08_25_101000_create_structure_for_files.php index 634c5c8..1d06052 100644 --- a/database/migrations/2018_08_25_101000_create_structure_for_files.php +++ b/database/migrations/2018_08_25_101000_create_structure_for_files.php @@ -14,8 +14,8 @@ class CreateStructureForFiles extends Migration ['name' => 'core.files.browse', 'description' => 'Browse file type', 'is_default' => true], ['name' => 'core.files.recent', 'description' => 'Browse recent files', 'is_default' => true], ['name' => 'core.files.favorites', 'description' => 'Browse favorites files', 'is_default' => true], - ['name' => 'core.files.sharedWithYou', 'description' => 'Browse files shared with user', 'is_default' => true], - ['name' => 'core.files.sharedByYou', 'description' => 'Browse files shared by user', 'is_default' => true], + ['name' => 'core.files.makePublic', 'description' => 'Make file public', 'is_default' => true], + ['name' => 'core.files.makePrivate', 'description' => 'Make file private', 'is_default' => true], ['name' => 'core.files.favorite', 'description' => 'Toggle file as favorite', 'is_default' => true], ]; diff --git a/database/seeders/TypeSeeder.php b/database/seeders/TypeSeeder.php index 3ab8d6f..afca03b 100644 --- a/database/seeders/TypeSeeder.php +++ b/database/seeders/TypeSeeder.php @@ -20,11 +20,10 @@ class TypeSeeder extends Seeder { public function run() { + return; $this->avatars() ->recent() ->favorites() - ->sharedWithYou() - ->sharedByYou() ->uploads() ->exports() ->imports() @@ -76,38 +75,6 @@ private function favorites(): self return $this; } - private function sharedWithYou(): self - { - Type::factory()->create([ - 'name' => 'Shared with You', - 'folder' => null, - 'model' => null, - 'icon' => 'share', - 'endpoint' => 'sharedWithYou', - 'description' => 'Shared with User', - 'is_browsable' => false, - 'is_system' => true, - ]); - - return $this; - } - - private function sharedByYou(): self - { - Type::factory()->create([ - 'name' => 'Shared by You', - 'folder' => null, - 'model' => null, - 'icon' => 'share-alt', - 'endpoint' => 'sharedByYou', - 'description' => 'Shared by User', - 'is_browsable' => false, - 'is_system' => true, - ]); - - return $this; - } - private function uploads(): self { Type::factory()->model(Upload::class)->create([ @@ -183,7 +150,10 @@ private function productPictures(): self private function brands(): self { if (class_exists(Brand::class)) { - Type::factory()->model(Brand::class)->create(); + Type::factory()->model(Brand::class)->create([ + 'is_browsable' => true, + 'icon' => 'copyright', + ]); } return $this; diff --git a/routes/app/files.php b/routes/app/files.php index fbcbd36..01bc067 100644 --- a/routes/app/files.php +++ b/routes/app/files.php @@ -8,9 +8,9 @@ use LaravelEnso\Files\Http\Controllers\File\Favorites; use LaravelEnso\Files\Http\Controllers\File\Index; use LaravelEnso\Files\Http\Controllers\File\Link; +use LaravelEnso\Files\Http\Controllers\File\MakePrivate; +use LaravelEnso\Files\Http\Controllers\File\MakePublic; use LaravelEnso\Files\Http\Controllers\File\Recent; -use LaravelEnso\Files\Http\Controllers\File\SharedByYou; -use LaravelEnso\Files\Http\Controllers\File\SharedWithYou; use LaravelEnso\Files\Http\Controllers\File\Show; Route::prefix('files') @@ -24,7 +24,7 @@ Route::get('browse/{type}', Browse::class)->name('browse'); Route::get('recent', Recent::class)->name('recent'); Route::get('favorites', Favorites::class)->name('favorites'); - Route::get('sharedByYou', SharedByYou::class)->name('sharedByYou'); - Route::get('sharedWithYou', SharedWithYou::class)->name('sharedWithYou'); + Route::patch('makePublic/{file}', MakePublic::class)->name('makePublic'); + Route::patch('makePrivate/{file}', MakePrivate::class)->name('makePrivate'); Route::patch('favorite/{file}', Favorite::class)->name('favorite'); }); diff --git a/src/Http/Controllers/File/Destroy.php b/src/Http/Controllers/File/Destroy.php index f785d11..e55f33b 100644 --- a/src/Http/Controllers/File/Destroy.php +++ b/src/Http/Controllers/File/Destroy.php @@ -13,7 +13,7 @@ class Destroy extends Controller public function __invoke(File $file) { - $this->authorize('destroy', $file); + $this->authorize('manage', $file); DB::transaction(fn () => $file->delete(true)); } diff --git a/src/Http/Controllers/File/MakePrivate.php b/src/Http/Controllers/File/MakePrivate.php new file mode 100644 index 0000000..bb6bba0 --- /dev/null +++ b/src/Http/Controllers/File/MakePrivate.php @@ -0,0 +1,22 @@ +authorize('manage', $file); + + $file->update(['is_public' => false]); + + return new Resource($file); + } +} diff --git a/src/Http/Controllers/File/MakePublic.php b/src/Http/Controllers/File/MakePublic.php new file mode 100644 index 0000000..a9f9f7c --- /dev/null +++ b/src/Http/Controllers/File/MakePublic.php @@ -0,0 +1,22 @@ +authorize('manage', $file); + + $file->update(['is_public' => true]); + + return new Resource($file); + } +} diff --git a/src/Http/Controllers/File/SharedByYou.php b/src/Http/Controllers/File/SharedByYou.php deleted file mode 100644 index 68fa0db..0000000 --- a/src/Http/Controllers/File/SharedByYou.php +++ /dev/null @@ -1,15 +0,0 @@ - new Type($this->whenLoaded('type')), 'owner' => new User($this->whenLoaded('createdBy')), 'isFavorite' => (bool) $this->whenLoaded('favorite'), - 'isDestroyable' => $request->user()->can('destroy', $this->resource), + 'isManageable' => $request->user()->can('manage', $this->resource), 'isAccessible' => $accessible, 'isViewable' => $accessible && $this->isImage(), + 'isPublic' => $this->is_public, 'createdAt' => $this->created_at->toDatetimeString(), ]; } diff --git a/src/Models/File.php b/src/Models/File.php index 07dd807..af59894 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -28,6 +28,8 @@ class File extends Model protected $guarded = ['id']; + protected $casts = ['is_public' => 'boolean']; + public function attachable() { return $this->morphTo(); @@ -108,7 +110,7 @@ public function path(): string return "{$this->folder()}/{$this->saved_name}"; } - public static function attach(Attachable $attachable, string $savedName, string $filename, ?int $createdBy): self + public static function attach(Attachable $attachable, string $savedName, string $filename): self { $type = Type::for($attachable::class); $file = new IlluminateFile(Storage::path("{$type->folder}/{$savedName}")); @@ -119,7 +121,7 @@ public static function attach(Attachable $attachable, string $savedName, string 'saved_name' => $savedName, 'size' => $file->getSize(), 'mime_type' => $file->getMimeType(), - 'created_by' => $createdBy, + 'is_public' => $type->isPublic(), ]); } diff --git a/src/Models/Type.php b/src/Models/Type.php index 4554504..276fa64 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -5,6 +5,8 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use LaravelEnso\Files\Contracts\Attachable; +use LaravelEnso\Files\Contracts\PublicFile; use LaravelEnso\Rememberable\Traits\Rememberable; use LaravelEnso\Tables\Traits\TableCache; @@ -35,6 +37,16 @@ public function scopeOrdered(Builder $query): Builder return $query->orderByDesc('is_system')->orderBy('id'); } + public function model(): Attachable + { + return new $this->model; + } + + public function isPublic(): bool + { + return $this->model() instanceof PublicFile; + } + public static function for(string $model): self { return self::cacheGetBy('model', $model) diff --git a/src/Policies/File.php b/src/Policies/File.php index c9a5ceb..90f6ec1 100644 --- a/src/Policies/File.php +++ b/src/Policies/File.php @@ -3,7 +3,6 @@ namespace LaravelEnso\Files\Policies; use Illuminate\Auth\Access\HandlesAuthorization; -use LaravelEnso\Files\Contracts\PublicFile; use LaravelEnso\Files\Models\File as Model; use LaravelEnso\Users\Models\User; @@ -20,11 +19,12 @@ public function before(User $user) public function access(User $user, Model $file) { - return $this->ownsFile($user, $file) - || new $file->type->model() instanceof PublicFile; + return $file->is_public + || $this->ownsFile($user, $file) + || new $file->type->isPublic(); } - public function destroy(User $user, Model $file) + public function manage(User $user, Model $file) { return $this->ownsFile($user, $file); } diff --git a/src/Services/Upload.php b/src/Services/Upload.php index 0595f12..5401c11 100644 --- a/src/Services/Upload.php +++ b/src/Services/Upload.php @@ -69,13 +69,15 @@ private function process(): self private function upload(): File { $folder = $this->folder(); + $type = Type::for($this->attachable::class); $model = File::create([ - 'type_id' => Type::for($this->attachable::class)->id, + 'type_id' => $type->id, 'original_name' => $this->file->getClientOriginalName(), 'saved_name' => $this->file->hashName(), 'size' => $this->file->getSize(), 'mime_type' => $this->file->getMimeType(), + 'is_public' => $type->isPublic(), ]); $this->file->store($folder); diff --git a/src/Upgrades/FileIsPublic.php b/src/Upgrades/FileIsPublic.php new file mode 100644 index 0000000..208633a --- /dev/null +++ b/src/Upgrades/FileIsPublic.php @@ -0,0 +1,28 @@ + $table + ->boolean('is_public')->nullable()->after('mime_type')); + } + + public function migrateData(): void + { + File::whereNull('is_public')->update(['is_public' => false]); + } +} diff --git a/src/Upgrades/Permissions.php b/src/Upgrades/Permissions.php index c361d89..19fc7af 100644 --- a/src/Upgrades/Permissions.php +++ b/src/Upgrades/Permissions.php @@ -14,7 +14,7 @@ class Permissions implements MigratesStructure ['name' => 'core.files.browse', 'description' => 'Browse file type', 'is_default' => true], ['name' => 'core.files.recent', 'description' => 'Browse recent files', 'is_default' => true], ['name' => 'core.files.favorites', 'description' => 'Browse favorites files', 'is_default' => true], - ['name' => 'core.files.sharedWithYou', 'description' => 'Browse files shared with user', 'is_default' => true], - ['name' => 'core.files.sharedByYou', 'description' => 'Browse files shared by user', 'is_default' => true], + ['name' => 'core.files.makePublic', 'description' => 'Make file public', 'is_default' => true], + ['name' => 'core.files.makePrivate', 'description' => 'Make file private', 'is_default' => true], ]; } diff --git a/src/UploadServiceProvider.php b/src/UploadServiceProvider.php deleted file mode 100644 index 64fe7b4..0000000 --- a/src/UploadServiceProvider.php +++ /dev/null @@ -1,11 +0,0 @@ - Date: Mon, 28 Feb 2022 13:49:55 +0200 Subject: [PATCH 07/65] various fixes --- ...8_25_101000_create_structure_for_files.php | 1 - database/seeders/TypeSeeder.php | 1 - src/Models/File.php | 10 +-- src/Models/Type.php | 21 ++++++ src/Services/FileValidator.php | 65 ------------------- src/Services/Upload.php | 20 +++++- src/Services/Validate.php | 2 +- src/Upgrades/MoveFiles.php | 8 ++- src/Upgrades/TypeSeeder.php | 3 +- tests/features/FileTest.php | 63 +++++++++++++----- 10 files changed, 95 insertions(+), 99 deletions(-) delete mode 100644 src/Services/FileValidator.php diff --git a/database/migrations/2018_08_25_101000_create_structure_for_files.php b/database/migrations/2018_08_25_101000_create_structure_for_files.php index 1d06052..ffc10e4 100644 --- a/database/migrations/2018_08_25_101000_create_structure_for_files.php +++ b/database/migrations/2018_08_25_101000_create_structure_for_files.php @@ -10,7 +10,6 @@ class CreateStructureForFiles extends Migration ['name' => 'core.files.show', 'description' => 'Open file in browser', 'is_default' => true], ['name' => 'core.files.download', 'description' => 'Download file', 'is_default' => true], ['name' => 'core.files.destroy', 'description' => 'Delete file', 'is_default' => true], - ['name' => 'core.files.favorite', 'description' => 'Toggle file as favorite', 'is_default' => true], ['name' => 'core.files.browse', 'description' => 'Browse file type', 'is_default' => true], ['name' => 'core.files.recent', 'description' => 'Browse recent files', 'is_default' => true], ['name' => 'core.files.favorites', 'description' => 'Browse favorites files', 'is_default' => true], diff --git a/database/seeders/TypeSeeder.php b/database/seeders/TypeSeeder.php index afca03b..8a5d0c2 100644 --- a/database/seeders/TypeSeeder.php +++ b/database/seeders/TypeSeeder.php @@ -20,7 +20,6 @@ class TypeSeeder extends Seeder { public function run() { - return; $this->avatars() ->recent() ->favorites() diff --git a/src/Models/File.php b/src/Models/File.php index af59894..13f2ce2 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Http\File as IlluminateFile; use Illuminate\Http\UploadedFile; +use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Storage; @@ -100,20 +101,15 @@ public function name(): string return Str::ascii($this->original_name); } - public function folder(): string - { - return $this->type->folder; - } - public function path(): string { - return "{$this->folder()}/{$this->saved_name}"; + return "{$this->type->folder()}/{$this->saved_name}"; } public static function attach(Attachable $attachable, string $savedName, string $filename): self { $type = Type::for($attachable::class); - $file = new IlluminateFile(Storage::path("{$type->folder}/{$savedName}")); + $file = new IlluminateFile(Storage::path($type->path($savedName))); return self::create([ 'type_id' => $type->id, diff --git a/src/Models/Type.php b/src/Models/Type.php index 276fa64..816a296 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -5,6 +5,9 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\Storage; use LaravelEnso\Files\Contracts\Attachable; use LaravelEnso\Files\Contracts\PublicFile; use LaravelEnso\Rememberable\Traits\Rememberable; @@ -52,4 +55,22 @@ public static function for(string $model): self return self::cacheGetBy('model', $model) ?? self::factory()->model($model)->create(); } + + public function folder(): string + { + $folder = App::runningUnitTests() + ? Config::get('enso.files.testingFolder') + : $this->folder; + + if (! Storage::has($folder)) { + Storage::makeDirectory($folder); + } + + return $folder; + } + + public function path(string $filename): string + { + return "{$this->folder()}/{$filename}"; + } } diff --git a/src/Services/FileValidator.php b/src/Services/FileValidator.php deleted file mode 100644 index 0ef903f..0000000 --- a/src/Services/FileValidator.php +++ /dev/null @@ -1,65 +0,0 @@ -validateFile() - ->validateExtension() - ->validateMimeType(); - } - - private function validateFile(): self - { - if (! $this->file->isValid()) { - throw File::uploadError($this->file->getClientOriginalName()); - } - - return $this; - } - - private function validateExtension(): self - { - $valid = new Collection($this->extensions); - - $extension = $this->file instanceof UploadedFile - ? $this->file->getClientOriginalExtension() - : $this->file->getExtension(); - - if ($valid->isNotEmpty() && ! $valid->contains($extension)) { - $extensions = implode(', ', $this->extensions); - throw FileException::invalidExtension($extension, $extensions); - } - - return $this; - } - - private function validateMimeType() - { - $valid = new Collection($this->mimeTypes); - - $mimeType = $this->file->getMimeType(); - - if ($valid->isNotEmpty() && ! $valid->contains($mimeType)) { - $mimeTypes = implode(', ', $this->mimeTypes); - throw FileException::invalidMimeType($mimeType, $mimeTypes); - } - - return $this; - } -} diff --git a/src/Services/Upload.php b/src/Services/Upload.php index 5401c11..420a2ad 100644 --- a/src/Services/Upload.php +++ b/src/Services/Upload.php @@ -3,6 +3,7 @@ namespace LaravelEnso\Files\Services; use Illuminate\Http\UploadedFile; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Storage; @@ -13,13 +14,17 @@ use LaravelEnso\Files\Contracts\ResizesImages; use LaravelEnso\Files\Models\File; use LaravelEnso\Files\Models\Type; +use LaravelEnso\ImageTransformer\Services\ImageTransformer; class Upload { + private Type $type; + public function __construct( private Attachable $attachable, private UploadedFile $file ) { + $this->type = Type::for($this->attachable::class); } public function handle(): File @@ -48,6 +53,10 @@ private function validate(): self private function process(): self { + if (!$this->isSupportedImage()) { + return $this; + } + if ($this->attachable instanceof ResizesImages) { $processor = (new Process($this->file)) ->width($this->attachable->imageWidth()) @@ -69,15 +78,14 @@ private function process(): self private function upload(): File { $folder = $this->folder(); - $type = Type::for($this->attachable::class); $model = File::create([ - 'type_id' => $type->id, + 'type_id' => $this->type->id, 'original_name' => $this->file->getClientOriginalName(), 'saved_name' => $this->file->hashName(), 'size' => $this->file->getSize(), 'mime_type' => $this->file->getMimeType(), - 'is_public' => $type->isPublic(), + 'is_public' => $this->type->isPublic(), ]); $this->file->store($folder); @@ -97,4 +105,10 @@ private function folder() return $folder; } + + private function isSupportedImage(): bool + { + return Collection::wrap(ImageTransformer::SupportedMimeTypes) + ->contains($this->file->getMimeType()); + } } diff --git a/src/Services/Validate.php b/src/Services/Validate.php index ba0b6f0..380dddb 100644 --- a/src/Services/Validate.php +++ b/src/Services/Validate.php @@ -62,7 +62,7 @@ private function extension(): self return $this; } - private function mimeType() + private function mimeType(): self { $valid = new Collection($this->mimeTypes); $mimeType = $this->file->getMimeType(); diff --git a/src/Upgrades/MoveFiles.php b/src/Upgrades/MoveFiles.php index e902e14..be443ce 100644 --- a/src/Upgrades/MoveFiles.php +++ b/src/Upgrades/MoveFiles.php @@ -9,14 +9,18 @@ use Illuminate\Support\Str; use LaravelEnso\Files\Models\File; use LaravelEnso\Upgrade\Contracts\MigratesData; +use LaravelEnso\Upgrade\Helpers\Table; class MoveFiles implements MigratesData { - private const ToMove = ['files', 'imports', 'pictures', 'carousel', 'wiki_logos', 'howToVideos', 'portalIcons']; + private const ToMove = [ + 'files', 'imports', 'pictures', 'carousel', 'wiki_logos', + 'howToVideos', 'portalIcons', + ]; public function isMigrated(): bool { - return $this->notMoved()->doesntExist(); + return Table::hasColumn('files', 'saved_name') && $this->notMoved()->doesntExist(); } public function migrateData(): void diff --git a/src/Upgrades/TypeSeeder.php b/src/Upgrades/TypeSeeder.php index a28578d..87db88e 100644 --- a/src/Upgrades/TypeSeeder.php +++ b/src/Upgrades/TypeSeeder.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Storage; use LaravelEnso\Documents\Models\Document; use LaravelEnso\Files\Database\Seeders\TypeSeeder as Seeder; @@ -16,7 +17,7 @@ class TypeSeeder implements MigratesData, MigratesPostDataMigration { public function isMigrated(): bool { - return Type::query()->exists(); + return Schema::hasTable('file_types') && Type::query()->exists(); } public function migrateData(): void diff --git a/tests/features/FileTest.php b/tests/features/FileTest.php index 2e14f37..b1ff751 100644 --- a/tests/features/FileTest.php +++ b/tests/features/FileTest.php @@ -1,13 +1,17 @@ model->file->upload($this->file); + $file = File::upload($this->model, $this->file); + $this->model->file()->associate($file)->save(); $this->assertNotNull($this->model->file); @@ -66,37 +71,39 @@ public function can_attach_file() /** @test */ public function cant_upload_file_with_invalid_extension() { - $file = UploadedFile::fake()->image('picture.jpg'); + $file = UploadedFile::fake()->image('image.jpg'); - $this->expectException(File::class); + $this->expectException(Exception::class); $this->expectExceptionMessage( - File::invalidExtension($file->getClientOriginalExtension(), 'png') + Exception::invalidExtension($file->getClientOriginalExtension(), 'png') ->getMessage() ); - $this->model->file->upload($file); + File::upload($this->model, $file); } /** @test */ public function cant_upload_file_with_invalid_mime_type() { - $file = UploadedFile::fake()->create('doc.png', 0, 'application/msword'); + $file = UploadedFile::fake()->create('doc.doc', 0, 'application/msword'); - $this->expectException(File::class); + $this->expectException(Exception::class); $this->expectExceptionMessage( - File::invalidMimeType($file->getMimeType(), 'image/png') + Exception::invalidMimeType($file->getMimeType(), 'image/png') ->getMessage() ); - $this->model->file->upload($file); + $this->model->extension = 'doc'; + File::upload($this->model, $file); } /** @test */ public function can_display_file_inline() { - $this->model->file->upload($this->file); + $file = File::upload($this->model, $this->file); + $this->model->file()->associate($file)->save(); $response = $this->model->file->inline($this->file->hashname()); @@ -106,17 +113,23 @@ public function can_display_file_inline() /** @test */ public function can_download_file() { - $this->model->file->upload($this->file); + $file = File::upload($this->model, $this->file); + $this->model->file()->associate($file)->save(); $response = $this->model->file->download(); $this->assertEquals(200, $response->getStatusCode()); } - private function createTestTable() + private function createTestTable(): self { Schema::create('attachable_models', function ($table) { $table->increments('id'); + + $table->unsignedBigInteger('file_id')->nullable(); + $table->foreign('file_id')->references('id')->on('files') + ->onUpdate('restrict')->onDelete('cascade'); + $table->timestamps(); }); @@ -129,8 +142,22 @@ private function cleanUp() } } -class AttachableModel extends Model implements Attachable +class AttachableModel extends Model implements Attachable, Extensions, MimeTypes { - protected $mimeTypes = ['image/png']; - protected $extensions = ['png']; + public string $extension = 'png'; + + public function file(): Relation + { + return $this->belongsTo(File::class); + } + + public function extensions(): array + { + return [$this->extension]; + } + + public function mimeTypes(): array + { + return ['image/png']; + } } From 48ee89d53d86c42f171acffc6ec92a118eb6d20a Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Mon, 28 Feb 2022 11:50:08 +0000 Subject: [PATCH 08/65] Apply fixes from StyleCI --- src/Models/File.php | 1 - src/Models/Type.php | 2 +- src/Services/Upload.php | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Models/File.php b/src/Models/File.php index 13f2ce2..25367db 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -7,7 +7,6 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Http\File as IlluminateFile; use Illuminate\Http\UploadedFile; -use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Storage; diff --git a/src/Models/Type.php b/src/Models/Type.php index 816a296..32f0e45 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -60,7 +60,7 @@ public function folder(): string { $folder = App::runningUnitTests() ? Config::get('enso.files.testingFolder') - : $this->folder; + : $this->folder; if (! Storage::has($folder)) { Storage::makeDirectory($folder); diff --git a/src/Services/Upload.php b/src/Services/Upload.php index 420a2ad..17b6532 100644 --- a/src/Services/Upload.php +++ b/src/Services/Upload.php @@ -53,7 +53,7 @@ private function validate(): self private function process(): self { - if (!$this->isSupportedImage()) { + if (! $this->isSupportedImage()) { return $this; } From 447d7d14f29ba4931cd9348f66d119e35663b25e Mon Sep 17 00:00:00 2001 From: Mihai Date: Tue, 1 Mar 2022 17:20:36 +0200 Subject: [PATCH 09/65] many file upgrade related changes --- config/files.php | 10 +++++- database/factories/TypeFactory.php | 2 +- database/seeders/TypeSeeder.php | 15 ++++---- src/Http/Controllers/File/Browse.php | 6 +++- src/Http/Controllers/File/Favorites.php | 9 ++++- src/Http/Controllers/File/Recent.php | 5 +-- src/Http/Controllers/Type/Update.php | 12 ++++++- src/Models/File.php | 24 +++++++------ src/Upgrades/DropMorphModels.php | 3 ++ src/Upgrades/FileIsPublic.php | 3 +- src/Upgrades/FileType.php | 3 +- src/Upgrades/MoveFiles.php | 47 ++++++++++++++++++------- src/Upgrades/RenameFilePath.php | 2 +- src/Upgrades/TypeSeeder.php | 35 +++--------------- 14 files changed, 106 insertions(+), 70 deletions(-) diff --git a/config/files.php b/config/files.php index 4b82189..ec53481 100644 --- a/config/files.php +++ b/config/files.php @@ -15,8 +15,16 @@ return [ 'linkExpiration' => (int) env('TEMPORARY_LINK_EXPIRATION', 60 * 60 * 24), 'storageLimit' => 500000, - 'paginate' => (int) env('FILES_PAGINATION', 24), + 'paginate' => (int) env('FILES_PAGINATION', 50), 'testingFolder' => 'testing', + 'renameFolders' => [ + 'dataImport' => 'import', + 'dataExport' => 'export', + 'webshopCarouselSlide' => 'carouselSlide', + ], + 'nonStandardFolders' => [ + 'files', 'imports', 'carousel', 'howToVideos', 'webshopCarouselSlide' + ], 'upgrade' => [ 'avatar' => Avatar::class, 'dataExport' => Export::class, diff --git a/database/factories/TypeFactory.php b/database/factories/TypeFactory.php index e50a58f..7dd38cb 100644 --- a/database/factories/TypeFactory.php +++ b/database/factories/TypeFactory.php @@ -34,7 +34,7 @@ public function model(string $model): self return $this->state(fn () => [ 'name' => $name, - 'folder' => $name->lower(), + 'folder' => $name->camel(), 'model' => $model, 'description' => "Enso {$name}", ]); diff --git a/database/seeders/TypeSeeder.php b/database/seeders/TypeSeeder.php index 8a5d0c2..afb4fac 100644 --- a/database/seeders/TypeSeeder.php +++ b/database/seeders/TypeSeeder.php @@ -7,7 +7,7 @@ use LaravelEnso\DataExport\Models\Export; use LaravelEnso\DataImport\Models\Import; use LaravelEnso\DataImport\Models\RejectedImport; -use LaravelEnso\Documents\Http\Resources\Document; +use LaravelEnso\Documents\Models\Document; use LaravelEnso\Files\Models\Type; use LaravelEnso\Files\Models\Upload; use LaravelEnso\HowTo\Models\Poster; @@ -21,7 +21,7 @@ class TypeSeeder extends Seeder public function run() { $this->avatars() - ->recent() + ->recents() ->favorites() ->uploads() ->exports() @@ -37,20 +37,20 @@ public function run() private function avatars(): self { - Type::factory()->model(Avatar::class); + Type::factory()->model(Avatar::class)->create(); return $this; } - private function recent(): self + private function recents(): self { Type::factory()->create([ - 'name' => 'Recent', + 'name' => 'Recents', 'folder' => null, 'model' => null, 'icon' => 'folder-plus', 'endpoint' => 'recent', - 'description' => 'User Favorites', + 'description' => 'Recent files', 'is_browsable' => true, 'is_system' => true, ]); @@ -78,7 +78,7 @@ private function uploads(): self { Type::factory()->model(Upload::class)->create([ 'name' => 'Uploads', - 'icon' => 'folder-upload', + 'icon' => 'file-upload', 'is_browsable' => true, 'is_system' => false, ]); @@ -139,7 +139,6 @@ private function productPictures(): self Type::factory()->model(Picture::class)->create([ 'icon' => 'image', 'is_browsable' => true, - 'folder' => 'productPictures', ]); } diff --git a/src/Http/Controllers/File/Browse.php b/src/Http/Controllers/File/Browse.php index 7567bb1..36b7ecf 100644 --- a/src/Http/Controllers/File/Browse.php +++ b/src/Http/Controllers/File/Browse.php @@ -14,7 +14,11 @@ class Browse extends Controller public function __invoke(Request $request, Type $type) { - $files = $type->files()->for($request->user())->get(); + $files = $type->files() + ->for($request->user()) + ->between(json_decode($request->get('interval'), true)) + ->filter($request->get('query')) + ->get(); return File::collection($files); } diff --git a/src/Http/Controllers/File/Favorites.php b/src/Http/Controllers/File/Favorites.php index 2243709..1741e01 100644 --- a/src/Http/Controllers/File/Favorites.php +++ b/src/Http/Controllers/File/Favorites.php @@ -13,7 +13,14 @@ class Favorites extends Controller public function __invoke(Request $request) { - $files = $request->user()->favoriteFiles()->withData()->get(); + $files = $request->user() + ->favoriteFiles() + ->withData() + ->between(json_decode($request->get('interval'), true)) + ->filter($request->get('query')) + ->paginated() + ->latest('id') + ->get(); return File::collection($files); } diff --git a/src/Http/Controllers/File/Recent.php b/src/Http/Controllers/File/Recent.php index 78d0ff5..fffb251 100644 --- a/src/Http/Controllers/File/Recent.php +++ b/src/Http/Controllers/File/Recent.php @@ -5,6 +5,7 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Config; use LaravelEnso\Files\Http\Resources\File as Resource; use LaravelEnso\Files\Models\File; @@ -15,8 +16,8 @@ class Recent extends Controller public function __invoke(Request $request) { $files = File::for($request->user()) - ->latest('id') - ->limit(50) + ->between(json_decode($request->get('interval'), true)) + ->filter($request->get('query')) ->get(); return Resource::collection($files); diff --git a/src/Http/Controllers/Type/Update.php b/src/Http/Controllers/Type/Update.php index aefc6bb..29861e3 100644 --- a/src/Http/Controllers/Type/Update.php +++ b/src/Http/Controllers/Type/Update.php @@ -3,6 +3,8 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Storage; use LaravelEnso\Files\Http\Requests\ValidateType; use LaravelEnso\Files\Models\Type; @@ -10,7 +12,15 @@ class Update extends Controller { public function __invoke(ValidateType $request, Type $type) { - $type->update($request->validated()); + $type->fill($request->validated()); + + if ($type->isDirty('folder')) { + $from = Storage::path($type->getOriginal('folder')); + $to = Storage::path($type->folder); + rename($from, $to); + } + + $type->save(); return ['message' => __('The file type was successfully updated')]; } diff --git a/src/Models/File.php b/src/Models/File.php index 25367db..7b79861 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -30,11 +30,6 @@ class File extends Model protected $casts = ['is_public' => 'boolean']; - public function attachable() - { - return $this->morphTo(); - } - public function type() { return $this->belongsTo(Type::class); @@ -76,17 +71,25 @@ public function scopeFor(Builder $query, User $user): Builder { $super = $user->isAdmin() || $user->isSupervisor(); - return $query->browsable()->withData() - ->when(! $super, fn ($query) => $query->whereCreatedBy($user->id)); + return $query->browsable() + ->withData() + ->when(! $super, fn ($query) => $query->whereCreatedBy($user->id)) + ->latest('id') + ->paginated(); + } + + public function scopePaginated(Builder $query): Builder + { + return $query->limit(Config::get('enso.files.paginate')); } public function scopeBetween(Builder $query, array $interval): Builder { return $query ->when($interval['min'], fn ($query) => $query - ->where('created_at', '>=', Carbon::parse($interval['min']))) + ->where('files.created_at', '>=', Carbon::parse($interval['min']))) ->when($interval['max'], fn ($query) => $query - ->where('created_at', '<=', Carbon::parse($interval['max']))); + ->where('files.created_at', '<=', Carbon::parse($interval['max']))); } public function scopeFilter(Builder $query, ?string $search): Builder @@ -105,7 +108,7 @@ public function path(): string return "{$this->type->folder()}/{$this->saved_name}"; } - public static function attach(Attachable $attachable, string $savedName, string $filename): self + public static function attach(Attachable $attachable, string $savedName, string $filename, ?int $userId = null): self { $type = Type::for($attachable::class); $file = new IlluminateFile(Storage::path($type->path($savedName))); @@ -117,6 +120,7 @@ public static function attach(Attachable $attachable, string $savedName, string 'size' => $file->getSize(), 'mime_type' => $file->getMimeType(), 'is_public' => $type->isPublic(), + 'created_by' => $userId, ]); } diff --git a/src/Upgrades/DropMorphModels.php b/src/Upgrades/DropMorphModels.php index 7a15a0f..fa1d318 100644 --- a/src/Upgrades/DropMorphModels.php +++ b/src/Upgrades/DropMorphModels.php @@ -2,6 +2,7 @@ namespace LaravelEnso\Files\Upgrades; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Config; @@ -29,6 +30,8 @@ public function isMigrated(): bool public function migrateTable(): void { + Model::unsetEventDispatcher(); + $this->needUpgrade() ->each(fn ($model, $morphKey) => $this->process($model, $morphKey)); } diff --git a/src/Upgrades/FileIsPublic.php b/src/Upgrades/FileIsPublic.php index 208633a..c09deea 100644 --- a/src/Upgrades/FileIsPublic.php +++ b/src/Upgrades/FileIsPublic.php @@ -6,9 +6,10 @@ use LaravelEnso\Files\Models\File; use LaravelEnso\Upgrade\Contracts\MigratesData; use LaravelEnso\Upgrade\Contracts\MigratesTable; +use LaravelEnso\Upgrade\Contracts\ShouldRunManually; use LaravelEnso\Upgrade\Helpers\Table; -class FileIsPublic implements MigratesTable, MigratesData +class FileIsPublic implements MigratesTable, MigratesData, ShouldRunManually { public function isMigrated(): bool { diff --git a/src/Upgrades/FileType.php b/src/Upgrades/FileType.php index 02d1bb5..5f57d64 100644 --- a/src/Upgrades/FileType.php +++ b/src/Upgrades/FileType.php @@ -5,9 +5,10 @@ use Illuminate\Support\Facades\Schema; use LaravelEnso\Upgrade\Contracts\MigratesTable; use LaravelEnso\Upgrade\Contracts\Prioritization; +use LaravelEnso\Upgrade\Contracts\ShouldRunManually; use LaravelEnso\Upgrade\Helpers\Table; -class FileType implements MigratesTable, Prioritization +class FileType implements MigratesTable, Prioritization, ShouldRunManually { public function priority(): int { diff --git a/src/Upgrades/MoveFiles.php b/src/Upgrades/MoveFiles.php index be443ce..ca004b3 100644 --- a/src/Upgrades/MoveFiles.php +++ b/src/Upgrades/MoveFiles.php @@ -4,35 +4,46 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use LaravelEnso\Files\Models\File; use LaravelEnso\Upgrade\Contracts\MigratesData; +use LaravelEnso\Upgrade\Contracts\ShouldRunManually; use LaravelEnso\Upgrade\Helpers\Table; -class MoveFiles implements MigratesData +class MoveFiles implements MigratesData, ShouldRunManually { - private const ToMove = [ - 'files', 'imports', 'pictures', 'carousel', 'wiki_logos', - 'howToVideos', 'portalIcons', - ]; + private array $nonStandardFolders; + private array $renameFolders; + + public function __construct() + { + $this->nonStandardFolders = Config::get('enso.files.nonStandardFolders'); + $this->renameFolders = Config::get('enso.files.renameFolders'); + } public function isMigrated(): bool { - return Table::hasColumn('files', 'saved_name') && $this->notMoved()->doesntExist(); + return Table::hasColumn('files', 'saved_name') + && $this->notMoved()->doesntExist(); } public function migrateData(): void { $this->notMoved() ->pluck('attachable_type') + ->unique() ->each(fn ($attachable) => $this->handle($attachable)); + + $this->cleanup(); } private function handle(string $attachable): void { - $folder = Str::plural($attachable); + $key = $this->renameFolders[$attachable] ?? $attachable; + $folder = Str::plural($key); if (! Storage::has($folder)) { Storage::makeDirectory($folder); @@ -47,14 +58,17 @@ private function handle(string $attachable): void private function move(File $file, string $folder): void { if (Storage::exists($file->saved_name)) { - $location = Str::replace(self::ToMove, $folder, $file->saved_name); - Storage::move($file->saved_name, $location); + $location = Str::replace($this->nonStandardFolders, $folder, $file->saved_name); + + if ($file->saved_name !== $location) { + Storage::move($file->saved_name, $location); + } } } private function replace(string $attachable, string $folder) { - Collection::wrap(self::ToMove) + Collection::wrap($this->nonStandardFolders) ->each(fn ($from) => $this->notMoved() ->whereAttachableType($attachable) ->where('saved_name', 'LIKE', "{$from}/%") @@ -63,8 +77,17 @@ private function replace(string $attachable, string $folder) private function notMoved(): Builder { - return Collection::wrap(self::ToMove) + $build = fn ($query) => Collection::wrap($this->nonStandardFolders) ->reduce(fn ($files, $folder) => $files - ->orWhere('saved_name', 'LIKE', "{$folder}/%"), File::query()); + ->orWhere('saved_name', 'LIKE', "{$folder}/%"), $query); + + return File::where($build); + } + + private function cleanup(): void + { + Collection::wrap($this->nonStandardFolders) + ->filter(fn ($folder) => count(Storage::files($folder)) === 0) + ->each(fn ($folder) => Storage::deleteDirectory($folder)); } } diff --git a/src/Upgrades/RenameFilePath.php b/src/Upgrades/RenameFilePath.php index 346569a..f1ff4fb 100644 --- a/src/Upgrades/RenameFilePath.php +++ b/src/Upgrades/RenameFilePath.php @@ -12,7 +12,7 @@ class RenameFilePath implements MigratesTable, Prioritization, ShouldRunManually { public function priority(): int { - return 107; + return 99; } public function isMigrated(): bool diff --git a/src/Upgrades/TypeSeeder.php b/src/Upgrades/TypeSeeder.php index 87db88e..c34f810 100644 --- a/src/Upgrades/TypeSeeder.php +++ b/src/Upgrades/TypeSeeder.php @@ -3,17 +3,12 @@ namespace LaravelEnso\Files\Upgrades; use Illuminate\Support\Facades\Artisan; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; -use Illuminate\Support\Facades\Storage; -use LaravelEnso\Documents\Models\Document; use LaravelEnso\Files\Database\Seeders\TypeSeeder as Seeder; -use LaravelEnso\Files\Models\File; use LaravelEnso\Files\Models\Type; use LaravelEnso\Upgrade\Contracts\MigratesData; -use LaravelEnso\Upgrade\Contracts\MigratesPostDataMigration; -class TypeSeeder implements MigratesData, MigratesPostDataMigration +class TypeSeeder implements MigratesData { public function isMigrated(): bool { @@ -24,30 +19,10 @@ public function migrateData(): void { $seeder = Seeder::class; - Artisan::command("db:seed --class={$seeder}", ['--force' => true]); + Artisan::call("db:seed", [ + '--class' => $seeder, + '--force' => true, + ]); } - public function migratePostDataMigration(): void - { - if (! Storage::has('uploads')) { - Storage::makeDirectory('uploads'); - } - - $this->replace('uploads'); - - if (class_exists(Document::class)) { - if (! Storage::has('documents')) { - Storage::makeDirectory('documents'); - } - - $this->replace('documents'); - } - } - - private function replace(string $attachable) - { - File::whereAttachableType($attachable) - ->where('path', 'LIKE', 'files/%') - ->update(['path' => DB::raw("REPLACE(path, 'files', $attachable)")]); - } } From 9117acadcf5100bccaeae6c187155d20adf5b707 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Tue, 1 Mar 2022 15:20:50 +0000 Subject: [PATCH 10/65] Apply fixes from StyleCI --- config/files.php | 2 +- src/Http/Controllers/File/Recent.php | 1 - src/Http/Controllers/Type/Update.php | 1 - src/Upgrades/TypeSeeder.php | 3 +-- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/config/files.php b/config/files.php index ec53481..63eff64 100644 --- a/config/files.php +++ b/config/files.php @@ -23,7 +23,7 @@ 'webshopCarouselSlide' => 'carouselSlide', ], 'nonStandardFolders' => [ - 'files', 'imports', 'carousel', 'howToVideos', 'webshopCarouselSlide' + 'files', 'imports', 'carousel', 'howToVideos', 'webshopCarouselSlide', ], 'upgrade' => [ 'avatar' => Avatar::class, diff --git a/src/Http/Controllers/File/Recent.php b/src/Http/Controllers/File/Recent.php index fffb251..15f7628 100644 --- a/src/Http/Controllers/File/Recent.php +++ b/src/Http/Controllers/File/Recent.php @@ -5,7 +5,6 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; use Illuminate\Routing\Controller; -use Illuminate\Support\Facades\Config; use LaravelEnso\Files\Http\Resources\File as Resource; use LaravelEnso\Files\Models\File; diff --git a/src/Http/Controllers/Type/Update.php b/src/Http/Controllers/Type/Update.php index 29861e3..81f345f 100644 --- a/src/Http/Controllers/Type/Update.php +++ b/src/Http/Controllers/Type/Update.php @@ -3,7 +3,6 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Storage; use LaravelEnso\Files\Http\Requests\ValidateType; use LaravelEnso\Files\Models\Type; diff --git a/src/Upgrades/TypeSeeder.php b/src/Upgrades/TypeSeeder.php index c34f810..8eae1f6 100644 --- a/src/Upgrades/TypeSeeder.php +++ b/src/Upgrades/TypeSeeder.php @@ -19,10 +19,9 @@ public function migrateData(): void { $seeder = Seeder::class; - Artisan::call("db:seed", [ + Artisan::call('db:seed', [ '--class' => $seeder, '--force' => true, ]); } - } From 9e9530de9a8b12b5e872b4f2904c11f2d9d85bed Mon Sep 17 00:00:00 2001 From: Mihai Date: Wed, 2 Mar 2022 13:58:59 +0200 Subject: [PATCH 11/65] updated migrations --- database/migrations/2018_08_25_100000_create_files_table.php | 4 ++-- .../2018_08_25_101000_create_structure_for_files.php | 4 ++-- .../migrations/2018_08_25_102000_create_uploads_table.php | 4 ++-- .../2018_08_25_103000_create_structure_for_uploads.php | 4 ++-- .../2022_01_17_100000_create_favorite_files_table.php | 4 ++-- .../migrations/2022_01_23_100000_create_file_types_table.php | 4 ++-- .../2022_01_23_101000_create_structure_for_file_types.php | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/database/migrations/2018_08_25_100000_create_files_table.php b/database/migrations/2018_08_25_100000_create_files_table.php index edb0063..f6f1fe3 100644 --- a/database/migrations/2018_08_25_100000_create_files_table.php +++ b/database/migrations/2018_08_25_100000_create_files_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateFilesTable extends Migration +return new class extends Migration { public function up() { @@ -34,4 +34,4 @@ public function down() { Schema::dropIfExists('files'); } -} +}; diff --git a/database/migrations/2018_08_25_101000_create_structure_for_files.php b/database/migrations/2018_08_25_101000_create_structure_for_files.php index ffc10e4..a269f5c 100644 --- a/database/migrations/2018_08_25_101000_create_structure_for_files.php +++ b/database/migrations/2018_08_25_101000_create_structure_for_files.php @@ -2,7 +2,7 @@ use LaravelEnso\Migrator\Database\Migration; -class CreateStructureForFiles extends Migration +return new class extends Migration { protected array $permissions = [ ['name' => 'core.files.index', 'description' => 'List files', 'is_default' => true], @@ -21,4 +21,4 @@ class CreateStructureForFiles extends Migration protected array $menu = [ 'name' => 'Files', 'icon' => 'folder-open', 'route' => 'core.files.index', 'order_index' => 255, 'has_children' => false, ]; -} +}; diff --git a/database/migrations/2018_08_25_102000_create_uploads_table.php b/database/migrations/2018_08_25_102000_create_uploads_table.php index 719edec..5e9d315 100644 --- a/database/migrations/2018_08_25_102000_create_uploads_table.php +++ b/database/migrations/2018_08_25_102000_create_uploads_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateUploadsTable extends Migration +return new class extends Migration { public function up() { @@ -23,4 +23,4 @@ public function down() { Schema::dropIfExists('uploads'); } -} +}; diff --git a/database/migrations/2018_08_25_103000_create_structure_for_uploads.php b/database/migrations/2018_08_25_103000_create_structure_for_uploads.php index d8e5ec2..08e9ec0 100644 --- a/database/migrations/2018_08_25_103000_create_structure_for_uploads.php +++ b/database/migrations/2018_08_25_103000_create_structure_for_uploads.php @@ -2,10 +2,10 @@ use LaravelEnso\Migrator\Database\Migration; -class CreateStructureForUploads extends Migration +return new class extends Migration { protected array $permissions = [ ['name' => 'core.uploads.store', 'description' => 'Upload file', 'is_default' => true], ['name' => 'core.uploads.destroy', 'description' => 'Delete upload', 'is_default' => true], ]; -} +}; diff --git a/database/migrations/2022_01_17_100000_create_favorite_files_table.php b/database/migrations/2022_01_17_100000_create_favorite_files_table.php index 86b2beb..a8458cf 100644 --- a/database/migrations/2022_01_17_100000_create_favorite_files_table.php +++ b/database/migrations/2022_01_17_100000_create_favorite_files_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateFavoriteFilesTable extends Migration +return new class extends Migration { public function up() { @@ -27,4 +27,4 @@ public function down() { Schema::dropIfExists('favorite_files'); } -} +}; diff --git a/database/migrations/2022_01_23_100000_create_file_types_table.php b/database/migrations/2022_01_23_100000_create_file_types_table.php index 814f647..cf4e33d 100644 --- a/database/migrations/2022_01_23_100000_create_file_types_table.php +++ b/database/migrations/2022_01_23_100000_create_file_types_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateFileTypesTable extends Migration +return new class extends Migration { public function up() { @@ -30,4 +30,4 @@ public function down() { Schema::dropIfExists('file_types'); } -} +}; diff --git a/database/migrations/2022_01_23_101000_create_structure_for_file_types.php b/database/migrations/2022_01_23_101000_create_structure_for_file_types.php index 2f94d74..0625170 100644 --- a/database/migrations/2022_01_23_101000_create_structure_for_file_types.php +++ b/database/migrations/2022_01_23_101000_create_structure_for_file_types.php @@ -2,7 +2,7 @@ use LaravelEnso\Migrator\Database\Migration; -class CreateStructureForFileTypes extends Migration +return new class extends Migration { protected array $permissions = [ ['name' => 'administration.fileTypes.tableData', 'description' => 'Get table data for file types', 'is_default' => false], @@ -21,4 +21,4 @@ class CreateStructureForFileTypes extends Migration ]; protected ?string $parentMenu = 'Administration'; -} +}; From 302eabff659db7d5b834c7bf05dd1e9e5e78cd35 Mon Sep 17 00:00:00 2001 From: Mihai Date: Thu, 3 Mar 2022 11:44:14 +0200 Subject: [PATCH 12/65] updated migrations to fix ordering for FKs --- ..._01_01_112100_create_file_types_table.php} | 0 ... 2017_01_01_112200_create_files_table.php} | 0 ..._01_112300_create_structure_for_files.php} | 0 ...017_01_01_112400_create_uploads_table.php} | 0 ...1_112500_create_structure_for_uploads.php} | 0 ...01_112600_create_favorite_files_table.php} | 0 ...29000_create_structure_for_file_types.php} | 0 src/Upgrades/UpdateMigrationOrder.php | 47 +++++++++++++++++++ 8 files changed, 47 insertions(+) rename database/migrations/{2022_01_23_100000_create_file_types_table.php => 2017_01_01_112100_create_file_types_table.php} (100%) rename database/migrations/{2018_08_25_100000_create_files_table.php => 2017_01_01_112200_create_files_table.php} (100%) rename database/migrations/{2018_08_25_101000_create_structure_for_files.php => 2017_01_01_112300_create_structure_for_files.php} (100%) rename database/migrations/{2018_08_25_102000_create_uploads_table.php => 2017_01_01_112400_create_uploads_table.php} (100%) rename database/migrations/{2018_08_25_103000_create_structure_for_uploads.php => 2017_01_01_112500_create_structure_for_uploads.php} (100%) rename database/migrations/{2022_01_17_100000_create_favorite_files_table.php => 2017_01_01_112600_create_favorite_files_table.php} (100%) rename database/migrations/{2022_01_23_101000_create_structure_for_file_types.php => 2017_01_01_129000_create_structure_for_file_types.php} (100%) create mode 100644 src/Upgrades/UpdateMigrationOrder.php diff --git a/database/migrations/2022_01_23_100000_create_file_types_table.php b/database/migrations/2017_01_01_112100_create_file_types_table.php similarity index 100% rename from database/migrations/2022_01_23_100000_create_file_types_table.php rename to database/migrations/2017_01_01_112100_create_file_types_table.php diff --git a/database/migrations/2018_08_25_100000_create_files_table.php b/database/migrations/2017_01_01_112200_create_files_table.php similarity index 100% rename from database/migrations/2018_08_25_100000_create_files_table.php rename to database/migrations/2017_01_01_112200_create_files_table.php diff --git a/database/migrations/2018_08_25_101000_create_structure_for_files.php b/database/migrations/2017_01_01_112300_create_structure_for_files.php similarity index 100% rename from database/migrations/2018_08_25_101000_create_structure_for_files.php rename to database/migrations/2017_01_01_112300_create_structure_for_files.php diff --git a/database/migrations/2018_08_25_102000_create_uploads_table.php b/database/migrations/2017_01_01_112400_create_uploads_table.php similarity index 100% rename from database/migrations/2018_08_25_102000_create_uploads_table.php rename to database/migrations/2017_01_01_112400_create_uploads_table.php diff --git a/database/migrations/2018_08_25_103000_create_structure_for_uploads.php b/database/migrations/2017_01_01_112500_create_structure_for_uploads.php similarity index 100% rename from database/migrations/2018_08_25_103000_create_structure_for_uploads.php rename to database/migrations/2017_01_01_112500_create_structure_for_uploads.php diff --git a/database/migrations/2022_01_17_100000_create_favorite_files_table.php b/database/migrations/2017_01_01_112600_create_favorite_files_table.php similarity index 100% rename from database/migrations/2022_01_17_100000_create_favorite_files_table.php rename to database/migrations/2017_01_01_112600_create_favorite_files_table.php diff --git a/database/migrations/2022_01_23_101000_create_structure_for_file_types.php b/database/migrations/2017_01_01_129000_create_structure_for_file_types.php similarity index 100% rename from database/migrations/2022_01_23_101000_create_structure_for_file_types.php rename to database/migrations/2017_01_01_129000_create_structure_for_file_types.php diff --git a/src/Upgrades/UpdateMigrationOrder.php b/src/Upgrades/UpdateMigrationOrder.php new file mode 100644 index 0000000..64d88fc --- /dev/null +++ b/src/Upgrades/UpdateMigrationOrder.php @@ -0,0 +1,47 @@ + '2017_01_01_112100_create_file_types_table', + '2018_08_25_100000_create_files_table' => '2017_01_01_112200_create_files_table', + '2018_08_25_101000_create_structure_for_files' => '2017_01_01_112300_create_structure_for_files', + '2018_08_25_102000_create_uploads_table' => '2017_01_01_112400_create_uploads_table', + '2018_08_25_103000_create_structure_for_uploads' => '2017_01_01_112500_create_structure_for_uploads', + '2022_01_17_100000_create_favorite_files_table' => '2017_01_01_112600_create_favorite_files_table', + '2022_01_23_101000_create_structure_for_file_types' => '2017_01_01_129000_create_structure_for_file_types', + ]; + + private Collection $mapping; + + public function __construct() + { + $this->mapping = Collection::wrap(self::Mapping); + } + + public function isMigrated(): bool + { + return DB::table('migrations') + ->whereIn('migration', $this->mapping->keys()) + ->doesntExist(); + } + + public function migrateData(): void + { + $this->mapping->each(fn ($to, $from) => $this->update($from, $to)); + } + + private function update($from, $to): void + { + DB::table('migrations') + ->whereMigration($from) + ->update(['migration' => $to]); + } +} From c030b8c9708c09597e65199f50b181ee328fc891 Mon Sep 17 00:00:00 2001 From: Mihai Date: Thu, 3 Mar 2022 13:34:59 +0200 Subject: [PATCH 13/65] updated TemplatePath visibility --- src/Tables/Builders/Type.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tables/Builders/Type.php b/src/Tables/Builders/Type.php index c9087ba..8142668 100644 --- a/src/Tables/Builders/Type.php +++ b/src/Tables/Builders/Type.php @@ -17,6 +17,6 @@ public function query(): Builder public function templatePath(): string { - return static::TemplatePath; + return self::TemplatePath; } } From 4cead3fbae47d90a1e8d472c7de549518e124bba Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 3 Mar 2022 14:18:25 +0200 Subject: [PATCH 14/65] adds guarded in Upload --- src/Models/Upload.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Models/Upload.php b/src/Models/Upload.php index 45ba75b..8c1f846 100644 --- a/src/Models/Upload.php +++ b/src/Models/Upload.php @@ -11,6 +11,8 @@ class Upload extends Model implements Attachable { + protected $guarded = []; + public function file(): Relation { return $this->belongsTo(File::class); From a74a3f2bf3e7936856204e69e50d1b5b3227a8cb Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 3 Mar 2022 14:28:52 +0200 Subject: [PATCH 15/65] makes guarded empty in file --- src/Models/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Models/File.php b/src/Models/File.php index 7b79861..d91a36a 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -26,7 +26,7 @@ class File extends Model { use CreatedBy; - protected $guarded = ['id']; + protected $guarded = []; protected $casts = ['is_public' => 'boolean']; From af64c7a99c810b7907f532836917a157074dfb69 Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 3 Mar 2022 15:44:51 +0200 Subject: [PATCH 16/65] fixes file_id foreign --- .../migrations/2017_01_01_112400_create_uploads_table.php | 5 ++--- .../2017_01_01_112600_create_favorite_files_table.php | 6 +++--- src/Upgrades/DropMorphModels.php | 2 +- tests/features/FileTest.php | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/database/migrations/2017_01_01_112400_create_uploads_table.php b/database/migrations/2017_01_01_112400_create_uploads_table.php index 5e9d315..d73db9e 100644 --- a/database/migrations/2017_01_01_112400_create_uploads_table.php +++ b/database/migrations/2017_01_01_112400_create_uploads_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('uploads', function (Blueprint $table) { @@ -13,7 +12,7 @@ public function up() $table->unsignedBigInteger('file_id')->nullable(); $table->foreign('file_id')->references('id')->on('files') - ->onUpdate('restrict')->onDelete('cascade'); + ->onUpdate('restrict')->onDelete('restrict'); $table->timestamps(); }); diff --git a/database/migrations/2017_01_01_112600_create_favorite_files_table.php b/database/migrations/2017_01_01_112600_create_favorite_files_table.php index a8458cf..8f9aff4 100644 --- a/database/migrations/2017_01_01_112600_create_favorite_files_table.php +++ b/database/migrations/2017_01_01_112600_create_favorite_files_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('favorite_files', function (Blueprint $table) { @@ -15,7 +14,8 @@ public function up() $table->foreign('user_id')->references('id')->on('users'); $table->unsignedBigInteger('file_id')->index(); - $table->foreign('file_id')->references('id')->on('files'); + $table->foreign('file_id')->references('id')->on('files') + ->onUpdate('restrict')->onDelete('restrict'); $table->timestamps(); diff --git a/src/Upgrades/DropMorphModels.php b/src/Upgrades/DropMorphModels.php index fa1d318..41113ae 100644 --- a/src/Upgrades/DropMorphModels.php +++ b/src/Upgrades/DropMorphModels.php @@ -50,7 +50,7 @@ private function addForeignKey(string $model): self Schema::table($table, function (Blueprint $table) use ($after) { $table->unsignedBigInteger('file_id')->nullable()->after($after); $table->foreign('file_id')->references('id')->on('files') - ->onUpdate('restrict')->onDelete('cascade'); + ->onUpdate('restrict')->onDelete('restrict'); }); return $this; diff --git a/tests/features/FileTest.php b/tests/features/FileTest.php index b1ff751..8f90a62 100644 --- a/tests/features/FileTest.php +++ b/tests/features/FileTest.php @@ -128,7 +128,7 @@ private function createTestTable(): self $table->unsignedBigInteger('file_id')->nullable(); $table->foreign('file_id')->references('id')->on('files') - ->onUpdate('restrict')->onDelete('cascade'); + ->onUpdate('restrict')->onDelete('restrict'); $table->timestamps(); }); From 7d12c580f414f2b811167085ac7af5e9d2411e10 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Thu, 3 Mar 2022 13:45:00 +0000 Subject: [PATCH 17/65] Apply fixes from StyleCI --- database/migrations/2017_01_01_112400_create_uploads_table.php | 3 ++- .../2017_01_01_112600_create_favorite_files_table.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/database/migrations/2017_01_01_112400_create_uploads_table.php b/database/migrations/2017_01_01_112400_create_uploads_table.php index d73db9e..e102eec 100644 --- a/database/migrations/2017_01_01_112400_create_uploads_table.php +++ b/database/migrations/2017_01_01_112400_create_uploads_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('uploads', function (Blueprint $table) { diff --git a/database/migrations/2017_01_01_112600_create_favorite_files_table.php b/database/migrations/2017_01_01_112600_create_favorite_files_table.php index 8f9aff4..573af21 100644 --- a/database/migrations/2017_01_01_112600_create_favorite_files_table.php +++ b/database/migrations/2017_01_01_112600_create_favorite_files_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('favorite_files', function (Blueprint $table) { From c1e9cc16d67ba1debb8783043cb447236316f625 Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 3 Mar 2022 16:12:17 +0200 Subject: [PATCH 18/65] fixes set null/restrict in upgrade --- config/files.php | 1 + src/Upgrades/DropMorphModels.php | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config/files.php b/config/files.php index 63eff64..3ba02f5 100644 --- a/config/files.php +++ b/config/files.php @@ -17,6 +17,7 @@ 'storageLimit' => 500000, 'paginate' => (int) env('FILES_PAGINATION', 50), 'testingFolder' => 'testing', + 'onDeleteSetNull' => ['avatars', 'webshop_brands'], 'renameFolders' => [ 'dataImport' => 'import', 'dataExport' => 'export', diff --git a/src/Upgrades/DropMorphModels.php b/src/Upgrades/DropMorphModels.php index 41113ae..91cf9f1 100644 --- a/src/Upgrades/DropMorphModels.php +++ b/src/Upgrades/DropMorphModels.php @@ -46,11 +46,14 @@ private function addForeignKey(string $model): self { $table = $this->table($model); $after = $this->afterColumn($table); + $onDelete = in_array($table, Config::get('enso.files.onDeleteSetNull')) + ? 'SET NULL' + : 'restrict'; - Schema::table($table, function (Blueprint $table) use ($after) { + Schema::table($table, function (Blueprint $table) use ($after, $onDelete) { $table->unsignedBigInteger('file_id')->nullable()->after($after); $table->foreign('file_id')->references('id')->on('files') - ->onUpdate('restrict')->onDelete('restrict'); + ->onUpdate('restrict')->onDelete($onDelete); }); return $this; From 6f95fa7269377fb589799b6a5c0e42bc126b72db Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 4 Mar 2022 11:34:27 +0200 Subject: [PATCH 19/65] adds edit ability for file name --- ...1_01_112300_create_structure_for_files.php | 4 ++-- routes/app/files.php | 2 ++ src/Http/Controllers/File/Update.php | 22 +++++++++++++++++++ src/Http/Requests/ValidateName.php | 18 +++++++++++++++ src/Http/Resources/File.php | 3 ++- src/Models/File.php | 14 ++++++++++-- src/Upgrades/Permissions.php | 1 + 7 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 src/Http/Controllers/File/Update.php create mode 100644 src/Http/Requests/ValidateName.php diff --git a/database/migrations/2017_01_01_112300_create_structure_for_files.php b/database/migrations/2017_01_01_112300_create_structure_for_files.php index a269f5c..7e2f670 100644 --- a/database/migrations/2017_01_01_112300_create_structure_for_files.php +++ b/database/migrations/2017_01_01_112300_create_structure_for_files.php @@ -2,8 +2,7 @@ use LaravelEnso\Migrator\Database\Migration; -return new class extends Migration -{ +return new class extends Migration { protected array $permissions = [ ['name' => 'core.files.index', 'description' => 'List files', 'is_default' => true], ['name' => 'core.files.link', 'description' => 'Get file download temporary link', 'is_default' => true], @@ -13,6 +12,7 @@ ['name' => 'core.files.browse', 'description' => 'Browse file type', 'is_default' => true], ['name' => 'core.files.recent', 'description' => 'Browse recent files', 'is_default' => true], ['name' => 'core.files.favorites', 'description' => 'Browse favorites files', 'is_default' => true], + ['name' => 'core.files.update', 'description' => 'Update file name', 'is_default' => true], ['name' => 'core.files.makePublic', 'description' => 'Make file public', 'is_default' => true], ['name' => 'core.files.makePrivate', 'description' => 'Make file private', 'is_default' => true], ['name' => 'core.files.favorite', 'description' => 'Toggle file as favorite', 'is_default' => true], diff --git a/routes/app/files.php b/routes/app/files.php index 01bc067..36e6594 100644 --- a/routes/app/files.php +++ b/routes/app/files.php @@ -12,6 +12,7 @@ use LaravelEnso\Files\Http\Controllers\File\MakePublic; use LaravelEnso\Files\Http\Controllers\File\Recent; use LaravelEnso\Files\Http\Controllers\File\Show; +use LaravelEnso\Files\Http\Controllers\File\Update; Route::prefix('files') ->as('files.') @@ -24,6 +25,7 @@ Route::get('browse/{type}', Browse::class)->name('browse'); Route::get('recent', Recent::class)->name('recent'); Route::get('favorites', Favorites::class)->name('favorites'); + Route::patch('{file}', Update::class)->name('update'); Route::patch('makePublic/{file}', MakePublic::class)->name('makePublic'); Route::patch('makePrivate/{file}', MakePrivate::class)->name('makePrivate'); Route::patch('favorite/{file}', Favorite::class)->name('favorite'); diff --git a/src/Http/Controllers/File/Update.php b/src/Http/Controllers/File/Update.php new file mode 100644 index 0000000..e476da0 --- /dev/null +++ b/src/Http/Controllers/File/Update.php @@ -0,0 +1,22 @@ +authorize('manage', $file); + + $name = "{$request->get('name')}.{$file->extension()}"; + + $file->update(['original_name' => $name]); + } +} diff --git a/src/Http/Requests/ValidateName.php b/src/Http/Requests/ValidateName.php new file mode 100644 index 0000000..d117a93 --- /dev/null +++ b/src/Http/Requests/ValidateName.php @@ -0,0 +1,18 @@ + 'required|string|max:255']; + } +} diff --git a/src/Http/Resources/File.php b/src/Http/Resources/File.php index d764e52..53a8216 100644 --- a/src/Http/Resources/File.php +++ b/src/Http/Resources/File.php @@ -15,7 +15,8 @@ public function toArray($request) return [ 'id' => $this->id, - 'name' => $this->original_name, + 'name' => $this->name(), + 'extension' => $this->extension(), 'size' => DiskSize::forHumans($this->size), 'mimeType' => $this->mime_type, 'type' => new Type($this->whenLoaded('type')), diff --git a/src/Models/File.php b/src/Models/File.php index d91a36a..bad0259 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -98,11 +98,21 @@ public function scopeFilter(Builder $query, ?string $search): Builder ->where('original_name', 'LIKE', '%'.$search.'%')); } - public function name(): string + public function asciiName(): string { return Str::ascii($this->original_name); } + public function name(): string + { + return Str::beforeLast($this->asciiName(), '.'); + } + + public function extension(): string + { + return Str::afterLast($this->asciiName(), '.'); + } + public function path(): string { return "{$this->type->folder()}/{$this->saved_name}"; @@ -144,7 +154,7 @@ public function delete(bool $parent = false) public function download(): StreamedResponse { - return Storage::download($this->path(), $this->name()); + return Storage::download($this->path(), $this->asciiName()); } public function inline(): StreamedResponse diff --git a/src/Upgrades/Permissions.php b/src/Upgrades/Permissions.php index 19fc7af..86d4572 100644 --- a/src/Upgrades/Permissions.php +++ b/src/Upgrades/Permissions.php @@ -16,5 +16,6 @@ class Permissions implements MigratesStructure ['name' => 'core.files.favorites', 'description' => 'Browse favorites files', 'is_default' => true], ['name' => 'core.files.makePublic', 'description' => 'Make file public', 'is_default' => true], ['name' => 'core.files.makePrivate', 'description' => 'Make file private', 'is_default' => true], + ['name' => 'core.files.update', 'description' => 'Update file name', 'is_default' => true], ]; } From d8bcf2f47cfd87a71cb41496cb07d7988e550a66 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 4 Mar 2022 09:34:40 +0000 Subject: [PATCH 20/65] Apply fixes from StyleCI --- .../2017_01_01_112300_create_structure_for_files.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database/migrations/2017_01_01_112300_create_structure_for_files.php b/database/migrations/2017_01_01_112300_create_structure_for_files.php index 7e2f670..6b26045 100644 --- a/database/migrations/2017_01_01_112300_create_structure_for_files.php +++ b/database/migrations/2017_01_01_112300_create_structure_for_files.php @@ -2,7 +2,8 @@ use LaravelEnso\Migrator\Database\Migration; -return new class extends Migration { +return new class extends Migration +{ protected array $permissions = [ ['name' => 'core.files.index', 'description' => 'List files', 'is_default' => true], ['name' => 'core.files.link', 'description' => 'Get file download temporary link', 'is_default' => true], From f385670ba4173fef282dbd53749da3496e4fef9c Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 4 Mar 2022 11:54:35 +0200 Subject: [PATCH 21/65] moves file type handling to FE --- src/Http/Resources/File.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Http/Resources/File.php b/src/Http/Resources/File.php index 53a8216..9a0c275 100644 --- a/src/Http/Resources/File.php +++ b/src/Http/Resources/File.php @@ -3,7 +3,6 @@ namespace LaravelEnso\Files\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; -use Illuminate\Support\Str; use LaravelEnso\Helpers\Services\DiskSize; use LaravelEnso\Users\Http\Resources\User; @@ -24,17 +23,8 @@ public function toArray($request) 'isFavorite' => (bool) $this->whenLoaded('favorite'), 'isManageable' => $request->user()->can('manage', $this->resource), 'isAccessible' => $accessible, - 'isViewable' => $accessible && $this->isImage(), 'isPublic' => $this->is_public, 'createdAt' => $this->created_at->toDatetimeString(), ]; } - - private function isImage(): bool - { - $mimeType = Str::of($this->mime_type); - - return $mimeType->startsWith('image') - || $mimeType->is('application/pdf'); - } } From e993983c4091890f578358d3380dfc1361440e44 Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 4 Mar 2022 12:36:37 +0200 Subject: [PATCH 22/65] improves folder move --- src/Http/Controllers/Type/Update.php | 5 +---- src/Models/Type.php | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Http/Controllers/Type/Update.php b/src/Http/Controllers/Type/Update.php index 81f345f..af74d7f 100644 --- a/src/Http/Controllers/Type/Update.php +++ b/src/Http/Controllers/Type/Update.php @@ -3,7 +3,6 @@ namespace LaravelEnso\Files\Http\Controllers\Type; use Illuminate\Routing\Controller; -use Illuminate\Support\Facades\Storage; use LaravelEnso\Files\Http\Requests\ValidateType; use LaravelEnso\Files\Models\Type; @@ -14,9 +13,7 @@ public function __invoke(ValidateType $request, Type $type) $type->fill($request->validated()); if ($type->isDirty('folder')) { - $from = Storage::path($type->getOriginal('folder')); - $to = Storage::path($type->folder); - rename($from, $to); + $type->move(); } $type->save(); diff --git a/src/Models/Type.php b/src/Models/Type.php index 32f0e45..b61e362 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\File as FileFacade; use Illuminate\Support\Facades\Storage; use LaravelEnso\Files\Contracts\Attachable; use LaravelEnso\Files\Contracts\PublicFile; @@ -73,4 +74,17 @@ public function path(string $filename): string { return "{$this->folder()}/{$filename}"; } + + public function move(): void + { + $from = Storage::path($this->getOriginal('folder')); + $to = Storage::path($this->folder); + + if (FileFacade::isDirectory($to)) { + FileFacade::copyDirectory($from, $to); + FileFacade::deleteDirectory($from); + } else { + FileFacade::moveDirectory($from, $to); + } + } } From 5a691ae96e32deb21801a0b297a887880abd4a22 Mon Sep 17 00:00:00 2001 From: mishu Date: Sun, 6 Mar 2022 21:34:20 +0200 Subject: [PATCH 23/65] adds created_at index --- ..._01_112600_create_favorite_files_table.php | 4 ++-- src/Upgrades/CreatedAtIndex.php | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/Upgrades/CreatedAtIndex.php diff --git a/database/migrations/2017_01_01_112600_create_favorite_files_table.php b/database/migrations/2017_01_01_112600_create_favorite_files_table.php index 573af21..fe076d0 100644 --- a/database/migrations/2017_01_01_112600_create_favorite_files_table.php +++ b/database/migrations/2017_01_01_112600_create_favorite_files_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('favorite_files', function (Blueprint $table) { @@ -21,6 +20,7 @@ public function up() $table->timestamps(); $table->unique(['user_id', 'file_id']); + $table->index(['created_at']); }); } diff --git a/src/Upgrades/CreatedAtIndex.php b/src/Upgrades/CreatedAtIndex.php new file mode 100644 index 0000000..20e5628 --- /dev/null +++ b/src/Upgrades/CreatedAtIndex.php @@ -0,0 +1,21 @@ + $table->index(['created_at'])); + } +} From d020da6fa080ec3b89052f2e694c00be41b6bea9 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Sun, 6 Mar 2022 19:34:34 +0000 Subject: [PATCH 24/65] Apply fixes from StyleCI --- .../2017_01_01_112600_create_favorite_files_table.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database/migrations/2017_01_01_112600_create_favorite_files_table.php b/database/migrations/2017_01_01_112600_create_favorite_files_table.php index fe076d0..2cd6688 100644 --- a/database/migrations/2017_01_01_112600_create_favorite_files_table.php +++ b/database/migrations/2017_01_01_112600_create_favorite_files_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('favorite_files', function (Blueprint $table) { From b23f4a12b975fea87ec6d1a68bb13da27231495b Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 7 Mar 2022 08:26:25 +0200 Subject: [PATCH 25/65] fixes file access policy --- src/Policies/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Policies/File.php b/src/Policies/File.php index 90f6ec1..7c5400e 100644 --- a/src/Policies/File.php +++ b/src/Policies/File.php @@ -21,7 +21,7 @@ public function access(User $user, Model $file) { return $file->is_public || $this->ownsFile($user, $file) - || new $file->type->isPublic(); + || $file->type->isPublic(); } public function manage(User $user, Model $file) From f5ca3ad2b0c704ea16201d2d8b2c264b8cd13aef Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 7 Mar 2022 09:02:10 +0200 Subject: [PATCH 26/65] removes before migration for created_at index --- src/Upgrades/CreatedAtIndex.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Upgrades/CreatedAtIndex.php b/src/Upgrades/CreatedAtIndex.php index 20e5628..b39ac1e 100644 --- a/src/Upgrades/CreatedAtIndex.php +++ b/src/Upgrades/CreatedAtIndex.php @@ -3,11 +3,10 @@ namespace LaravelEnso\Files\Upgrades; use Illuminate\Support\Facades\Schema; -use LaravelEnso\Upgrade\Contracts\BeforeMigration; use LaravelEnso\Upgrade\Contracts\MigratesTable; use LaravelEnso\Upgrade\Helpers\Table; -class CreatedAtIndex implements MigratesTable, BeforeMigration +class CreatedAtIndex implements MigratesTable { public function isMigrated(): bool { From 5084bb0d8215c304e8cbb34021c1bc3cccf58586 Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 7 Mar 2022 14:33:32 +0200 Subject: [PATCH 27/65] removes onDeleteSetNull --- config/files.php | 1 - src/Upgrades/DropMorphModels.php | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/config/files.php b/config/files.php index 3ba02f5..63eff64 100644 --- a/config/files.php +++ b/config/files.php @@ -17,7 +17,6 @@ 'storageLimit' => 500000, 'paginate' => (int) env('FILES_PAGINATION', 50), 'testingFolder' => 'testing', - 'onDeleteSetNull' => ['avatars', 'webshop_brands'], 'renameFolders' => [ 'dataImport' => 'import', 'dataExport' => 'export', diff --git a/src/Upgrades/DropMorphModels.php b/src/Upgrades/DropMorphModels.php index 91cf9f1..41113ae 100644 --- a/src/Upgrades/DropMorphModels.php +++ b/src/Upgrades/DropMorphModels.php @@ -46,14 +46,11 @@ private function addForeignKey(string $model): self { $table = $this->table($model); $after = $this->afterColumn($table); - $onDelete = in_array($table, Config::get('enso.files.onDeleteSetNull')) - ? 'SET NULL' - : 'restrict'; - Schema::table($table, function (Blueprint $table) use ($after, $onDelete) { + Schema::table($table, function (Blueprint $table) use ($after) { $table->unsignedBigInteger('file_id')->nullable()->after($after); $table->foreign('file_id')->references('id')->on('files') - ->onUpdate('restrict')->onDelete($onDelete); + ->onUpdate('restrict')->onDelete('restrict'); }); return $this; From 8c42a0593ea6ee6bf0e42bce953e58bc6787127b Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 17 Mar 2022 15:13:45 +0200 Subject: [PATCH 28/65] adds file id unique upgrade --- src/Upgrades/MakeFileIdUnique.php | 62 +++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/Upgrades/MakeFileIdUnique.php diff --git a/src/Upgrades/MakeFileIdUnique.php b/src/Upgrades/MakeFileIdUnique.php new file mode 100644 index 0000000..d37076e --- /dev/null +++ b/src/Upgrades/MakeFileIdUnique.php @@ -0,0 +1,62 @@ +needUpgrade()->isEmpty(); + } + + public function migrateTable(): void + { + Model::unsetEventDispatcher(); + + $this->needUpgrade()->each(fn ($model) => $this->upgrade($model)); + } + + private function upgrade(string $model): void + { + $table = $this->table($model); + + Schema::table($table, fn ($table) => $table->unique('file_id')); + } + + private function needUpgrade(): Collection + { + $upgraded = fn ($model) => Table::hasIndex( + $this->table($model), + "{$this->table($model)}_file_id_unique" + ); + + return $this->models()->reject($upgraded); + } + + private function table(string $model): string + { + return (new $model())->getTable(); + } + + private function models(): Collection + { + $upgrade = Config::get('enso.files.upgrade'); + + return Collection::wrap($upgrade) + ->filter(fn ($model) => class_exists($model)); + } +} From dfb7b4796b3348fbf5d79a1e738a2b8b9463cf25 Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 4 Apr 2022 18:04:27 +0300 Subject: [PATCH 29/65] fixes destroy redirect --- config/files.php | 2 ++ src/Http/Controllers/Type/Destroy.php | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/config/files.php b/config/files.php index 63eff64..d4f56c7 100644 --- a/config/files.php +++ b/config/files.php @@ -5,6 +5,7 @@ use LaravelEnso\DataImport\Models\Import; use LaravelEnso\DataImport\Models\RejectedImport; use LaravelEnso\Documents\Models\Document; +use LaravelEnso\Emag\Models\AWB; use LaravelEnso\Files\Models\Upload; use LaravelEnso\HowTo\Models\Poster; use LaravelEnso\HowTo\Models\Video; @@ -26,6 +27,7 @@ 'files', 'imports', 'carousel', 'howToVideos', 'webshopCarouselSlide', ], 'upgrade' => [ + 'awb' => AWB::class, 'avatar' => Avatar::class, 'dataExport' => Export::class, 'upload' => Upload::class, diff --git a/src/Http/Controllers/Type/Destroy.php b/src/Http/Controllers/Type/Destroy.php index d30f908..38a4d1f 100644 --- a/src/Http/Controllers/Type/Destroy.php +++ b/src/Http/Controllers/Type/Destroy.php @@ -13,5 +13,10 @@ class Destroy extends Controller public function __invoke(Type $type) { $type->delete(); + + return [ + 'message' => __('The file type was successfully deleted'), + 'redirect' => 'administration.fileTypes.index', + ]; } } From 0b66f2d9b54f326101e7b5476b9f6f905b9cb518 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Mon, 4 Apr 2022 15:04:40 +0000 Subject: [PATCH 30/65] Apply fixes from StyleCI --- src/Http/Controllers/Type/Destroy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/Type/Destroy.php b/src/Http/Controllers/Type/Destroy.php index 38a4d1f..77d7b35 100644 --- a/src/Http/Controllers/Type/Destroy.php +++ b/src/Http/Controllers/Type/Destroy.php @@ -15,7 +15,7 @@ public function __invoke(Type $type) $type->delete(); return [ - 'message' => __('The file type was successfully deleted'), + 'message' => __('The file type was successfully deleted'), 'redirect' => 'administration.fileTypes.index', ]; } From 41f4dfe995821fee5dca636a5da4d6f929a9f67c Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 4 Apr 2022 18:26:50 +0300 Subject: [PATCH 31/65] removes emag awb --- config/files.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/files.php b/config/files.php index d4f56c7..63eff64 100644 --- a/config/files.php +++ b/config/files.php @@ -5,7 +5,6 @@ use LaravelEnso\DataImport\Models\Import; use LaravelEnso\DataImport\Models\RejectedImport; use LaravelEnso\Documents\Models\Document; -use LaravelEnso\Emag\Models\AWB; use LaravelEnso\Files\Models\Upload; use LaravelEnso\HowTo\Models\Poster; use LaravelEnso\HowTo\Models\Video; @@ -27,7 +26,6 @@ 'files', 'imports', 'carousel', 'howToVideos', 'webshopCarouselSlide', ], 'upgrade' => [ - 'awb' => AWB::class, 'avatar' => Avatar::class, 'dataExport' => Export::class, 'upload' => Upload::class, From c8be7b123f0ba9b4b2f3a350f9084c576e04887f Mon Sep 17 00:00:00 2001 From: mishu Date: Wed, 6 Apr 2022 09:59:41 +0300 Subject: [PATCH 32/65] removes file in attachable; adds CascadesFileDeletion interface --- src/Contracts/Attachable.php | 3 --- src/Contracts/CascadesFileDeletion.php | 10 ++++++++++ src/Http/Controllers/File/Destroy.php | 2 +- src/Models/File.php | 11 ++++++++--- src/Models/Upload.php | 8 +++++++- 5 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 src/Contracts/CascadesFileDeletion.php diff --git a/src/Contracts/Attachable.php b/src/Contracts/Attachable.php index 8adb8b8..2a2187f 100644 --- a/src/Contracts/Attachable.php +++ b/src/Contracts/Attachable.php @@ -2,9 +2,6 @@ namespace LaravelEnso\Files\Contracts; -use Illuminate\Database\Eloquent\Relations\Relation; - interface Attachable { - public function file(): Relation; } diff --git a/src/Contracts/CascadesFileDeletion.php b/src/Contracts/CascadesFileDeletion.php new file mode 100644 index 0000000..b30867b --- /dev/null +++ b/src/Contracts/CascadesFileDeletion.php @@ -0,0 +1,10 @@ +authorize('manage', $file); - DB::transaction(fn () => $file->delete(true)); + DB::transaction(fn () => $file->delete()); } } diff --git a/src/Models/File.php b/src/Models/File.php index bad0259..e350951 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -14,11 +14,13 @@ use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; use LaravelEnso\Files\Contracts\Attachable; +use LaravelEnso\Files\Contracts\CascadesFileDeletion; use LaravelEnso\Files\Services\ImageProcessor; use LaravelEnso\Files\Services\Upload; use LaravelEnso\ImageTransformer\Services\ImageTransformer; use LaravelEnso\TrackWho\Traits\CreatedBy; use LaravelEnso\Users\Models\User; +use ReflectionClass; use Symfony\Component\HttpFoundation\File\File as BaseFile; use Symfony\Component\HttpFoundation\StreamedResponse; @@ -139,10 +141,13 @@ public static function upload(Attachable $attachable, UploadedFile $file): self return (new Upload($attachable, $file))->handle(); } - public function delete(bool $parent = false) + public function delete() { - if ($parent) { - $this->type->model::whereFileId($this->id)->first()->delete(); + $cascadesDeletion = (new ReflectionClass($this->type->model)) + ->implementsInterface(CascadesFileDeletion::class); + + if ($cascadesDeletion) { + $this->type->model::cascadeDeletion($this); } $this->favorites->each->delete(); diff --git a/src/Models/Upload.php b/src/Models/Upload.php index 8c1f846..ce83273 100644 --- a/src/Models/Upload.php +++ b/src/Models/Upload.php @@ -7,9 +7,10 @@ use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use LaravelEnso\Files\Contracts\Attachable; +use LaravelEnso\Files\Contracts\CascadesFileDeletion; use LaravelEnso\Files\Http\Resources\File as Resource; -class Upload extends Model implements Attachable +class Upload extends Model implements Attachable, CascadesFileDeletion { protected $guarded = []; @@ -18,6 +19,11 @@ public function file(): Relation return $this->belongsTo(File::class); } + public static function cascadeDeletion(File $file): void + { + self::whereFileId($file->id)->get()->delete(); + } + public static function store(array $files) { return DB::transaction(fn () => Collection::wrap($files) From 3ee93825534feecbe8441a012d9aa5625fd88451 Mon Sep 17 00:00:00 2001 From: mishu Date: Wed, 6 Apr 2022 10:06:26 +0300 Subject: [PATCH 33/65] renames method --- src/Contracts/CascadesFileDeletion.php | 2 +- src/Models/File.php | 2 +- src/Models/Upload.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Contracts/CascadesFileDeletion.php b/src/Contracts/CascadesFileDeletion.php index b30867b..5d098c5 100644 --- a/src/Contracts/CascadesFileDeletion.php +++ b/src/Contracts/CascadesFileDeletion.php @@ -6,5 +6,5 @@ interface CascadesFileDeletion { - public static function cascadeDeletion(File $file): void; + public static function cascadeFileDeletion(File $file): void; } diff --git a/src/Models/File.php b/src/Models/File.php index e350951..aa4b8f2 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -147,7 +147,7 @@ public function delete() ->implementsInterface(CascadesFileDeletion::class); if ($cascadesDeletion) { - $this->type->model::cascadeDeletion($this); + $this->type->model::cascadeFileDeletion($this); } $this->favorites->each->delete(); diff --git a/src/Models/Upload.php b/src/Models/Upload.php index ce83273..69b3f95 100644 --- a/src/Models/Upload.php +++ b/src/Models/Upload.php @@ -19,7 +19,7 @@ public function file(): Relation return $this->belongsTo(File::class); } - public static function cascadeDeletion(File $file): void + public static function cascadeFileDeletion(File $file): void { self::whereFileId($file->id)->get()->delete(); } From 8d4dcdee7d5107fc4ff47b656e5c46471cf4fab5 Mon Sep 17 00:00:00 2001 From: GITmanuela <44998004+GITmanuela@users.noreply.github.com> Date: Wed, 6 Apr 2022 15:44:25 +0300 Subject: [PATCH 34/65] fixed cascadesOnDeletion --- src/Models/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Models/Upload.php b/src/Models/Upload.php index 69b3f95..d81b0da 100644 --- a/src/Models/Upload.php +++ b/src/Models/Upload.php @@ -21,7 +21,7 @@ public function file(): Relation public static function cascadeFileDeletion(File $file): void { - self::whereFileId($file->id)->get()->delete(); + self::whereFileId($file->id)->first()->delete(); } public static function store(array $files) From b3c8cd1f9037b98f0a13e7363846314812a45150 Mon Sep 17 00:00:00 2001 From: mishu Date: Wed, 6 Apr 2022 16:00:56 +0300 Subject: [PATCH 35/65] fixes cascadable --- src/Http/Controllers/File/Destroy.php | 2 +- src/Models/File.php | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Http/Controllers/File/Destroy.php b/src/Http/Controllers/File/Destroy.php index fe3c337..e55f33b 100644 --- a/src/Http/Controllers/File/Destroy.php +++ b/src/Http/Controllers/File/Destroy.php @@ -15,6 +15,6 @@ public function __invoke(File $file) { $this->authorize('manage', $file); - DB::transaction(fn () => $file->delete()); + DB::transaction(fn () => $file->delete(true)); } } diff --git a/src/Models/File.php b/src/Models/File.php index aa4b8f2..bb02b56 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -141,9 +141,10 @@ public static function upload(Attachable $attachable, UploadedFile $file): self return (new Upload($attachable, $file))->handle(); } - public function delete() + public function delete(bool $cascadable = false) { - $cascadesDeletion = (new ReflectionClass($this->type->model)) + $cascadesDeletion = $cascadable + && (new ReflectionClass($this->type->model)) ->implementsInterface(CascadesFileDeletion::class); if ($cascadesDeletion) { From 70dc69f5e21b8ab087f327c83cc626981d3aaf62 Mon Sep 17 00:00:00 2001 From: mishu Date: Wed, 6 Apr 2022 16:06:40 +0300 Subject: [PATCH 36/65] adds minssing unique() on file_id --- .../migrations/2017_01_01_112400_create_uploads_table.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/database/migrations/2017_01_01_112400_create_uploads_table.php b/database/migrations/2017_01_01_112400_create_uploads_table.php index e102eec..557c740 100644 --- a/database/migrations/2017_01_01_112400_create_uploads_table.php +++ b/database/migrations/2017_01_01_112400_create_uploads_table.php @@ -4,14 +4,13 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('uploads', function (Blueprint $table) { $table->increments('id'); - $table->unsignedBigInteger('file_id')->nullable(); + $table->unsignedBigInteger('file_id')->nullable()->unique(); $table->foreign('file_id')->references('id')->on('files') ->onUpdate('restrict')->onDelete('restrict'); From d4f72f85fa2ae787763b363fe87b2de3100e4810 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 6 Apr 2022 13:06:53 +0000 Subject: [PATCH 37/65] Apply fixes from StyleCI --- database/migrations/2017_01_01_112400_create_uploads_table.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database/migrations/2017_01_01_112400_create_uploads_table.php b/database/migrations/2017_01_01_112400_create_uploads_table.php index 557c740..7f4078b 100644 --- a/database/migrations/2017_01_01_112400_create_uploads_table.php +++ b/database/migrations/2017_01_01_112400_create_uploads_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('uploads', function (Blueprint $table) { From 0bb0191fceca248c33ef97a86fee5ec990fabfde Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 29 Apr 2022 14:21:28 +0300 Subject: [PATCH 38/65] add upgrade to drop old morphable index --- src/Upgrades/DropOldIndex.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/Upgrades/DropOldIndex.php diff --git a/src/Upgrades/DropOldIndex.php b/src/Upgrades/DropOldIndex.php new file mode 100644 index 0000000..f507dbe --- /dev/null +++ b/src/Upgrades/DropOldIndex.php @@ -0,0 +1,22 @@ + $table->dropIndex(self::Index)); + } +} From 9d1e0b2703a611aff110ff0a3c32e004b91a7b75 Mon Sep 17 00:00:00 2001 From: mishu Date: Fri, 29 Apr 2022 14:31:16 +0300 Subject: [PATCH 39/65] improves performance in files index --- src/Upgrades/AddTypeIdCreatedAtIndex.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/Upgrades/AddTypeIdCreatedAtIndex.php diff --git a/src/Upgrades/AddTypeIdCreatedAtIndex.php b/src/Upgrades/AddTypeIdCreatedAtIndex.php new file mode 100644 index 0000000..aa58e10 --- /dev/null +++ b/src/Upgrades/AddTypeIdCreatedAtIndex.php @@ -0,0 +1,23 @@ + $table + ->index(['type_id', 'created_at'])); + } +} From d79f5d5cd6a5088c2f25dc057eef13361d554904 Mon Sep 17 00:00:00 2001 From: Mihai Date: Fri, 29 Apr 2022 15:26:57 +0300 Subject: [PATCH 40/65] fixed upgrade order & type (manual) --- src/Upgrades/AddTypeIdCreatedAtIndex.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Upgrades/AddTypeIdCreatedAtIndex.php b/src/Upgrades/AddTypeIdCreatedAtIndex.php index aa58e10..8384626 100644 --- a/src/Upgrades/AddTypeIdCreatedAtIndex.php +++ b/src/Upgrades/AddTypeIdCreatedAtIndex.php @@ -4,12 +4,19 @@ use Illuminate\Support\Facades\Schema; use LaravelEnso\Upgrade\Contracts\MigratesTable; +use LaravelEnso\Upgrade\Contracts\Prioritization; +use LaravelEnso\Upgrade\Contracts\ShouldRunManually; use LaravelEnso\Upgrade\Helpers\Table; -class AddTypeIdCreatedAtIndex implements MigratesTable +class AddTypeIdCreatedAtIndex implements MigratesTable, Prioritization, ShouldRunManually { private const Index = 'files_type_id_created_at_index'; + public function priority(): int + { + return 106; + } + public function isMigrated(): bool { return Table::hasIndex('files', self::Index); From fee2f5a66d36b49da9f14456525ba83249852d4f Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 9 May 2022 16:30:35 +0300 Subject: [PATCH 41/65] adds missing index --- database/migrations/2017_01_01_112200_create_files_table.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/database/migrations/2017_01_01_112200_create_files_table.php b/database/migrations/2017_01_01_112200_create_files_table.php index f6f1fe3..52686aa 100644 --- a/database/migrations/2017_01_01_112200_create_files_table.php +++ b/database/migrations/2017_01_01_112200_create_files_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('files', function (Blueprint $table) { @@ -27,6 +26,8 @@ public function up() $table->foreign('created_by')->references('id')->on('users'); $table->timestamps(); + + $table->index('created_at'); }); } From 59c710722ec538691f6eb3485665ad0dc16261dd Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Mon, 9 May 2022 13:30:51 +0000 Subject: [PATCH 42/65] Apply fixes from StyleCI --- database/migrations/2017_01_01_112200_create_files_table.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database/migrations/2017_01_01_112200_create_files_table.php b/database/migrations/2017_01_01_112200_create_files_table.php index 52686aa..c9640af 100644 --- a/database/migrations/2017_01_01_112200_create_files_table.php +++ b/database/migrations/2017_01_01_112200_create_files_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('files', function (Blueprint $table) { From 0da471b87c308877837718ea409102487b31ea5e Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 9 May 2022 16:31:53 +0300 Subject: [PATCH 43/65] adds type_id & created_at index --- database/migrations/2017_01_01_112200_create_files_table.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/migrations/2017_01_01_112200_create_files_table.php b/database/migrations/2017_01_01_112200_create_files_table.php index 52686aa..8e6d947 100644 --- a/database/migrations/2017_01_01_112200_create_files_table.php +++ b/database/migrations/2017_01_01_112200_create_files_table.php @@ -28,6 +28,7 @@ public function up() $table->timestamps(); $table->index('created_at'); + $table->index(['type_id', 'created_at']); }); } From 80deba75ff52ff5ce035dc3cbc221df165648849 Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 30 Jan 2023 08:42:47 +0200 Subject: [PATCH 44/65] adds state for types --- routes/app/files.php | 2 -- src/Http/Controllers/File/Index.php | 17 ----------------- src/State/Types.php | 20 ++++++++++++++++++++ 3 files changed, 20 insertions(+), 19 deletions(-) delete mode 100644 src/Http/Controllers/File/Index.php create mode 100644 src/State/Types.php diff --git a/routes/app/files.php b/routes/app/files.php index 36e6594..bb70e0a 100644 --- a/routes/app/files.php +++ b/routes/app/files.php @@ -6,7 +6,6 @@ use LaravelEnso\Files\Http\Controllers\File\Download; use LaravelEnso\Files\Http\Controllers\File\Favorite; use LaravelEnso\Files\Http\Controllers\File\Favorites; -use LaravelEnso\Files\Http\Controllers\File\Index; use LaravelEnso\Files\Http\Controllers\File\Link; use LaravelEnso\Files\Http\Controllers\File\MakePrivate; use LaravelEnso\Files\Http\Controllers\File\MakePublic; @@ -17,7 +16,6 @@ Route::prefix('files') ->as('files.') ->group(function () { - Route::get('', Index::class)->name('index'); Route::get('link/{file}', Link::class)->name('link'); Route::get('download/{file}', Download::class)->name('download'); Route::delete('{file}', Destroy::class)->name('destroy'); diff --git a/src/Http/Controllers/File/Index.php b/src/Http/Controllers/File/Index.php deleted file mode 100644 index 6edb00e..0000000 --- a/src/Http/Controllers/File/Index.php +++ /dev/null @@ -1,17 +0,0 @@ -browsable()->get(); - - return ['folders' => Resource::collection($folders)]; - } -} diff --git a/src/State/Types.php b/src/State/Types.php new file mode 100644 index 0000000..3adb3a6 --- /dev/null +++ b/src/State/Types.php @@ -0,0 +1,20 @@ +get()); + } +} From 26aa8c4a61e0ba2052ae52f5106139910200661f Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 30 Jan 2023 19:24:18 +0200 Subject: [PATCH 45/65] improves upload controller logic --- src/Http/Controllers/Upload/Store.php | 6 +++++- src/Http/Resources/File.php | 2 +- src/Http/Resources/Type.php | 1 + src/Models/Upload.php | 9 ++++----- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Http/Controllers/Upload/Store.php b/src/Http/Controllers/Upload/Store.php index a422fcb..bfda02d 100644 --- a/src/Http/Controllers/Upload/Store.php +++ b/src/Http/Controllers/Upload/Store.php @@ -4,12 +4,16 @@ use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use LaravelEnso\Files\Http\Resources\File; use LaravelEnso\Files\Models\Upload; class Store extends Controller { public function __invoke(Request $request, Upload $upload) { - return $upload->store($request->allFiles()); + $files = $upload->store($request->allFiles()); + $files->each->load('createdBy.person', 'createdBy.avatar', 'type'); + + return File::collection($files); } } diff --git a/src/Http/Resources/File.php b/src/Http/Resources/File.php index 9a0c275..4c21464 100644 --- a/src/Http/Resources/File.php +++ b/src/Http/Resources/File.php @@ -20,7 +20,7 @@ public function toArray($request) 'mimeType' => $this->mime_type, 'type' => new Type($this->whenLoaded('type')), 'owner' => new User($this->whenLoaded('createdBy')), - 'isFavorite' => (bool) $this->whenLoaded('favorite'), + 'isFavorite' => $this->relationLoaded('favorite') ? $this->favorite : false, 'isManageable' => $request->user()->can('manage', $this->resource), 'isAccessible' => $accessible, 'isPublic' => $this->is_public, diff --git a/src/Http/Resources/Type.php b/src/Http/Resources/Type.php index cb545af..6596ed3 100644 --- a/src/Http/Resources/Type.php +++ b/src/Http/Resources/Type.php @@ -14,6 +14,7 @@ public function toArray($request) 'id' => $this->id, 'name' => Str::title($this->name), 'icon' => $this->icon, + 'folder' => $this->folder, 'endpoint' => $this->endpoint, 'isBrowsable' => $this->is_browsable, 'isSystem' => $this->is_system, diff --git a/src/Models/Upload.php b/src/Models/Upload.php index d81b0da..200dd75 100644 --- a/src/Models/Upload.php +++ b/src/Models/Upload.php @@ -4,11 +4,11 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\Relation; +use Illuminate\Http\UploadedFile; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use LaravelEnso\Files\Contracts\Attachable; use LaravelEnso\Files\Contracts\CascadesFileDeletion; -use LaravelEnso\Files\Http\Resources\File as Resource; class Upload extends Model implements Attachable, CascadesFileDeletion { @@ -24,20 +24,19 @@ public static function cascadeFileDeletion(File $file): void self::whereFileId($file->id)->first()->delete(); } - public static function store(array $files) + public static function store(array $files): Collection { return DB::transaction(fn () => Collection::wrap($files) ->map(fn ($file) => self::upload($file))) ->values(); } - private static function upload($file): Resource + protected static function upload(UploadedFile $file): File { $upload = self::create(); $file = File::upload($upload, $file); $upload->file()->associate($file)->save(); - $file->load('createdBy.person', 'createdBy.avatar', 'type'); - return new Resource($file); + return $upload->file; } } From 5db059ff62426900863f92a47277aec981512ff3 Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 30 Jan 2023 19:28:21 +0200 Subject: [PATCH 46/65] adds loadData in file model --- src/Http/Controllers/Upload/Store.php | 2 +- src/Models/File.php | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Http/Controllers/Upload/Store.php b/src/Http/Controllers/Upload/Store.php index bfda02d..609918c 100644 --- a/src/Http/Controllers/Upload/Store.php +++ b/src/Http/Controllers/Upload/Store.php @@ -12,7 +12,7 @@ class Store extends Controller public function __invoke(Request $request, Upload $upload) { $files = $upload->store($request->allFiles()); - $files->each->load('createdBy.person', 'createdBy.avatar', 'type'); + $files->each->loadData(); return File::collection($files); } diff --git a/src/Models/File.php b/src/Models/File.php index bb02b56..a53c7d5 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -100,6 +100,13 @@ public function scopeFilter(Builder $query, ?string $search): Builder ->where('original_name', 'LIKE', '%'.$search.'%')); } + public function loadData(): self + { + $attrs = ['type', 'createdBy.person', 'createdBy.avatar', 'favorite']; + + return $this->load($attrs); + } + public function asciiName(): string { return Str::ascii($this->original_name); From 63fde64489df65b4fbeee9d71b9193d851e4b22f Mon Sep 17 00:00:00 2001 From: mishu Date: Sat, 11 Mar 2023 13:01:21 +0200 Subject: [PATCH 47/65] fixes icons in type index table; --- src/Models/Type.php | 10 +++++++++- src/Tables/Builders/Type.php | 7 +++++-- src/Tables/Templates/types.json | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Models/Type.php b/src/Models/Type.php index b61e362..485ea2b 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\File as FileFacade; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; use LaravelEnso\Files\Contracts\Attachable; use LaravelEnso\Files\Contracts\PublicFile; use LaravelEnso\Rememberable\Traits\Rememberable; @@ -41,6 +42,13 @@ public function scopeOrdered(Builder $query): Builder return $query->orderByDesc('is_system')->orderBy('id'); } + public function icon(): string | array + { + return Str::contains($this->icon, ' ') + ? explode(' ', $this->icon) + : $this->icon; + } + public function model(): Attachable { return new $this->model; @@ -63,7 +71,7 @@ public function folder(): string ? Config::get('enso.files.testingFolder') : $this->folder; - if (! Storage::has($folder)) { + if (!Storage::has($folder)) { Storage::makeDirectory($folder); } diff --git a/src/Tables/Builders/Type.php b/src/Tables/Builders/Type.php index 8142668..67e41c1 100644 --- a/src/Tables/Builders/Type.php +++ b/src/Tables/Builders/Type.php @@ -8,11 +8,14 @@ class Type implements Table { - private const TemplatePath = __DIR__.'/../Templates/types.json'; + private const TemplatePath = __DIR__ . '/../Templates/types.json'; public function query(): Builder { - return Model::selectRaw('id, name, icon, folder, model, is_browsable, is_system'); + return Model::select([ + 'id', 'name', 'icon', 'folder', 'model', + 'is_browsable', 'is_system', + ]); } public function templatePath(): string diff --git a/src/Tables/Templates/types.json b/src/Tables/Templates/types.json index 604d6af..65e96d8 100644 --- a/src/Tables/Templates/types.json +++ b/src/Tables/Templates/types.json @@ -23,6 +23,7 @@ "data": "file_types.icon", "meta": [ "icon", + "method", "sortable" ] }, From e2eed52a8cf20e89512f92894af81036f881cd14 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Sat, 11 Mar 2023 11:01:31 +0000 Subject: [PATCH 48/65] Apply fixes from StyleCI --- src/Models/Type.php | 4 ++-- src/Tables/Builders/Type.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Models/Type.php b/src/Models/Type.php index 485ea2b..f3325a0 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -42,7 +42,7 @@ public function scopeOrdered(Builder $query): Builder return $query->orderByDesc('is_system')->orderBy('id'); } - public function icon(): string | array + public function icon(): string|array { return Str::contains($this->icon, ' ') ? explode(' ', $this->icon) @@ -71,7 +71,7 @@ public function folder(): string ? Config::get('enso.files.testingFolder') : $this->folder; - if (!Storage::has($folder)) { + if (! Storage::has($folder)) { Storage::makeDirectory($folder); } diff --git a/src/Tables/Builders/Type.php b/src/Tables/Builders/Type.php index 67e41c1..b265477 100644 --- a/src/Tables/Builders/Type.php +++ b/src/Tables/Builders/Type.php @@ -8,7 +8,7 @@ class Type implements Table { - private const TemplatePath = __DIR__ . '/../Templates/types.json'; + private const TemplatePath = __DIR__.'/../Templates/types.json'; public function query(): Builder { From 2ddcd0e5c2325321f4c790246cac5b71856927eb Mon Sep 17 00:00:00 2001 From: Vlad Chiovianu Date: Wed, 26 Jul 2023 12:21:14 +0300 Subject: [PATCH 49/65] fix --- src/Services/Validate.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Services/Validate.php b/src/Services/Validate.php index 380dddb..8bb450b 100644 --- a/src/Services/Validate.php +++ b/src/Services/Validate.php @@ -52,7 +52,9 @@ private function file(): self private function extension(): self { $valid = new Collection($this->extensions); - $extension = $this->file->extension(); + $extension = $this->file instanceof UploadedFile + ? $this->file->getClientOriginalExtension() + : $this->file->extension(); $shouldThrow = $valid->isNotEmpty() && $valid->doesntContain($extension); if ($shouldThrow) { From ade044201f10a1097f36ffff43fe65d51b414a7c Mon Sep 17 00:00:00 2001 From: Vlad Chiovianu Date: Thu, 2 Nov 2023 12:45:34 +0200 Subject: [PATCH 50/65] updates ->isAdmin() || ->isSupervisr() to ->isSuperior() --- src/Models/File.php | 2 +- src/Policies/File.php | 4 +--- src/Policies/Upload.php | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Models/File.php b/src/Models/File.php index a53c7d5..cd3b070 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -71,7 +71,7 @@ public function scopeWithData(Builder $query): Builder public function scopeFor(Builder $query, User $user): Builder { - $super = $user->isAdmin() || $user->isSupervisor(); + $super = $user->isSuperior(); return $query->browsable() ->withData() diff --git a/src/Policies/File.php b/src/Policies/File.php index 7c5400e..e037239 100644 --- a/src/Policies/File.php +++ b/src/Policies/File.php @@ -12,9 +12,7 @@ class File public function before(User $user) { - if ($user->isAdmin() || $user->isSupervisor()) { - return true; - } + return $user->isSuperior(); } public function access(User $user, Model $file) diff --git a/src/Policies/Upload.php b/src/Policies/Upload.php index 6d6c495..c815537 100644 --- a/src/Policies/Upload.php +++ b/src/Policies/Upload.php @@ -12,9 +12,7 @@ class Upload public function before(User $user) { - if ($user->isAdmin() || $user->isSupervisor()) { - return true; - } + return $user->isSuperior(); } public function view(User $user, Model $upload) From e9cf862aeb2d79747a167348cb9205ac5ce1550b Mon Sep 17 00:00:00 2001 From: Vlad Chiovianu Date: Thu, 2 Nov 2023 13:45:33 +0200 Subject: [PATCH 51/65] fix --- src/Policies/File.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Policies/File.php b/src/Policies/File.php index e037239..33bda6f 100644 --- a/src/Policies/File.php +++ b/src/Policies/File.php @@ -12,7 +12,9 @@ class File public function before(User $user) { - return $user->isSuperior(); + if ($user->isSuperior()) { + return true; + } } public function access(User $user, Model $file) From 49cad61804d2be41ad6911f9b90a3ce2d7e11d63 Mon Sep 17 00:00:00 2001 From: Vlad Chiovianu Date: Thu, 2 Nov 2023 13:54:31 +0200 Subject: [PATCH 52/65] fix --- src/Policies/Upload.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Policies/Upload.php b/src/Policies/Upload.php index c815537..dbff4ca 100644 --- a/src/Policies/Upload.php +++ b/src/Policies/Upload.php @@ -12,7 +12,9 @@ class Upload public function before(User $user) { - return $user->isSuperior(); + if ($user->isSuperior()) { + return true; + } } public function view(User $user, Model $upload) From 35d94e29d75b877cf9e06451dedae758bcbdada7 Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 7 Dec 2023 12:01:17 +0200 Subject: [PATCH 53/65] moves is_public in file_types table --- ...7_01_01_112100_create_file_types_table.php | 4 +- src/Forms/Templates/type.json | 18 ++++++++- src/Http/Requests/ValidateType.php | 1 + src/Models/Type.php | 8 ++-- src/Tables/Builders/Type.php | 2 +- src/Tables/Templates/types.json | 13 ++++++- src/Upgrades/TypeIsPublic.php | 37 +++++++++++++++++++ 7 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 src/Upgrades/TypeIsPublic.php diff --git a/database/migrations/2017_01_01_112100_create_file_types_table.php b/database/migrations/2017_01_01_112100_create_file_types_table.php index cf4e33d..97f8f69 100644 --- a/database/migrations/2017_01_01_112100_create_file_types_table.php +++ b/database/migrations/2017_01_01_112100_create_file_types_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('file_types', function (Blueprint $table) { @@ -19,6 +18,7 @@ public function up() $table->text('description')->nullable(); + $table->boolean('is_public'); $table->boolean('is_browsable'); $table->boolean('is_system'); diff --git a/src/Forms/Templates/type.json b/src/Forms/Templates/type.json index 554a142..e743ad9 100644 --- a/src/Forms/Templates/type.json +++ b/src/Forms/Templates/type.json @@ -39,9 +39,23 @@ "type": "input", "content": "text" } + } + ] + }, + { + "columns": 3, + "fields": [ + { + "label": "Public", + "name": "is_public", + "value": false, + "meta": { + "type": "input", + "content": "checkbox" + } }, { - "label": "Is Browsable", + "label": "Browsable", "name": "is_browsable", "value": false, "meta": { @@ -50,7 +64,7 @@ } }, { - "label": "Is System", + "label": "System", "name": "is_system", "value": false, "meta": { diff --git a/src/Http/Requests/ValidateType.php b/src/Http/Requests/ValidateType.php index 93a968f..e390631 100644 --- a/src/Http/Requests/ValidateType.php +++ b/src/Http/Requests/ValidateType.php @@ -22,6 +22,7 @@ public function rules() 'icon' => 'nullable|required_if:is_browsable,true|string', 'folder' => 'required_with:model|string', 'description' => 'nullable|string', + 'is_public' => 'required|boolean', 'is_browsable' => 'required|boolean', 'is_system' => 'required|boolean', ]; diff --git a/src/Models/Type.php b/src/Models/Type.php index f3325a0..6218bfc 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -11,7 +11,6 @@ use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use LaravelEnso\Files\Contracts\Attachable; -use LaravelEnso\Files\Contracts\PublicFile; use LaravelEnso\Rememberable\Traits\Rememberable; use LaravelEnso\Tables\Traits\TableCache; @@ -23,7 +22,10 @@ class Type extends Model protected $guarded = []; - protected $casts = ['is_browsable' => 'boolean', 'is_system' => 'boolean']; + protected $casts = [ + 'is_browsable' => 'boolean', 'is_system' => 'boolean', + 'is_public' => 'boolean', + ]; protected array $rememberableKeys = ['id', 'model']; @@ -56,7 +58,7 @@ public function model(): Attachable public function isPublic(): bool { - return $this->model() instanceof PublicFile; + return $this->is_public; } public static function for(string $model): self diff --git a/src/Tables/Builders/Type.php b/src/Tables/Builders/Type.php index b265477..0982e22 100644 --- a/src/Tables/Builders/Type.php +++ b/src/Tables/Builders/Type.php @@ -14,7 +14,7 @@ public function query(): Builder { return Model::select([ 'id', 'name', 'icon', 'folder', 'model', - 'is_browsable', 'is_system', + 'is_public', 'is_browsable', 'is_system', ]); } diff --git a/src/Tables/Templates/types.json b/src/Tables/Templates/types.json index 65e96d8..f0a6fb7 100644 --- a/src/Tables/Templates/types.json +++ b/src/Tables/Templates/types.json @@ -46,7 +46,16 @@ ] }, { - "label": "Is Browsable", + "label": "Public", + "name": "is_public", + "data": "file_types.is_public", + "meta": [ + "boolean", + "sortable" + ] + }, + { + "label": "Browsable", "name": "is_browsable", "data": "file_types.is_browsable", "meta": [ @@ -55,7 +64,7 @@ ] }, { - "label": "Is System", + "label": "System", "name": "is_system", "data": "file_types.is_system", "meta": [ diff --git a/src/Upgrades/TypeIsPublic.php b/src/Upgrades/TypeIsPublic.php new file mode 100644 index 0000000..e7e4832 --- /dev/null +++ b/src/Upgrades/TypeIsPublic.php @@ -0,0 +1,37 @@ + $table->boolean('is_public') + ->default(false) + ->after('description')); + + Schema::table('file_types', fn ($table) => $table->boolean('is_public') + ->default(null) + ->change()); + } + + public function migrateData(): void + { + Type::whereNotNull('model')->get() + ->each(fn ($type) => $type->update([ + 'is_public' => $type->model() instanceof PublicFile, + ])); + } +} From a3625e1b66953c4e168ed47af259f5eda01d3553 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Thu, 7 Dec 2023 10:01:34 +0000 Subject: [PATCH 54/65] Apply fixes from StyleCI --- .../migrations/2017_01_01_112100_create_file_types_table.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database/migrations/2017_01_01_112100_create_file_types_table.php b/database/migrations/2017_01_01_112100_create_file_types_table.php index 97f8f69..788ae24 100644 --- a/database/migrations/2017_01_01_112100_create_file_types_table.php +++ b/database/migrations/2017_01_01_112100_create_file_types_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('file_types', function (Blueprint $table) { From 235bbf1a8d5359b8f9b4c8c48b48c5f2095b53c0 Mon Sep 17 00:00:00 2001 From: mishu Date: Thu, 7 Dec 2023 12:15:10 +0200 Subject: [PATCH 55/65] fixes factory --- database/factories/TypeFactory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/factories/TypeFactory.php b/database/factories/TypeFactory.php index 7dd38cb..d4e7c55 100644 --- a/database/factories/TypeFactory.php +++ b/database/factories/TypeFactory.php @@ -19,6 +19,7 @@ public function definition() 'icon' => 'folder', 'endpoint' => null, 'description' => null, + 'is_public' => false, 'is_browsable' => false, 'is_system' => false, ]; From d6c9f8a79311a20560a6387366ddedb271e6aa09 Mon Sep 17 00:00:00 2001 From: Vlad Chiovianu Date: Thu, 7 Dec 2023 13:27:31 +0200 Subject: [PATCH 56/65] fix --- src/Upgrades/TypeIsPublic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Upgrades/TypeIsPublic.php b/src/Upgrades/TypeIsPublic.php index e7e4832..3be451c 100644 --- a/src/Upgrades/TypeIsPublic.php +++ b/src/Upgrades/TypeIsPublic.php @@ -13,7 +13,7 @@ class TypeIsPublic implements MigratesTable, MigratesData { public function isMigrated(): bool { - return ! Table::hasColumn('file_types', 'is_public'); + return Table::hasColumn('file_types', 'is_public'); } public function migrateTable(): void From a7378e6095b6a461835b6c58987e10375160e3d5 Mon Sep 17 00:00:00 2001 From: mishu Date: Tue, 16 Jan 2024 14:43:32 +0200 Subject: [PATCH 57/65] fixes browsing public files --- src/Models/File.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Models/File.php b/src/Models/File.php index cd3b070..5fd8fe2 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -69,13 +69,17 @@ public function scopeWithData(Builder $query): Builder return $query->with($attrs); } - public function scopeFor(Builder $query, User $user): Builder + public function scopePublic(Builder $query): Builder { - $super = $user->isSuperior(); + return $query->whereIsPublic(true); + } + public function scopeFor(Builder $query, User $user): Builder + { return $query->browsable() ->withData() - ->when(! $super, fn ($query) => $query->whereCreatedBy($user->id)) + ->when(! $user->isSuperior(), fn ($query) => $query + ->whereCreatedBy($user->id)->orWhere->public()) ->latest('id') ->paginated(); } From fe6dfb1fe7bf52ad3e4153d26f03fbdbf3e45386 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Wed, 17 Jan 2024 10:32:22 +0100 Subject: [PATCH 58/65] update helpers, dynamic relation --- composer.json | 4 ++-- src/AppServiceProvider.php | 5 ----- src/Dynamics/Relations/FavoriteFiles.php | 11 ++++++++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index a6fa8a8..4c1ab81 100644 --- a/composer.json +++ b/composer.json @@ -19,8 +19,8 @@ } ], "require": { - "laravel-enso/core": "^8.0", - "laravel-enso/helpers": "^2.0", + "laravel-enso/core": "^9.0", + "laravel-enso/helpers": "^3.0", "laravel-enso/image-transformer": "^2.0", "laravel-enso/migrator": "^2.0", "laravel-enso/track-who": "^2.0" diff --git a/src/AppServiceProvider.php b/src/AppServiceProvider.php index 0e943e6..13242e1 100644 --- a/src/AppServiceProvider.php +++ b/src/AppServiceProvider.php @@ -3,9 +3,6 @@ namespace LaravelEnso\Files; use Illuminate\Support\ServiceProvider; -use LaravelEnso\DynamicMethods\Services\Methods; -use LaravelEnso\Files\Dynamics\Relations\FavoriteFiles; -use LaravelEnso\Users\Models\User; class AppServiceProvider extends ServiceProvider { @@ -13,8 +10,6 @@ public function boot() { $this->load() ->publish(); - - Methods::bind(User::class, [FavoriteFiles::class]); } private function load() diff --git a/src/Dynamics/Relations/FavoriteFiles.php b/src/Dynamics/Relations/FavoriteFiles.php index feb3954..dc1c075 100644 --- a/src/Dynamics/Relations/FavoriteFiles.php +++ b/src/Dynamics/Relations/FavoriteFiles.php @@ -3,12 +3,17 @@ namespace LaravelEnso\Files\Dynamics\Relations; use Closure; -use LaravelEnso\DynamicMethods\Contracts\Method; +use LaravelEnso\DynamicMethods\Contracts\Relation; use LaravelEnso\Files\Models\Favorite; use LaravelEnso\Files\Models\File; +use LaravelEnso\Users\Models\User; -class FavoriteFiles implements Method +class FavoriteFiles implements Relation { + public function bindTo(): array + { + return [User::class]; + } public function name(): string { return 'favoriteFiles'; @@ -16,7 +21,7 @@ public function name(): string public function closure(): Closure { - return fn () => $this->hasManyThrough( + return fn (User $user) => $user->hasManyThrough( File::class, Favorite::class, 'user_id', From 60eb342696884af86fd6cdfe09c38264048fd20c Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 17 Jan 2024 09:32:33 +0000 Subject: [PATCH 59/65] Apply fixes from StyleCI --- src/Dynamics/Relations/FavoriteFiles.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Dynamics/Relations/FavoriteFiles.php b/src/Dynamics/Relations/FavoriteFiles.php index dc1c075..df56887 100644 --- a/src/Dynamics/Relations/FavoriteFiles.php +++ b/src/Dynamics/Relations/FavoriteFiles.php @@ -14,6 +14,7 @@ public function bindTo(): array { return [User::class]; } + public function name(): string { return 'favoriteFiles'; From 631b144f17cf3e6758d956a7a77af652a5f3705a Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 6 May 2024 10:30:29 +0300 Subject: [PATCH 60/65] fixes icon in resource --- src/Http/Resources/Type.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Resources/Type.php b/src/Http/Resources/Type.php index 6596ed3..137738f 100644 --- a/src/Http/Resources/Type.php +++ b/src/Http/Resources/Type.php @@ -13,7 +13,7 @@ public function toArray($request) return [ 'id' => $this->id, 'name' => Str::title($this->name), - 'icon' => $this->icon, + 'icon' => $this->icon(), 'folder' => $this->folder, 'endpoint' => $this->endpoint, 'isBrowsable' => $this->is_browsable, From fcb0a1c58938310d26c61e94aeb3dfe9e96ad72d Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Wed, 7 Aug 2024 19:39:30 +0100 Subject: [PATCH 61/65] upgrade L11 --- composer.json | 2 +- src/Models/File.php | 9 +++++++-- src/Models/Type.php | 13 ++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 4c1ab81..42e6002 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ } ], "require": { - "laravel-enso/core": "^9.0", + "laravel-enso/core": "^10.0", "laravel-enso/helpers": "^3.0", "laravel-enso/image-transformer": "^2.0", "laravel-enso/migrator": "^2.0", diff --git a/src/Models/File.php b/src/Models/File.php index 5fd8fe2..e7ff6df 100644 --- a/src/Models/File.php +++ b/src/Models/File.php @@ -30,8 +30,6 @@ class File extends Model protected $guarded = []; - protected $casts = ['is_public' => 'boolean']; - public function type() { return $this->belongsTo(Type::class); @@ -196,4 +194,11 @@ public function isImage(BaseFile $file): bool ['file' => "image|mimetypes:{$mimeTypes}"] )->passes(); } + + protected function casts(): array + { + return [ + 'is_public' => 'boolean', + ]; + } } diff --git a/src/Models/Type.php b/src/Models/Type.php index 6218bfc..8811607 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -22,11 +22,6 @@ class Type extends Model protected $guarded = []; - protected $casts = [ - 'is_browsable' => 'boolean', 'is_system' => 'boolean', - 'is_public' => 'boolean', - ]; - protected array $rememberableKeys = ['id', 'model']; public function files() @@ -97,4 +92,12 @@ public function move(): void FileFacade::moveDirectory($from, $to); } } + + protected function casts(): array + { + return [ + 'is_browsable' => 'boolean', 'is_system' => 'boolean', + 'is_public' => 'boolean', + ]; + } } From 854ff2a9830a5df7e60a4bc828a93e34f894f32a Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 19 Sep 2024 10:21:04 +0100 Subject: [PATCH 62/65] remove upgrade files --- src/Upgrades/AddTypeIdCreatedAtIndex.php | 30 ------ src/Upgrades/CreatedAtIndex.php | 20 ---- src/Upgrades/DropMorphFile.php | 30 ------ src/Upgrades/DropMorphModels.php | 111 ----------------------- src/Upgrades/DropOldIndex.php | 22 ----- src/Upgrades/FileIds.php | 21 ----- src/Upgrades/FileIsPublic.php | 29 ------ src/Upgrades/FileType.php | 30 ------ src/Upgrades/MakeFileIdUnique.php | 62 ------------- src/Upgrades/MoveFiles.php | 93 ------------------- src/Upgrades/Permissions.php | 21 ----- src/Upgrades/RenameFilePath.php | 28 ------ src/Upgrades/TypeIsPublic.php | 37 -------- src/Upgrades/TypeSeeder.php | 27 ------ src/Upgrades/UpdateMigrationOrder.php | 47 ---------- 15 files changed, 608 deletions(-) delete mode 100644 src/Upgrades/AddTypeIdCreatedAtIndex.php delete mode 100644 src/Upgrades/CreatedAtIndex.php delete mode 100644 src/Upgrades/DropMorphFile.php delete mode 100644 src/Upgrades/DropMorphModels.php delete mode 100644 src/Upgrades/DropOldIndex.php delete mode 100644 src/Upgrades/FileIds.php delete mode 100644 src/Upgrades/FileIsPublic.php delete mode 100644 src/Upgrades/FileType.php delete mode 100644 src/Upgrades/MakeFileIdUnique.php delete mode 100644 src/Upgrades/MoveFiles.php delete mode 100644 src/Upgrades/Permissions.php delete mode 100644 src/Upgrades/RenameFilePath.php delete mode 100644 src/Upgrades/TypeIsPublic.php delete mode 100644 src/Upgrades/TypeSeeder.php delete mode 100644 src/Upgrades/UpdateMigrationOrder.php diff --git a/src/Upgrades/AddTypeIdCreatedAtIndex.php b/src/Upgrades/AddTypeIdCreatedAtIndex.php deleted file mode 100644 index 8384626..0000000 --- a/src/Upgrades/AddTypeIdCreatedAtIndex.php +++ /dev/null @@ -1,30 +0,0 @@ - $table - ->index(['type_id', 'created_at'])); - } -} diff --git a/src/Upgrades/CreatedAtIndex.php b/src/Upgrades/CreatedAtIndex.php deleted file mode 100644 index b39ac1e..0000000 --- a/src/Upgrades/CreatedAtIndex.php +++ /dev/null @@ -1,20 +0,0 @@ - $table->index(['created_at'])); - } -} diff --git a/src/Upgrades/DropMorphFile.php b/src/Upgrades/DropMorphFile.php deleted file mode 100644 index 0bacf0d..0000000 --- a/src/Upgrades/DropMorphFile.php +++ /dev/null @@ -1,30 +0,0 @@ -string('attachable_type')->nullable()->change(); - $table->unsignedBigInteger('attachable_id')->nullable()->change(); - }); - } -} diff --git a/src/Upgrades/DropMorphModels.php b/src/Upgrades/DropMorphModels.php deleted file mode 100644 index 41113ae..0000000 --- a/src/Upgrades/DropMorphModels.php +++ /dev/null @@ -1,111 +0,0 @@ -needUpgrade()->isEmpty(); - } - - public function migrateTable(): void - { - Model::unsetEventDispatcher(); - - $this->needUpgrade() - ->each(fn ($model, $morphKey) => $this->process($model, $morphKey)); - } - - private function process(string $model, string $morphKey) - { - $this->addForeignKey($model) - ->migrateData($model, $morphKey); - } - - private function addForeignKey(string $model): self - { - $table = $this->table($model); - $after = $this->afterColumn($table); - - Schema::table($table, function (Blueprint $table) use ($after) { - $table->unsignedBigInteger('file_id')->nullable()->after($after); - $table->foreign('file_id')->references('id')->on('files') - ->onUpdate('restrict')->onDelete('restrict'); - }); - - return $this; - } - - private function migrateData(string $model, string $morphKey) - { - $files = File::whereAttachableType($morphKey); - $type = Type::for($model); - $files->each(fn ($file) => $this->migrateFile($type, $file, $model)); - } - - private function migrateFile(Type $type, File $file, string $model) - { - $folder = Str::of($file->saved_name)->beforeLast('/'); - $savedName = Str::of($file->saved_name)->replace("{$folder}/", ''); - - $file->update([ - 'type_id' => $type->id, - 'saved_name' => $savedName, - ]); - - $record = $model::find($file->attachable_id); - - if ($record) { - $record->update(['file_id' => $file->id]); - } else { - Log::notice("File with id of {$file->id} is missing its morphed model"); - } - } - - private function afterColumn(string $table): string - { - return Collection::wrap(Schema::getColumnListing($table)) - ->filter(fn ($column) => Str::endsWith($column, '_id')) - ->last() ?? 'id'; - } - - private function needUpgrade(): Collection - { - $upgraded = fn ($model) => Table::hasColumn($this->table($model), 'file_id'); - - return $this->models()->reject($upgraded); - } - - private function table(string $model): string - { - return (new $model())->getTable(); - } - - private function models(): Collection - { - $upgrade = Config::get('enso.files.upgrade'); - - return Collection::wrap($upgrade) - ->filter(fn ($model) => class_exists($model)); - } -} diff --git a/src/Upgrades/DropOldIndex.php b/src/Upgrades/DropOldIndex.php deleted file mode 100644 index f507dbe..0000000 --- a/src/Upgrades/DropOldIndex.php +++ /dev/null @@ -1,22 +0,0 @@ - $table->dropIndex(self::Index)); - } -} diff --git a/src/Upgrades/FileIds.php b/src/Upgrades/FileIds.php deleted file mode 100644 index b999f4b..0000000 --- a/src/Upgrades/FileIds.php +++ /dev/null @@ -1,21 +0,0 @@ - $table->id()->change()); - } -} diff --git a/src/Upgrades/FileIsPublic.php b/src/Upgrades/FileIsPublic.php deleted file mode 100644 index c09deea..0000000 --- a/src/Upgrades/FileIsPublic.php +++ /dev/null @@ -1,29 +0,0 @@ - $table - ->boolean('is_public')->nullable()->after('mime_type')); - } - - public function migrateData(): void - { - File::whereNull('is_public')->update(['is_public' => false]); - } -} diff --git a/src/Upgrades/FileType.php b/src/Upgrades/FileType.php deleted file mode 100644 index 5f57d64..0000000 --- a/src/Upgrades/FileType.php +++ /dev/null @@ -1,30 +0,0 @@ -unsignedBigInteger('type_id')->nullable()->after('id'); - $table->foreign('type_id')->references('id')->on('file_types'); - }); - } -} diff --git a/src/Upgrades/MakeFileIdUnique.php b/src/Upgrades/MakeFileIdUnique.php deleted file mode 100644 index d37076e..0000000 --- a/src/Upgrades/MakeFileIdUnique.php +++ /dev/null @@ -1,62 +0,0 @@ -needUpgrade()->isEmpty(); - } - - public function migrateTable(): void - { - Model::unsetEventDispatcher(); - - $this->needUpgrade()->each(fn ($model) => $this->upgrade($model)); - } - - private function upgrade(string $model): void - { - $table = $this->table($model); - - Schema::table($table, fn ($table) => $table->unique('file_id')); - } - - private function needUpgrade(): Collection - { - $upgraded = fn ($model) => Table::hasIndex( - $this->table($model), - "{$this->table($model)}_file_id_unique" - ); - - return $this->models()->reject($upgraded); - } - - private function table(string $model): string - { - return (new $model())->getTable(); - } - - private function models(): Collection - { - $upgrade = Config::get('enso.files.upgrade'); - - return Collection::wrap($upgrade) - ->filter(fn ($model) => class_exists($model)); - } -} diff --git a/src/Upgrades/MoveFiles.php b/src/Upgrades/MoveFiles.php deleted file mode 100644 index ca004b3..0000000 --- a/src/Upgrades/MoveFiles.php +++ /dev/null @@ -1,93 +0,0 @@ -nonStandardFolders = Config::get('enso.files.nonStandardFolders'); - $this->renameFolders = Config::get('enso.files.renameFolders'); - } - - public function isMigrated(): bool - { - return Table::hasColumn('files', 'saved_name') - && $this->notMoved()->doesntExist(); - } - - public function migrateData(): void - { - $this->notMoved() - ->pluck('attachable_type') - ->unique() - ->each(fn ($attachable) => $this->handle($attachable)); - - $this->cleanup(); - } - - private function handle(string $attachable): void - { - $key = $this->renameFolders[$attachable] ?? $attachable; - $folder = Str::plural($key); - - if (! Storage::has($folder)) { - Storage::makeDirectory($folder); - } - - File::whereAttachableType($attachable) - ->each(fn ($file) => $this->move($file, $folder)); - - $this->replace($attachable, $folder); - } - - private function move(File $file, string $folder): void - { - if (Storage::exists($file->saved_name)) { - $location = Str::replace($this->nonStandardFolders, $folder, $file->saved_name); - - if ($file->saved_name !== $location) { - Storage::move($file->saved_name, $location); - } - } - } - - private function replace(string $attachable, string $folder) - { - Collection::wrap($this->nonStandardFolders) - ->each(fn ($from) => $this->notMoved() - ->whereAttachableType($attachable) - ->where('saved_name', 'LIKE', "{$from}/%") - ->update(['saved_name' => DB::raw("REPLACE(saved_name, '{$from}', '{$folder}')")])); - } - - private function notMoved(): Builder - { - $build = fn ($query) => Collection::wrap($this->nonStandardFolders) - ->reduce(fn ($files, $folder) => $files - ->orWhere('saved_name', 'LIKE', "{$folder}/%"), $query); - - return File::where($build); - } - - private function cleanup(): void - { - Collection::wrap($this->nonStandardFolders) - ->filter(fn ($folder) => count(Storage::files($folder)) === 0) - ->each(fn ($folder) => Storage::deleteDirectory($folder)); - } -} diff --git a/src/Upgrades/Permissions.php b/src/Upgrades/Permissions.php deleted file mode 100644 index 86d4572..0000000 --- a/src/Upgrades/Permissions.php +++ /dev/null @@ -1,21 +0,0 @@ - 'core.files.favorite', 'description' => 'Toggle file as favorite', 'is_default' => true], - ['name' => 'core.files.browse', 'description' => 'Browse file type', 'is_default' => true], - ['name' => 'core.files.recent', 'description' => 'Browse recent files', 'is_default' => true], - ['name' => 'core.files.favorites', 'description' => 'Browse favorites files', 'is_default' => true], - ['name' => 'core.files.makePublic', 'description' => 'Make file public', 'is_default' => true], - ['name' => 'core.files.makePrivate', 'description' => 'Make file private', 'is_default' => true], - ['name' => 'core.files.update', 'description' => 'Update file name', 'is_default' => true], - ]; -} diff --git a/src/Upgrades/RenameFilePath.php b/src/Upgrades/RenameFilePath.php deleted file mode 100644 index f1ff4fb..0000000 --- a/src/Upgrades/RenameFilePath.php +++ /dev/null @@ -1,28 +0,0 @@ - $table - ->renameColumn('path', 'saved_name')); - } -} diff --git a/src/Upgrades/TypeIsPublic.php b/src/Upgrades/TypeIsPublic.php deleted file mode 100644 index 3be451c..0000000 --- a/src/Upgrades/TypeIsPublic.php +++ /dev/null @@ -1,37 +0,0 @@ - $table->boolean('is_public') - ->default(false) - ->after('description')); - - Schema::table('file_types', fn ($table) => $table->boolean('is_public') - ->default(null) - ->change()); - } - - public function migrateData(): void - { - Type::whereNotNull('model')->get() - ->each(fn ($type) => $type->update([ - 'is_public' => $type->model() instanceof PublicFile, - ])); - } -} diff --git a/src/Upgrades/TypeSeeder.php b/src/Upgrades/TypeSeeder.php deleted file mode 100644 index 8eae1f6..0000000 --- a/src/Upgrades/TypeSeeder.php +++ /dev/null @@ -1,27 +0,0 @@ -exists(); - } - - public function migrateData(): void - { - $seeder = Seeder::class; - - Artisan::call('db:seed', [ - '--class' => $seeder, - '--force' => true, - ]); - } -} diff --git a/src/Upgrades/UpdateMigrationOrder.php b/src/Upgrades/UpdateMigrationOrder.php deleted file mode 100644 index 64d88fc..0000000 --- a/src/Upgrades/UpdateMigrationOrder.php +++ /dev/null @@ -1,47 +0,0 @@ - '2017_01_01_112100_create_file_types_table', - '2018_08_25_100000_create_files_table' => '2017_01_01_112200_create_files_table', - '2018_08_25_101000_create_structure_for_files' => '2017_01_01_112300_create_structure_for_files', - '2018_08_25_102000_create_uploads_table' => '2017_01_01_112400_create_uploads_table', - '2018_08_25_103000_create_structure_for_uploads' => '2017_01_01_112500_create_structure_for_uploads', - '2022_01_17_100000_create_favorite_files_table' => '2017_01_01_112600_create_favorite_files_table', - '2022_01_23_101000_create_structure_for_file_types' => '2017_01_01_129000_create_structure_for_file_types', - ]; - - private Collection $mapping; - - public function __construct() - { - $this->mapping = Collection::wrap(self::Mapping); - } - - public function isMigrated(): bool - { - return DB::table('migrations') - ->whereIn('migration', $this->mapping->keys()) - ->doesntExist(); - } - - public function migrateData(): void - { - $this->mapping->each(fn ($to, $from) => $this->update($from, $to)); - } - - private function update($from, $to): void - { - DB::table('migrations') - ->whereMigration($from) - ->update(['migration' => $to]); - } -} From 7c33259a3389fe7881916a31ffe4d4453959ff7d Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 17 Oct 2024 16:53:45 +0100 Subject: [PATCH 63/65] laravel 11 floating-point types --- database/migrations/2017_01_01_112200_create_files_table.php | 2 +- .../migrations/2017_01_01_112400_create_uploads_table.php | 2 +- .../2017_01_01_112600_create_favorite_files_table.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/database/migrations/2017_01_01_112200_create_files_table.php b/database/migrations/2017_01_01_112200_create_files_table.php index 45466e4..39b1926 100644 --- a/database/migrations/2017_01_01_112200_create_files_table.php +++ b/database/migrations/2017_01_01_112200_create_files_table.php @@ -11,7 +11,7 @@ public function up() Schema::create('files', function (Blueprint $table) { $table->id(); - $table->unsignedBigInteger('type_id'); + $table->bigInteger('type_id')->unsigned(); $table->foreign('type_id')->references('id')->on('file_types'); $table->nullableMorphs('attachable'); diff --git a/database/migrations/2017_01_01_112400_create_uploads_table.php b/database/migrations/2017_01_01_112400_create_uploads_table.php index 7f4078b..0063b33 100644 --- a/database/migrations/2017_01_01_112400_create_uploads_table.php +++ b/database/migrations/2017_01_01_112400_create_uploads_table.php @@ -11,7 +11,7 @@ public function up() Schema::create('uploads', function (Blueprint $table) { $table->increments('id'); - $table->unsignedBigInteger('file_id')->nullable()->unique(); + $table->bigInteger('file_id')->unsigned()->nullable()->unique(); $table->foreign('file_id')->references('id')->on('files') ->onUpdate('restrict')->onDelete('restrict'); diff --git a/database/migrations/2017_01_01_112600_create_favorite_files_table.php b/database/migrations/2017_01_01_112600_create_favorite_files_table.php index 2cd6688..6395d41 100644 --- a/database/migrations/2017_01_01_112600_create_favorite_files_table.php +++ b/database/migrations/2017_01_01_112600_create_favorite_files_table.php @@ -11,10 +11,10 @@ public function up() Schema::create('favorite_files', function (Blueprint $table) { $table->id(); - $table->unsignedInteger('user_id')->index(); + $table->integer('user_id')->unsigned()->index(); $table->foreign('user_id')->references('id')->on('users'); - $table->unsignedBigInteger('file_id')->index(); + $table->bigInteger('file_id')->unsigned()->index(); $table->foreign('file_id')->references('id')->on('files') ->onUpdate('restrict')->onDelete('restrict'); From 36e7a48aa3d1a5a2496bc1893d6244960fa0fc5c Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 17 Oct 2024 17:00:47 +0100 Subject: [PATCH 64/65] laravel 11 floating-point types --- tests/features/FileTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/features/FileTest.php b/tests/features/FileTest.php index 8f90a62..d93e3e5 100644 --- a/tests/features/FileTest.php +++ b/tests/features/FileTest.php @@ -126,7 +126,7 @@ private function createTestTable(): self Schema::create('attachable_models', function ($table) { $table->increments('id'); - $table->unsignedBigInteger('file_id')->nullable(); + $table->bigInteger('file_id')->unsigned()->nullable(); $table->foreign('file_id')->references('id')->on('files') ->onUpdate('restrict')->onDelete('restrict'); From 13251ac8b42de574f731169ba8916620da019c18 Mon Sep 17 00:00:00 2001 From: mishu Date: Mon, 5 May 2025 17:04:16 +0300 Subject: [PATCH 65/65] adds url resource --- src/Http/Resources/Url.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/Http/Resources/Url.php diff --git a/src/Http/Resources/Url.php b/src/Http/Resources/Url.php new file mode 100644 index 0000000..f174d88 --- /dev/null +++ b/src/Http/Resources/Url.php @@ -0,0 +1,20 @@ + $this->id, + 'path' => $this->path(), + 'url' => "{$appUrl}/{$this->path()}", + ]; + } +}