diff --git a/app/User.php b/app/User.php index 26bafb6..f8aa68b 100644 --- a/app/User.php +++ b/app/User.php @@ -314,4 +314,22 @@ class User extends Authenticatable return Carbon::now()->diffInDays($this->birthday, false); } } + + public function metadata() + { + return $this->hasMany(UserMetadata::class, 'user_id', 'id'); + } + + public function getMetadata($key) + { + $metadata = $this->metadata; + + $meta = $metadata->filter(function ($meta) use ($key) { + return $meta->key == $key; + })->first(); + + if ($meta) { + return $meta->value; + } + } } diff --git a/app/UserMetadata.php b/app/UserMetadata.php index 99e3d38..29a3c87 100644 --- a/app/UserMetadata.php +++ b/app/UserMetadata.php @@ -9,4 +9,6 @@ class UserMetadata extends Model public $incrementing = false; protected $keyType = 'string'; + + protected $fillable = ['id', 'user_id', 'key', 'value']; } diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 4e2bf11..93db9b8 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -2,6 +2,7 @@ use App\Couple; use App\User; +use App\UserMetadata; /* |-------------------------------------------------------------------------- @@ -18,10 +19,10 @@ use App\User; $factory->define(User::class, function (Faker\Generator $faker) { $name = $faker->name; return [ - 'id' => $faker->uuid, - 'name' => $name, - 'nickname' => $name, - 'gender_id' => rand(1, 2), + 'id' => $faker->uuid, + 'name' => $name, + 'nickname' => $name, + 'gender_id' => rand(1, 2), 'manager_id' => $faker->uuid, ]; }); @@ -36,15 +37,26 @@ $factory->state(User::class, 'female', function (Faker\Generator $faker) { $factory->define(Couple::class, function (Faker\Generator $faker) { return [ - 'id' => $faker->uuid, + 'id' => $faker->uuid, 'husband_id' => function () { return factory(User::class)->states('male')->create()->id; }, - 'wife_id' => function () { + 'wife_id' => function () { return factory(User::class)->states('female')->create()->id; }, 'manager_id' => function () { return factory(User::class)->create()->id; }, ]; -}); \ No newline at end of file +}); + +$factory->define(UserMetadata::class, function (Faker\Generator $faker) { + return [ + 'id' => $faker->uuid, + 'user_id' => function () { + return factory(User::class)->create()->id; + }, + 'key' => $faker->name, + 'value' => $faker->sentence, + ]; +}); diff --git a/resources/views/users/partials/edit_death.blade.php b/resources/views/users/partials/edit_death.blade.php index 0b42a64..fff0c56 100644 --- a/resources/views/users/partials/edit_death.blade.php +++ b/resources/views/users/partials/edit_death.blade.php @@ -5,10 +5,10 @@
diff --git a/tests/Feature/UsersProfileTest.php b/tests/Feature/UsersProfileTest.php index 4a17761..219680f 100644 --- a/tests/Feature/UsersProfileTest.php +++ b/tests/Feature/UsersProfileTest.php @@ -4,6 +4,8 @@ namespace Tests\Feature; use App\User; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\DB; +use Ramsey\Uuid\Uuid; use Storage; use Tests\TestCase; @@ -215,6 +217,25 @@ class UsersProfileTest extends TestCase } /** @test */ + public function user_metadata_can_be_prefilled_on_the_edit_form() + { + $user = $this->loginAsUser(); + DB::table('user_metadata')->insert([ + 'id' => Uuid::uuid4()->toString(), + 'user_id' => $user->id, + 'key' => 'cemetery_location_name', + 'value' => 'Some place name', + ]); + + $this->visit(route('users.edit', [$user->id, 'tab' => 'death'])); + $this->seePageIs(route('users.edit', [$user->id, 'tab' => 'death'])); + $this->seeElement('input', [ + 'name' => 'cemetery_location_name', + 'value' => 'Some place name', + ]); + } + + /** @test */ public function manager_can_add_login_account_on_a_user() { $manager = $this->loginAsUser(); diff --git a/tests/Unit/UserTest.php b/tests/Unit/UserTest.php index 000dba1..ae7fd5e 100644 --- a/tests/Unit/UserTest.php +++ b/tests/Unit/UserTest.php @@ -4,9 +4,12 @@ namespace Tests\Unit; use App\Couple; use App\User; +use App\UserMetadata; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Foundation\Testing\RefreshDatabase; -use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; +use Ramsey\Uuid\Nonstandard\Uuid; use Tests\TestCase; class UserTest extends TestCase @@ -110,6 +113,34 @@ class UserTest extends TestCase } /** @test */ + public function a_user_has_many_metadata_relation() + { + $user = factory(User::class)->create(); + $metadata = factory(UserMetadata::class)->create(['user_id' => $user->id]); + + $this->assertInstanceOf(Collection::class, $user->metadata); + $this->assertInstanceOf(UserMetadata::class, $user->metadata->first()); + } + + /** @test */ + public function user_model_has_get_metadata_method() + { + $user = factory(User::class)->create(); + + $this->assertNull($user->getMetadata('cemetery_location_address')); + + DB::table('user_metadata')->insert([ + 'id' => Uuid::uuid4()->toString(), + 'user_id' => $user->id, + 'key' => 'cemetery_location_address', + 'value' => 'Some address', + ]); + $user = $user->fresh(); + + $this->assertEquals('Some address', $user->getMetadata('cemetery_location_address')); + } + + /** @test */ public function user_have_mother_link_method() { $mother = factory(User::class)->create();