From d13e41f6dfa279d119c17923f2dd45c58355e044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20=C3=87ak=C4=B1rel?= Date: Mon, 17 May 2021 22:32:45 +0300 Subject: [PATCH 1/4] Add company_id column to media tables --- app/Listeners/Update/V21/Version2114.php | 57 +++++++++++++++++++ app/Models/Common/Media.php | 5 +- app/Providers/Event.php | 1 + app/Scopes/Company.php | 2 +- app/Traits/Media.php | 22 +++++++ app/Traits/Uploads.php | 29 ++++------ .../2021_05_17_000000_core_v2114.php | 44 ++++++++++++++ 7 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 app/Listeners/Update/V21/Version2114.php create mode 100644 database/migrations/2021_05_17_000000_core_v2114.php diff --git a/app/Listeners/Update/V21/Version2114.php b/app/Listeners/Update/V21/Version2114.php new file mode 100644 index 000000000..712820d05 --- /dev/null +++ b/app/Listeners/Update/V21/Version2114.php @@ -0,0 +1,57 @@ +skipThisUpdate($event)) { + return; + } + + $this->updateMediaTables(); + } + + public function updateMediaTables() + { + $company_ids = []; + + foreach (Media::withTrashed()->cursor() as $media) { + $company_id = null; + + if (preg_match('/\d{4}(\/\d{2}){2}\/(\d+)\//', $media->directory, $matches) && isset($matches[2])) { // 2021/04/09/34235/invoices + $company_id = $matches[2]; + } elseif (preg_match('/^(\d+)\//', $media->directory, $matches) && isset($matches[1])) { // 34235/invoices + $company_id = $matches[1]; + } + + if (null === $company_id) { + continue; + } + + $company_ids[$company_id][] = $media->id; + } + + foreach ($company_ids as $company_id => $media_ids) { + DB::table('media')->whereIn('id', $media_ids)->update(['company_id' => $company_id]); + DB::table('mediables')->whereIn('media_id', $media_ids)->update(['company_id' => $company_id]); + } + } +} diff --git a/app/Models/Common/Media.php b/app/Models/Common/Media.php index 334430d37..5c809e7ec 100644 --- a/app/Models/Common/Media.php +++ b/app/Models/Common/Media.php @@ -2,14 +2,15 @@ namespace App\Models\Common; +use App\Traits\Tenants; use Illuminate\Database\Eloquent\SoftDeletes; use Plank\Mediable\Media as BaseMedia; class Media extends BaseMedia { - use SoftDeletes; + use SoftDeletes, Tenants; - protected $tenantable = false; + protected $tenantable = true; protected $dates = ['deleted_at']; } diff --git a/app/Providers/Event.php b/app/Providers/Event.php index b02015516..766c9a89a 100644 --- a/app/Providers/Event.php +++ b/app/Providers/Event.php @@ -31,6 +31,7 @@ class Event extends Provider 'App\Listeners\Update\V21\Version218', 'App\Listeners\Update\V21\Version219', 'App\Listeners\Update\V21\Version2112', + 'App\Listeners\Update\V21\Version2114', ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\Auth\Login', diff --git a/app/Scopes/Company.php b/app/Scopes/Company.php index 9fc85ea79..0f27e6b53 100644 --- a/app/Scopes/Company.php +++ b/app/Scopes/Company.php @@ -28,7 +28,7 @@ class Company implements Scope // Skip for specific tables $skip_tables = [ - 'jobs', 'firewall_ips', 'firewall_logs', 'media', 'mediables', 'migrations', 'notifications', 'role_companies', + 'jobs', 'firewall_ips', 'firewall_logs', 'migrations', 'notifications', 'role_companies', 'role_permissions', 'sessions', 'user_companies', 'user_dashboards', 'user_permissions', 'user_roles', ]; diff --git a/app/Traits/Media.php b/app/Traits/Media.php index 6f6774b24..85023fc23 100644 --- a/app/Traits/Media.php +++ b/app/Traits/Media.php @@ -34,4 +34,26 @@ trait Media return $media; } + + public function attachMedia($media, $tags): void + { + $tags = (array)$tags; + $increments = $this->getOrderValueForTags($tags); + + $ids = $this->extractPrimaryIds($media); + + foreach ($tags as $tag) { + $attach = []; + foreach ($ids as $id) { + $attach[$id] = [ + 'company_id' => company_id(), + 'tag' => $tag, + 'order' => ++$increments[$tag], + ]; + } + $this->media()->attach($attach); + } + + $this->markMediaDirty($tags); + } } diff --git a/app/Traits/Uploads.php b/app/Traits/Uploads.php index b29659ce5..c524dd905 100644 --- a/app/Traits/Uploads.php +++ b/app/Traits/Uploads.php @@ -9,8 +9,6 @@ use MediaUploader; trait Uploads { - public $company_id_index = 3; - public function getMedia($file, $folder = 'settings', $company_id = null) { $path = ''; @@ -21,7 +19,13 @@ trait Uploads $path = $this->getMediaFolder($folder, $company_id); - return MediaUploader::makePrivate()->fromSource($file)->toDirectory($path)->upload(); + return MediaUploader::makePrivate() + ->beforeSave(function(MediaModel $media) { + $media->company_id = company_id(); + }) + ->fromSource($file) + ->toDirectory($path) + ->upload(); } public function importMedia($file, $folder = 'settings', $company_id = null, $disk = null) @@ -34,7 +38,11 @@ trait Uploads $path = $this->getMediaFolder($folder, $company_id) . '/' . basename($file); - return MediaUploader::makePrivate()->importPath($disk, $path); + return MediaUploader::makePrivate() + ->beforeSave(function(MediaModel $media) { + $media->company_id = company_id(); + }) + ->importPath($disk, $path); } public function deleteMediaModel($model, $parameter, $request = null) @@ -89,19 +97,6 @@ trait Uploads $path = $media->basename; if (!empty($media->directory)) { - // 2021/04/09/34235/invoices - $folders = explode('/', $media->directory); - - // No company_id in folder path - if (empty($folders[$this->company_id_index])) { - return false; - } - - // Check if company can access media - if ($folders[$this->company_id_index] != company_id()) { - return false; - } - $path = $media->directory . '/' . $media->basename; } diff --git a/database/migrations/2021_05_17_000000_core_v2114.php b/database/migrations/2021_05_17_000000_core_v2114.php new file mode 100644 index 000000000..f10d7360c --- /dev/null +++ b/database/migrations/2021_05_17_000000_core_v2114.php @@ -0,0 +1,44 @@ +unsignedInteger('company_id')->after('id'); + + $table->index('company_id'); + }); + + Schema::table('mediables', function (Blueprint $table) { + $table->unsignedInteger('company_id')->after('media_id'); + + $table->index('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('media', function (Blueprint $table) { + $table->dropColumn('company_id'); + }); + + Schema::table('mediables', function (Blueprint $table) { + $table->dropColumn('company_id'); + }); + } +} From 5f9fe563f447a9edc58242d932a8534b9e7003be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20=C3=87ak=C4=B1rel?= Date: Mon, 17 May 2021 22:37:13 +0300 Subject: [PATCH 2/4] Added missing migrate command --- app/Listeners/Update/V21/Version2114.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Listeners/Update/V21/Version2114.php b/app/Listeners/Update/V21/Version2114.php index 712820d05..00e57fad0 100644 --- a/app/Listeners/Update/V21/Version2114.php +++ b/app/Listeners/Update/V21/Version2114.php @@ -5,6 +5,7 @@ namespace App\Listeners\Update\V21; use App\Abstracts\Listeners\Update as Listener; use App\Events\Install\UpdateFinished as Event; use App\Models\Common\Media; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; class Version2114 extends Listener @@ -27,6 +28,8 @@ class Version2114 extends Listener } $this->updateMediaTables(); + + Artisan::call('migrate', ['--force' => true]); } public function updateMediaTables() From 35effbafd20eac6fee1828d295ee3860b20555f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20=C3=87ak=C4=B1rel?= Date: Mon, 17 May 2021 22:40:33 +0300 Subject: [PATCH 3/4] Moved migrate command before update tables --- app/Listeners/Update/V21/Version2114.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Listeners/Update/V21/Version2114.php b/app/Listeners/Update/V21/Version2114.php index 00e57fad0..78af312f8 100644 --- a/app/Listeners/Update/V21/Version2114.php +++ b/app/Listeners/Update/V21/Version2114.php @@ -27,9 +27,9 @@ class Version2114 extends Listener return; } - $this->updateMediaTables(); - Artisan::call('migrate', ['--force' => true]); + + $this->updateMediaTables(); } public function updateMediaTables() From a1b3d954c08770e2644bf6bb9b4c2e4417d33440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20=C3=87ak=C4=B1rel?= Date: Thu, 20 May 2021 02:11:03 +0300 Subject: [PATCH 4/4] Fixed tests --- app/Listeners/Update/V21/Version2114.php | 13 ++++++++++++- .../migrations/2021_05_17_000000_core_v2114.php | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/Listeners/Update/V21/Version2114.php b/app/Listeners/Update/V21/Version2114.php index 78af312f8..a409ba6cb 100644 --- a/app/Listeners/Update/V21/Version2114.php +++ b/app/Listeners/Update/V21/Version2114.php @@ -5,8 +5,11 @@ namespace App\Listeners\Update\V21; use App\Abstracts\Listeners\Update as Listener; use App\Events\Install\UpdateFinished as Event; use App\Models\Common\Media; +use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; +use App\Scopes\Company; +use Illuminate\Support\Facades\Schema; class Version2114 extends Listener { @@ -36,7 +39,7 @@ class Version2114 extends Listener { $company_ids = []; - foreach (Media::withTrashed()->cursor() as $media) { + foreach (Media::withTrashed()->withoutGlobalScope(Company::class)->cursor() as $media) { $company_id = null; if (preg_match('/\d{4}(\/\d{2}){2}\/(\d+)\//', $media->directory, $matches) && isset($matches[2])) { // 2021/04/09/34235/invoices @@ -56,5 +59,13 @@ class Version2114 extends Listener DB::table('media')->whereIn('id', $media_ids)->update(['company_id' => $company_id]); DB::table('mediables')->whereIn('media_id', $media_ids)->update(['company_id' => $company_id]); } + + Schema::table('media', function (Blueprint $table) { + $table->unsignedInteger('company_id')->default(null)->change(); + }); + + Schema::table('mediables', function (Blueprint $table) { + $table->unsignedInteger('company_id')->default(null)->change(); + }); } } diff --git a/database/migrations/2021_05_17_000000_core_v2114.php b/database/migrations/2021_05_17_000000_core_v2114.php index f10d7360c..90d5de76b 100644 --- a/database/migrations/2021_05_17_000000_core_v2114.php +++ b/database/migrations/2021_05_17_000000_core_v2114.php @@ -14,13 +14,13 @@ class CoreV2114 extends Migration public function up() { Schema::table('media', function (Blueprint $table) { - $table->unsignedInteger('company_id')->after('id'); + $table->unsignedInteger('company_id')->default(0)->after('id'); $table->index('company_id'); }); Schema::table('mediables', function (Blueprint $table) { - $table->unsignedInteger('company_id')->after('media_id'); + $table->unsignedInteger('company_id')->default(0)->after('media_id'); $table->index('company_id'); });