From c137e9ab1b0122b57c52a27ff11ae1c4106ee00d Mon Sep 17 00:00:00 2001 From: James Brooks Date: Mon, 2 Apr 2018 17:43:22 +0100 Subject: [PATCH 1/3] Make component_tag a polymorphic structure --- .../Providers/AppServiceProvider.php | 1 + app/Models/Taggable.php | 65 +++++++++++++++++++ ...2018_04_02_163328_CreateTaggablesTable.php | 42 ++++++++++++ ..._04_02_163658_MigrateComponentTagTable.php | 57 ++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 app/Models/Taggable.php create mode 100644 database/migrations/2018_04_02_163328_CreateTaggablesTable.php create mode 100644 database/migrations/2018_04_02_163658_MigrateComponentTagTable.php diff --git a/app/Foundation/Providers/AppServiceProvider.php b/app/Foundation/Providers/AppServiceProvider.php index c652b039..3565247b 100644 --- a/app/Foundation/Providers/AppServiceProvider.php +++ b/app/Foundation/Providers/AppServiceProvider.php @@ -54,6 +54,7 @@ class AppServiceProvider extends ServiceProvider 'metrics' => \CachetHQ\Cachet\Models\Metric::class, 'schedules' => \CachetHQ\Cachet\Models\Schedule::class, 'subscriber' => \CachetHQ\Cachet\Models\Subscriber::class, + 'tags' => \CachetHQ\Cachet\Models\Tag::class, ]); } diff --git a/app/Models/Taggable.php b/app/Models/Taggable.php new file mode 100644 index 00000000..4717de28 --- /dev/null +++ b/app/Models/Taggable.php @@ -0,0 +1,65 @@ + + */ +class Taggable extends Model +{ + /** + * The attributes that should be casted to native types. + * + * @var string[] + */ + protected $casts = [ + 'id' => 'int', + 'tag_id' => 'int', + 'taggable_id' => 'int', + 'taggable_type' => 'string', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'tag_id', + 'taggable_id', + 'taggable_type', + ]; + + /** + * Get the tag relation. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function tag() + { + return $this->belongsTo(Tag::class); + } + + /** + * Get the taggable relation. + * + * @return \Illuminate\Database\Eloquent\Relations\MorphTo + */ + public function taggable() + { + return $this->morphTo(); + } +} diff --git a/database/migrations/2018_04_02_163328_CreateTaggablesTable.php b/database/migrations/2018_04_02_163328_CreateTaggablesTable.php new file mode 100644 index 00000000..7a05ce3e --- /dev/null +++ b/database/migrations/2018_04_02_163328_CreateTaggablesTable.php @@ -0,0 +1,42 @@ +increments('id'); + $table->integer('tag_id')->unsigned()->index(); + $table->morphs('taggable'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('taggables'); + } +} diff --git a/database/migrations/2018_04_02_163658_MigrateComponentTagTable.php b/database/migrations/2018_04_02_163658_MigrateComponentTagTable.php new file mode 100644 index 00000000..0d33597f --- /dev/null +++ b/database/migrations/2018_04_02_163658_MigrateComponentTagTable.php @@ -0,0 +1,57 @@ +get()->each(function ($tag) { + Taggable::create([ + 'tag_id' => $tag->tag_id, + 'taggable_type' => 'components', + 'taggable_id' => $tag->component_id, + ]); + }); + + Schema::dropIfExists('component_tag'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::create('component_tag', function (Blueprint $table) { + $table->engine = 'InnoDB'; + + $table->increments('id'); + $table->integer('component_id'); + $table->integer('tag_id'); + + $table->index('component_id'); + $table->index('tag_id'); + }); + } +} From 737dd689b01af9ea2bf40ad205bc9f3edd6bd1d9 Mon Sep 17 00:00:00 2001 From: James Brooks Date: Mon, 2 Apr 2018 18:17:07 +0100 Subject: [PATCH 2/3] Fix test --- app/Models/Component.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/Component.php b/app/Models/Component.php index 03b611f3..6fbe8d97 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -147,11 +147,11 @@ class Component extends Model implements HasPresenter /** * Get the tags relation. * - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + * @return \Illuminate\Database\Eloquent\Relations\MorphMany */ public function tags() { - return $this->belongsToMany(Tag::class); + return $this->morphMany(Taggable::class, 'taggable'); } /** From 785f2391f3e4771528d58aee1702acbec9eab2af Mon Sep 17 00:00:00 2001 From: James Brooks Date: Mon, 2 Apr 2018 18:21:58 +0100 Subject: [PATCH 3/3] Add tests for Taggable model --- app/Models/Taggable.php | 14 ++++++++++++++ tests/Models/TaggableTest.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/Models/TaggableTest.php diff --git a/app/Models/Taggable.php b/app/Models/Taggable.php index 4717de28..d8c0c1fb 100644 --- a/app/Models/Taggable.php +++ b/app/Models/Taggable.php @@ -11,6 +11,7 @@ namespace CachetHQ\Cachet\Models; +use AltThree\TestBench\ValidationTrait; use Illuminate\Database\Eloquent\Model; /** @@ -20,6 +21,8 @@ use Illuminate\Database\Eloquent\Model; */ class Taggable extends Model { + use ValidationTrait; + /** * The attributes that should be casted to native types. * @@ -43,6 +46,17 @@ class Taggable extends Model 'taggable_type', ]; + /** + * The validation rules. + * + * @var string[] + */ + public $rules = [ + 'tag_id' => 'required|int', + 'taggable_id' => 'required|int', + 'taggable_type' => 'required|string', + ]; + /** * Get the tag relation. * diff --git a/tests/Models/TaggableTest.php b/tests/Models/TaggableTest.php new file mode 100644 index 00000000..8a5271a3 --- /dev/null +++ b/tests/Models/TaggableTest.php @@ -0,0 +1,31 @@ + + */ +class TaggableTest extends AbstractTestCase +{ + use ValidationTrait; + + public function testValidation() + { + $this->checkRules(new Taggable()); + } +}