Skip to content

Commit a970c40

Browse files
authored
feat: add categories for lists (#52)
1 parent d22fb35 commit a970c40

File tree

11 files changed

+201
-7
lines changed

11 files changed

+201
-7
lines changed

app/Http/Controllers/ListController.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Http\Controllers;
44

55
use App\Http\ViewModels\User\ListViewModel;
6+
use App\Models\ListCategory;
67
use App\Services\CreateList;
78
use Illuminate\Contracts\View\View;
89
use Illuminate\Http\RedirectResponse;
@@ -21,6 +22,19 @@ public function index(): View
2122
]);
2223
}
2324

25+
public function new(): View
26+
{
27+
$listCategories = ListCategory::all()
28+
->map(fn (ListCategory $listCategory) => [
29+
'id' => $listCategory->id,
30+
'name' => $listCategory->name,
31+
]);
32+
33+
return view('user.lists.new', [
34+
'listCategories' => $listCategories,
35+
]);
36+
}
37+
2438
public function store(Request $request): RedirectResponse
2539
{
2640
$list = (new CreateList(
@@ -29,6 +43,7 @@ public function store(Request $request): RedirectResponse
2943
isPublic: false,
3044
canBeModified: true,
3145
gender: $request->input('gender'),
46+
categoryId: $request->input('category'),
3247
))->execute();
3348

3449
Cache::forget('route-list-' . $list->id);
@@ -54,8 +69,15 @@ public function show(Request $request): View
5469

5570
public function edit(Request $request): View
5671
{
72+
$listCategories = ListCategory::all()
73+
->map(fn (ListCategory $listCategory) => [
74+
'id' => $listCategory->id,
75+
'name' => $listCategory->name,
76+
]);
77+
5778
return view('user.lists.edit', [
5879
'list' => ListViewModel::edit($request->attributes->get('list')),
80+
'listCategories' => $listCategories,
5981
]);
6082
}
6183

@@ -65,6 +87,7 @@ public function update(Request $request): RedirectResponse
6587

6688
$list->name = $request->input('list-name');
6789
$list->description = $request->input('description');
90+
$list->list_category_id = $request->input('category');
6891
$list->save();
6992

7093
Cache::forget('route-list-' . $list->id);
@@ -89,11 +112,6 @@ public function destroy(Request $request): RedirectResponse
89112
return Redirect::route('list.index');
90113
}
91114

92-
public function new(): View
93-
{
94-
return view('user.lists.new');
95-
}
96-
97115
public function delete(Request $request): View
98116
{
99117
return view('user.lists.destroy', [

app/Http/ViewModels/User/ListViewModel.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public static function edit(NameList $list): array
9494
'id' => $list->id,
9595
'name' => $list->name,
9696
'description' => $list->description,
97+
'list_category_id' => $list->list_category_id,
9798
'url' => [
9899
'update' => route('list.update', [
99100
'liste' => $list->id,

app/Models/ListCategory.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace App\Models;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Illuminate\Database\Eloquent\Relations\HasMany;
8+
9+
class ListCategory extends Model
10+
{
11+
use HasFactory;
12+
13+
protected $table = 'list_categories';
14+
15+
protected $fillable = [
16+
'name',
17+
'description',
18+
'is_serious',
19+
];
20+
21+
protected $casts = [
22+
'is_serious' => 'boolean',
23+
];
24+
25+
public function nameLists(): HasMany
26+
{
27+
return $this->hasMany(NameList::class);
28+
}
29+
}

app/Models/NameList.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class NameList extends Model
2727
'can_be_modified',
2828
'is_list_of_favorites',
2929
'gender',
30+
'list_category_id',
3031
];
3132

3233
protected $casts = [

app/Services/CreateList.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public function __construct(
1515
public bool $isPublic,
1616
public bool $canBeModified,
1717
public string $gender,
18+
public ?int $categoryId,
1819
) {
1920
}
2021

@@ -35,6 +36,7 @@ private function createList(): void
3536
'is_public' => $this->isPublic,
3637
'can_be_modified' => $this->canBeModified,
3738
'gender' => $this->gender,
39+
'list_category_id' => $this->categoryId,
3840
]);
3941
}
4042
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
7+
/**
8+
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ListCategory>
9+
*/
10+
class ListCategoryFactory extends Factory
11+
{
12+
/**
13+
* Define the model's default state.
14+
*
15+
* @return array<string, mixed>
16+
*/
17+
public function definition(): array
18+
{
19+
return [
20+
'name' => fake()->name(),
21+
'description' => fake()->text(),
22+
'is_serious' => fake()->boolean,
23+
];
24+
}
25+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\DB;
6+
use Illuminate\Support\Facades\Schema;
7+
8+
return new class extends Migration
9+
{
10+
public function up(): void
11+
{
12+
Schema::create('list_categories', function (Blueprint $table) {
13+
$table->id();
14+
$table->string('name');
15+
$table->text('description')->nullable();
16+
$table->boolean('is_serious')->default(true);
17+
$table->timestamps();
18+
});
19+
20+
Schema::table('lists', function (Blueprint $table) {
21+
$table->unsignedBigInteger('list_category_id')->after('user_id')->nullable();
22+
$table->foreign('list_category_id')->references('id')->on('list_categories')->onDelete('cascade');
23+
});
24+
25+
DB::table('list_categories')->insert([
26+
'name' => 'Prénoms d\'origine religieuse',
27+
'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.',
28+
'is_serious' => true,
29+
]);
30+
DB::table('list_categories')->insert([
31+
'name' => 'Prénoms d\'origine géographique',
32+
'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.',
33+
'is_serious' => true,
34+
]);
35+
DB::table('list_categories')->insert([
36+
'name' => 'Prénoms d\'origine historique',
37+
'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.',
38+
'is_serious' => true,
39+
]);
40+
DB::table('list_categories')->insert([
41+
'name' => 'Prénoms inspirés de la nature',
42+
'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.',
43+
'is_serious' => true,
44+
]);
45+
DB::table('list_categories')->insert([
46+
'name' => 'Prénoms inspirés de la littérature et du cinéma',
47+
'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.',
48+
'is_serious' => true,
49+
]);
50+
51+
DB::table('list_categories')->insert([
52+
'name' => 'Prénoms inventés',
53+
'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.',
54+
'is_serious' => false,
55+
]);
56+
DB::table('list_categories')->insert([
57+
'name' => 'Prénoms à double sens',
58+
'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.',
59+
'is_serious' => false,
60+
]);
61+
DB::table('list_categories')->insert([
62+
'name' => 'Prénoms de célébrités',
63+
'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.',
64+
'is_serious' => false,
65+
]);
66+
}
67+
};

resources/views/user/lists/edit.blade.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@
5858
<x-input-error class="mt-2" :messages="$errors->get('description')" />
5959
</div>
6060

61+
@if (auth()->user()->is_administrator)
62+
<div class="relative px-6 pt-4 pb-4">
63+
<label for="country" class="block text-sm font-medium leading-6 text-gray-900">Catégories (pour administrateur seulement)</label>
64+
<div class="mt-2">
65+
<select id="category" name="category" class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:max-w-xs sm:text-sm sm:leading-6">
66+
@foreach ($listCategories as $category)
67+
<option value="{{ $category['id'] }}" @selected($category['id'] === $list['list_category_id'])>{{ $category['name'] }}</option>
68+
@endforeach
69+
</select>
70+
</div>
71+
</div>
72+
@endif
73+
6174
<!-- actions -->
6275
<div class="flex items-center justify-between border-t dark:border-gray-600 bg-white dark:bg-gray-800 px-6 py-4">
6376
<x-link href="{{ route('list.show', $list['id']) }}">Retour</x-link>

resources/views/user/lists/new.blade.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
</div>
5858

5959
<!-- is public -->
60-
<div class="relative px-6 pt-4 pb-4">
60+
<div class="relative px-6 pt-4 pb-2">
6161
<p class="block font-medium text-sm text-gray-700 dark:text-gray-300">{{ __('Genre de la liste') }}</p>
6262
<div class="grid grid-flow-row sm:grid-flow-col sm:grid-cols-3 gap-4 pt-2 pb-4">
6363
<div class="flex p-3 ps-4 border border-gray-200 rounded dark:border-gray-700">
@@ -90,6 +90,19 @@
9090
</div>
9191
</div>
9292

93+
@if (auth()->user()->is_administrator)
94+
<div class="relative px-6 pt-4 pb-4">
95+
<label for="country" class="block text-sm font-medium leading-6 text-gray-900">Catégories (pour administrateur seulement)</label>
96+
<div class="mt-2">
97+
<select id="category" name="category" class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:max-w-xs sm:text-sm sm:leading-6">
98+
@foreach ($listCategories as $category)
99+
<option value="{{ $category['id'] }}">{{ $category['name'] }}</option>
100+
@endforeach
101+
</select>
102+
</div>
103+
</div>
104+
@endif
105+
93106
<!-- actions -->
94107
<div class="flex items-center justify-between border-t dark:border-gray-600 bg-white dark:bg-gray-800 px-6 py-4">
95108
<x-link href="{{ route('list.index') }}">{{ __('Back') }}</x-link>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Tests\Unit\Models;
4+
5+
use App\Models\ListCategory;
6+
use App\Models\NameList;
7+
use Illuminate\Foundation\Testing\DatabaseTransactions;
8+
use Tests\TestCase;
9+
10+
class ListCategoryTest extends TestCase
11+
{
12+
use DatabaseTransactions;
13+
14+
/** @test */
15+
public function it_has_many_list_names(): void
16+
{
17+
$listCategory = ListCategory::factory()->create();
18+
$nameList = NameList::factory()->create([
19+
'list_category_id' => $listCategory->id,
20+
]);
21+
22+
$this->assertTrue($listCategory->nameLists()->exists());
23+
}
24+
}

0 commit comments

Comments
 (0)