From f0b610fb3db635576379cca3a0925cca09572912 Mon Sep 17 00:00:00 2001 From: Regis Freyd Date: Tue, 16 Jan 2024 20:42:07 -0500 Subject: [PATCH] feat: add note to name --- app/Http/Controllers/NameController.php | 4 ++ app/Http/Controllers/ShareController.php | 1 - app/Http/Controllers/UserNameController.php | 31 +++++++++++ app/Http/ViewModels/Names/NameViewModel.php | 4 ++ .../ViewModels/Search/SearchViewModel.php | 1 + app/Models/Name.php | 17 ++++++ app/Models/Note.php | 30 +++++++++++ app/Services/AddNoteToName.php | 34 ++++++++++++ app/Services/CreateAccount.php | 2 + database/factories/NoteFactory.php | 29 ++++++++++ ...24_01_16_223956_create_name_user_table.php | 24 +++++++++ resources/views/names/partials/note.blade.php | 54 +++++++++++++++++++ resources/views/names/show.blade.php | 17 +++--- routes/web.php | 4 ++ tests/Unit/Models/NameTest.php | 20 +++++++ tests/Unit/Models/NoteTest.php | 36 +++++++++++++ .../ViewModels/Names/NameViewModelTest.php | 1 + 17 files changed, 302 insertions(+), 7 deletions(-) create mode 100644 app/Http/Controllers/UserNameController.php create mode 100644 app/Models/Note.php create mode 100644 app/Services/AddNoteToName.php create mode 100644 database/factories/NoteFactory.php create mode 100644 database/migrations/2024_01_16_223956_create_name_user_table.php create mode 100644 resources/views/names/partials/note.blade.php create mode 100644 tests/Unit/Models/NoteTest.php diff --git a/app/Http/Controllers/NameController.php b/app/Http/Controllers/NameController.php index 05baf06..19dbce1 100644 --- a/app/Http/Controllers/NameController.php +++ b/app/Http/Controllers/NameController.php @@ -77,12 +77,15 @@ public function show(Request $request): View if (! auth()->check()) { $favoritedNamesForLoggedUser = collect(); $lists = []; + $note = ''; } else { $favoritedNamesForLoggedUser = Cache::remember('user-favorites-' . auth()->id(), 604800, function () { return UserViewModel::favorites(); }); $lists = ListViewModel::lists($requestedName); + + $note = $requestedName->getNoteForUser(); } return view('names.show', [ @@ -93,6 +96,7 @@ public function show(Request $request): View 'numerology' => $numerology, 'favorites' => $favoritedNamesForLoggedUser, 'lists' => $lists, + 'note' => $note, ]); } diff --git a/app/Http/Controllers/ShareController.php b/app/Http/Controllers/ShareController.php index d82c2f0..c84e51d 100644 --- a/app/Http/Controllers/ShareController.php +++ b/app/Http/Controllers/ShareController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; -use Illuminate\View\View; class ShareController extends Controller { diff --git a/app/Http/Controllers/UserNameController.php b/app/Http/Controllers/UserNameController.php new file mode 100644 index 0000000..efff119 --- /dev/null +++ b/app/Http/Controllers/UserNameController.php @@ -0,0 +1,31 @@ +attributes->get('name'); + + (new AddNoteToName( + nameId: $name->id, + userId: auth()->id(), + noteText: $request->input('note'), + ))->execute(); + + return Redirect::route('name.show', [ + 'id' => $name->id, + 'name' => StringHelper::sanitizeNameForURL($name->name), + ]); + } +} diff --git a/app/Http/ViewModels/Names/NameViewModel.php b/app/Http/ViewModels/Names/NameViewModel.php index 2308ceb..b2dc8b1 100644 --- a/app/Http/ViewModels/Names/NameViewModel.php +++ b/app/Http/ViewModels/Names/NameViewModel.php @@ -56,6 +56,10 @@ public static function details(Name $name): array 'favorite' => route('favorite.name.update', [ 'id' => $name->id, ]), + 'note_edit' => route('user.name.update', [ + 'id' => $name->id, + 'name' => StringHelper::sanitizeNameForURL($name->name), + ]), ], ]; } diff --git a/app/Http/ViewModels/Search/SearchViewModel.php b/app/Http/ViewModels/Search/SearchViewModel.php index e28d14e..0d35512 100644 --- a/app/Http/ViewModels/Search/SearchViewModel.php +++ b/app/Http/ViewModels/Search/SearchViewModel.php @@ -16,6 +16,7 @@ public static function names(?string $term = null, int $limit = 20): array ->map(fn (Name $name) => [ 'id' => $name->id, 'name' => StringHelper::formatNameFromDB($name->name), + 'gender' => $name->gender == 'male' ? 'masculin' : 'feminin', 'url' => [ 'show' => route('name.show', [ 'id' => $name->id, diff --git a/app/Models/Name.php b/app/Models/Name.php index e92e345..6193ee8 100644 --- a/app/Models/Name.php +++ b/app/Models/Name.php @@ -77,4 +77,21 @@ public function toSitemapTag(): Url|string|array ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY) ->setPriority(0.1); } + + public function getNoteForUser(): ?string + { + if (! auth()->check()) { + return null; + } + + $note = Note::where('name_id', $this->id) + ->where('user_id', auth()->id()) + ->first(); + + if (! $note) { + return null; + } + + return $note->content; + } } diff --git a/app/Models/Note.php b/app/Models/Note.php new file mode 100644 index 0000000..0c4e23a --- /dev/null +++ b/app/Models/Note.php @@ -0,0 +1,30 @@ +belongsTo(User::class); + } + + public function name(): BelongsTo + { + return $this->belongsTo(Name::class); + } +} diff --git a/app/Services/AddNoteToName.php b/app/Services/AddNoteToName.php new file mode 100644 index 0000000..3c7c9f9 --- /dev/null +++ b/app/Services/AddNoteToName.php @@ -0,0 +1,34 @@ +create(); + + return $this->note; + } + + private function create(): void + { + $this->note = Note::updateOrCreate([ + 'name_id' => $this->nameId, + 'user_id' => $this->userId, + ], [ + 'content' => $this->noteText, + ]); + } +} diff --git a/app/Services/CreateAccount.php b/app/Services/CreateAccount.php index 5e20c6b..efb51af 100644 --- a/app/Services/CreateAccount.php +++ b/app/Services/CreateAccount.php @@ -5,6 +5,7 @@ use App\Models\NameList; use App\Models\User; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Str; /** * Create an account for the user. @@ -55,6 +56,7 @@ private function createDefaultList(): void 'is_public' => false, 'can_be_modified' => true, 'is_list_of_favorites' => false, + 'uuid' => Str::uuid(), ]); } } diff --git a/database/factories/NoteFactory.php b/database/factories/NoteFactory.php new file mode 100644 index 0000000..c161a7e --- /dev/null +++ b/database/factories/NoteFactory.php @@ -0,0 +1,29 @@ + + */ +class NoteFactory extends Factory +{ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'user_id' => User::factory(), + 'name_id' => Name::factory(), + 'content' => fake()->sentence(), + ]; + } +} diff --git a/database/migrations/2024_01_16_223956_create_name_user_table.php b/database/migrations/2024_01_16_223956_create_name_user_table.php new file mode 100644 index 0000000..6c61fb2 --- /dev/null +++ b/database/migrations/2024_01_16_223956_create_name_user_table.php @@ -0,0 +1,24 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('name_id'); + $table->string('content'); + $table->timestamps(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('name_id')->references('id')->on('names')->onDelete('cascade'); + }); + } +}; diff --git a/resources/views/names/partials/note.blade.php b/resources/views/names/partials/note.blade.php new file mode 100644 index 0000000..f241cd9 --- /dev/null +++ b/resources/views/names/partials/note.blade.php @@ -0,0 +1,54 @@ +@if ($note != '') + +
+ Note privée + +
    +
  • Editer
  • +
  • Supprimer
  • +
+
+
+ {!! $note !!} +
+ +@else + +
+

Ajoutez une note privée à ce prénom.

+ @auth + + + Ajouter + + @else + + + Ajouter + + @endauth +
+ +@endif + +
+
+ {{ old('note', $note) }} + + +
+ +
+ + + Annuler +
+
diff --git a/resources/views/names/show.blade.php b/resources/views/names/show.blade.php index 7939db3..82fdaef 100644 --- a/resources/views/names/show.blade.php +++ b/resources/views/names/show.blade.php @@ -65,22 +65,22 @@ @@ -108,6 +108,11 @@ + +
+ @include('names.partials.note') +
+

diff --git a/routes/web.php b/routes/web.php index 3c5b749..04513b4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,6 +13,7 @@ use App\Http\Controllers\ProfileController; use App\Http\Controllers\SearchController; use App\Http\Controllers\ShareController; +use App\Http\Controllers\UserNameController; use Illuminate\Support\Facades\Route; Route::get('partage/{uuid}', [ShareController::class, 'show'])->name('share.show'); @@ -46,6 +47,9 @@ // used on the show page Route::put('prenoms/{id}/show/favorite', [NameFavoriteController::class, 'update'])->name('favorite.name.update'); + + // set the note for the given name + Route::put('prenoms/{id}/{name}/note', [UserNameController::class, 'update'])->name('user.name.update'); }); Route::get('favoris', [FavoriteController::class, 'index'])->name('favorite.index'); diff --git a/tests/Unit/Models/NameTest.php b/tests/Unit/Models/NameTest.php index e7a5026..81ecef5 100644 --- a/tests/Unit/Models/NameTest.php +++ b/tests/Unit/Models/NameTest.php @@ -5,6 +5,8 @@ use App\Models\Name; use App\Models\NameList; use App\Models\NameStatistic; +use App\Models\Note; +use App\Models\User; use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; @@ -32,4 +34,22 @@ public function it_has_many_name_lists(): void $this->assertTrue($name->lists()->exists()); } + + /** @test */ + public function it_gets_the_content_of_the_note_for_the_user_if_it_is_set(): void + { + $name = Name::factory()->create(); + $user = User::factory()->create(); + $this->be($user); + Note::factory()->create([ + 'name_id' => $name->id, + 'user_id' => $user->id, + 'content' => 'This is a note', + ]); + + $this->assertEquals( + 'This is a note', + $name->getNoteForUser() + ); + } } diff --git a/tests/Unit/Models/NoteTest.php b/tests/Unit/Models/NoteTest.php new file mode 100644 index 0000000..2b08e4f --- /dev/null +++ b/tests/Unit/Models/NoteTest.php @@ -0,0 +1,36 @@ +create(); + $note = Note::factory()->create([ + 'name_id' => $name->id, + ]); + + $this->assertTrue($note->name()->exists()); + } + + /** @test */ + public function it_belongs_to_a_user(): void + { + $user = User::factory()->create(); + $note = Note::factory()->create([ + 'user_id' => $user->id, + ]); + + $this->assertTrue($note->user()->exists()); + } +} diff --git a/tests/Unit/ViewModels/Names/NameViewModelTest.php b/tests/Unit/ViewModels/Names/NameViewModelTest.php index b73ec1b..7e22e10 100644 --- a/tests/Unit/ViewModels/Names/NameViewModelTest.php +++ b/tests/Unit/ViewModels/Names/NameViewModelTest.php @@ -78,6 +78,7 @@ public function it_gets_the_details_of_a_name(): void [ 'show' => env('APP_URL') . '/prenoms/' . $name->id . '/heloise', 'favorite' => env('APP_URL') . '/prenoms/' . $name->id . '/show/favorite', + 'note_edit' => env('APP_URL') . '/prenoms/' . $name->id . '/heloise/note', ], $array['url'] );