diff --git a/src/app/Packages/Domains/Favorite/FavoriteRepository.php b/src/app/Packages/Domains/Favorite/FavoriteRepository.php index 586538f0..6a98f5fe 100644 --- a/src/app/Packages/Domains/Favorite/FavoriteRepository.php +++ b/src/app/Packages/Domains/Favorite/FavoriteRepository.php @@ -23,6 +23,17 @@ public function addFavorite(int $userId, int $worldHeritageSiteId): void $user->favorites()->attach($worldHeritageSiteId); } + public function removeFavorite(int $userId, int $worldHeritageSiteId): void + { + $user = $this->userModel->find($userId); + + if ($user === null) { + throw new Exception('User not found.'); + } + + $user->favorites()->detach($worldHeritageSiteId); + } + public function getFavoriteWorldHeritageIds(int $userId): array { $user = $this->userModel->find($userId); diff --git a/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php b/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php index 164187e6..1c507374 100644 --- a/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php +++ b/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php @@ -6,5 +6,7 @@ interface FavoriteRepositoryInterface { public function addFavorite(int $userId, int $worldHeritageSiteId): void; + public function removeFavorite(int $userId, int $worldHeritageSiteId): void; + public function getFavoriteWorldHeritageIds(int $userId): array; } diff --git a/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php b/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php index 7264d602..bd001ace 100644 --- a/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php +++ b/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php @@ -91,6 +91,39 @@ public function test_addFavorite_throws_exception_when_user_not_found(): void $this->repository()->addFavorite(999999, $worldHeritage->id); } + public function test_removeFavorite_detaches_world_heritage_site_from_user(): void + { + $user = $this->seedUser(); + $worldHeritage = $this->seedWorldHeritage(1); + $user->favorites()->attach($worldHeritage->id); + + $this->repository()->removeFavorite($user->id, $worldHeritage->id); + + $this->assertDatabaseMissing('user_favorite', [ + 'user_id' => $user->id, + 'world_heritage_site_id' => $worldHeritage->id, + ]); + } + + #[\PHPUnit\Framework\Attributes\DoesNotPerformAssertions] + public function test_removeFavorite_does_not_throw_when_not_favorited(): void + { + $user = $this->seedUser(); + $worldHeritage = $this->seedWorldHeritage(1); + + $this->repository()->removeFavorite($user->id, $worldHeritage->id); + } + + public function test_removeFavorite_throws_exception_when_user_not_found(): void + { + $worldHeritage = $this->seedWorldHeritage(1); + + $this->expectException(Exception::class); + $this->expectExceptionMessage('User not found.'); + + $this->repository()->removeFavorite(999999, $worldHeritage->id); + } + public function test_getFavoriteWorldHeritageIds_returns_ids_ordered_by_most_recently_favorited(): void { $user = $this->seedUser();