From a970c403132d95a559d06dab2868572d7ded1eef Mon Sep 17 00:00:00 2001 From: Mazarin Date: Mon, 19 Feb 2024 11:21:12 -0500 Subject: [PATCH] feat: add categories for lists (#52) --- app/Http/Controllers/ListController.php | 28 ++++++-- app/Http/ViewModels/User/ListViewModel.php | 1 + app/Models/ListCategory.php | 29 ++++++++ app/Models/NameList.php | 1 + app/Services/CreateList.php | 2 + database/factories/ListCategoryFactory.php | 25 +++++++ ...19_131442_create_list_categories_table.php | 67 +++++++++++++++++++ resources/views/user/lists/edit.blade.php | 13 ++++ resources/views/user/lists/new.blade.php | 15 ++++- tests/Unit/Models/ListCategoryTest.php | 24 +++++++ .../ViewModels/User/ListViewModelTest.php | 3 +- 11 files changed, 201 insertions(+), 7 deletions(-) create mode 100644 app/Models/ListCategory.php create mode 100644 database/factories/ListCategoryFactory.php create mode 100644 database/migrations/2024_02_19_131442_create_list_categories_table.php create mode 100644 tests/Unit/Models/ListCategoryTest.php diff --git a/app/Http/Controllers/ListController.php b/app/Http/Controllers/ListController.php index 90097cf..c0791b0 100644 --- a/app/Http/Controllers/ListController.php +++ b/app/Http/Controllers/ListController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Http\ViewModels\User\ListViewModel; +use App\Models\ListCategory; use App\Services\CreateList; use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; @@ -21,6 +22,19 @@ public function index(): View ]); } + public function new(): View + { + $listCategories = ListCategory::all() + ->map(fn (ListCategory $listCategory) => [ + 'id' => $listCategory->id, + 'name' => $listCategory->name, + ]); + + return view('user.lists.new', [ + 'listCategories' => $listCategories, + ]); + } + public function store(Request $request): RedirectResponse { $list = (new CreateList( @@ -29,6 +43,7 @@ public function store(Request $request): RedirectResponse isPublic: false, canBeModified: true, gender: $request->input('gender'), + categoryId: $request->input('category'), ))->execute(); Cache::forget('route-list-' . $list->id); @@ -54,8 +69,15 @@ public function show(Request $request): View public function edit(Request $request): View { + $listCategories = ListCategory::all() + ->map(fn (ListCategory $listCategory) => [ + 'id' => $listCategory->id, + 'name' => $listCategory->name, + ]); + return view('user.lists.edit', [ 'list' => ListViewModel::edit($request->attributes->get('list')), + 'listCategories' => $listCategories, ]); } @@ -65,6 +87,7 @@ public function update(Request $request): RedirectResponse $list->name = $request->input('list-name'); $list->description = $request->input('description'); + $list->list_category_id = $request->input('category'); $list->save(); Cache::forget('route-list-' . $list->id); @@ -89,11 +112,6 @@ public function destroy(Request $request): RedirectResponse return Redirect::route('list.index'); } - public function new(): View - { - return view('user.lists.new'); - } - public function delete(Request $request): View { return view('user.lists.destroy', [ diff --git a/app/Http/ViewModels/User/ListViewModel.php b/app/Http/ViewModels/User/ListViewModel.php index a80e4d7..1c15fef 100644 --- a/app/Http/ViewModels/User/ListViewModel.php +++ b/app/Http/ViewModels/User/ListViewModel.php @@ -94,6 +94,7 @@ public static function edit(NameList $list): array 'id' => $list->id, 'name' => $list->name, 'description' => $list->description, + 'list_category_id' => $list->list_category_id, 'url' => [ 'update' => route('list.update', [ 'liste' => $list->id, diff --git a/app/Models/ListCategory.php b/app/Models/ListCategory.php new file mode 100644 index 0000000..b6cb447 --- /dev/null +++ b/app/Models/ListCategory.php @@ -0,0 +1,29 @@ + 'boolean', + ]; + + public function nameLists(): HasMany + { + return $this->hasMany(NameList::class); + } +} diff --git a/app/Models/NameList.php b/app/Models/NameList.php index 45f78d3..8ae2b24 100644 --- a/app/Models/NameList.php +++ b/app/Models/NameList.php @@ -27,6 +27,7 @@ class NameList extends Model 'can_be_modified', 'is_list_of_favorites', 'gender', + 'list_category_id', ]; protected $casts = [ diff --git a/app/Services/CreateList.php b/app/Services/CreateList.php index e917363..311859c 100644 --- a/app/Services/CreateList.php +++ b/app/Services/CreateList.php @@ -15,6 +15,7 @@ public function __construct( public bool $isPublic, public bool $canBeModified, public string $gender, + public ?int $categoryId, ) { } @@ -35,6 +36,7 @@ private function createList(): void 'is_public' => $this->isPublic, 'can_be_modified' => $this->canBeModified, 'gender' => $this->gender, + 'list_category_id' => $this->categoryId, ]); } } diff --git a/database/factories/ListCategoryFactory.php b/database/factories/ListCategoryFactory.php new file mode 100644 index 0000000..c9ee1ee --- /dev/null +++ b/database/factories/ListCategoryFactory.php @@ -0,0 +1,25 @@ + + */ +class ListCategoryFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'description' => fake()->text(), + 'is_serious' => fake()->boolean, + ]; + } +} diff --git a/database/migrations/2024_02_19_131442_create_list_categories_table.php b/database/migrations/2024_02_19_131442_create_list_categories_table.php new file mode 100644 index 0000000..8ace0f5 --- /dev/null +++ b/database/migrations/2024_02_19_131442_create_list_categories_table.php @@ -0,0 +1,67 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->boolean('is_serious')->default(true); + $table->timestamps(); + }); + + Schema::table('lists', function (Blueprint $table) { + $table->unsignedBigInteger('list_category_id')->after('user_id')->nullable(); + $table->foreign('list_category_id')->references('id')->on('list_categories')->onDelete('cascade'); + }); + + DB::table('list_categories')->insert([ + 'name' => 'Prénoms d\'origine religieuse', + 'description' => 'En quête d\'un prénom empreint de spiritualité et d\'histoire ? Laissez-vous guider par notre sélection de prénoms d\'origine religieuse ! Des prénoms bibliques aux noms inspirés des grandes figures spirituelles, découvrez une source d\'inspiration infinie pour trouver le prénom parfait pour votre petit trésor.', + 'is_serious' => true, + ]); + DB::table('list_categories')->insert([ + 'name' => 'Prénoms d\'origine géographique', + 'description' => 'Partez à l\'aventure avec notre sélection de prénoms d\'origine géographique ! Des noms évoquant des paysages grandioses aux prénoms inspirés des plus belles villes du monde, découvrez une source d\'inspiration inédite pour trouver le prénom parfait pour votre petit explorateur.', + 'is_serious' => true, + ]); + DB::table('list_categories')->insert([ + 'name' => 'Prénoms d\'origine historique', + 'description' => 'Donnez à votre enfant un prénom qui traverse les siècles avec notre sélection de prénoms d\'origine historique ! Des figures légendaires aux personnages illustres, découvrez une source d\'inspiration unique pour trouver le prénom parfait pour votre petit prince ou votre petite princesse.', + 'is_serious' => true, + ]); + DB::table('list_categories')->insert([ + 'name' => 'Prénoms inspirés de la nature', + 'description' => 'Célébrez la beauté et la puissance de la nature en choisissant un prénom inspiré de ses éléments pour votre enfant ! Des fleurs délicates aux arbres majestueux, en passant par les animaux fascinants et les forces élémentaires, découvrez une source d\'inspiration infinie pour trouver le prénom parfait pour votre petit être.', + 'is_serious' => true, + ]); + DB::table('list_categories')->insert([ + 'name' => 'Prénoms inspirés de la littérature et du cinéma', + 'description' => 'Donnez vie à vos personnages préférés en choisissant un prénom inspiré de la littérature et du cinéma pour votre enfant ! Des héros inoubliables aux héroïnes courageuses, en passant par les créatures fantastiques et les personnages attachants, découvrez une source d\'inspiration inédite pour trouver le prénom parfait pour votre petit bout de chou.', + 'is_serious' => true, + ]); + + DB::table('list_categories')->insert([ + 'name' => 'Prénoms inventés', + 'description' => 'Laissez libre cours à votre imagination et explorez le monde infini des prénoms inventés pour trouver le nom parfait pour votre enfant ! Des jeux vidéo aux univers fictifs, en passant par les gourmandises et les jeux de mots, découvrez une source d\'inspiration inédite pour créer un prénom unique et original qui correspond à votre personnalité et à vos rêves.', + 'is_serious' => false, + ]); + DB::table('list_categories')->insert([ + 'name' => 'Prénoms à double sens', + 'description' => 'Ajoutez une touche d\'originalité et de mystère au prénom de votre enfant en choisissant un nom à double sens ! Des prénoms qui changent de genre aux noms qui cachent des messages cachés, découvrez une source d\'inspiration inédite pour trouver le prénom parfait pour votre petit être.', + 'is_serious' => false, + ]); + DB::table('list_categories')->insert([ + 'name' => 'Prénoms de célébrités', + 'description' => 'Donnez à votre enfant le prénom d\'une célébrité que vous admirez pour lui transmettre votre passion et lui inspirer des valeurs de réussite, de talent et de persévérance ! Des acteurs légendaires aux chanteurs talentueux, en passant par les sportifs de haut niveau, découvrez une source d\'inspiration infinie pour trouver le prénom parfait pour votre petit bout de chou.', + 'is_serious' => false, + ]); + } +}; diff --git a/resources/views/user/lists/edit.blade.php b/resources/views/user/lists/edit.blade.php index c76c638..f740650 100644 --- a/resources/views/user/lists/edit.blade.php +++ b/resources/views/user/lists/edit.blade.php @@ -58,6 +58,19 @@ + @if (auth()->user()->is_administrator) +
+ +
+ +
+
+ @endif +
Retour diff --git a/resources/views/user/lists/new.blade.php b/resources/views/user/lists/new.blade.php index d10a9be..523fd19 100644 --- a/resources/views/user/lists/new.blade.php +++ b/resources/views/user/lists/new.blade.php @@ -57,7 +57,7 @@
-
+

{{ __('Genre de la liste') }}

@@ -90,6 +90,19 @@
+ @if (auth()->user()->is_administrator) +
+ +
+ +
+
+ @endif +
{{ __('Back') }} diff --git a/tests/Unit/Models/ListCategoryTest.php b/tests/Unit/Models/ListCategoryTest.php new file mode 100644 index 0000000..273f8bc --- /dev/null +++ b/tests/Unit/Models/ListCategoryTest.php @@ -0,0 +1,24 @@ +create(); + $nameList = NameList::factory()->create([ + 'list_category_id' => $listCategory->id, + ]); + + $this->assertTrue($listCategory->nameLists()->exists()); + } +} diff --git a/tests/Unit/ViewModels/User/ListViewModelTest.php b/tests/Unit/ViewModels/User/ListViewModelTest.php index e56d59c..5e9c286 100644 --- a/tests/Unit/ViewModels/User/ListViewModelTest.php +++ b/tests/Unit/ViewModels/User/ListViewModelTest.php @@ -104,13 +104,14 @@ public function it_gets_the_list_details_for_the_edit_page(): void $array = ListViewModel::edit($nameList); - $this->assertCount(4, $array); + $this->assertCount(5, $array); $this->assertEquals( [ 'id' => $nameList->id, 'name' => 'Ma liste', 'description' => 'Ma description', + 'list_category_id' => null, 'url' => [ 'update' => env('APP_URL') . '/listes/' . $nameList->id, ],