From 15f7c99684e0722e0dd283ea8cb2e5bca5fdc0a4 Mon Sep 17 00:00:00 2001 From: Lee Peuker Date: Thu, 22 Aug 2024 21:32:04 +0200 Subject: [PATCH] Add location to movie search filter --- Makefile | 6 ++--- .../modal-advanced-search-movie.html.js | 6 +++++ src/Domain/Movie/History/MovieHistoryApi.php | 11 ++++++++ src/Domain/Movie/MovieApi.php | 9 +++++++ src/Domain/Movie/MovieRepository.php | 27 +++++++++++++++++++ .../Web/Dto/MoviesRequestDto.php | 8 ++++++ .../Web/Mapper/MoviesRequestMapper.php | 2 ++ src/HttpController/Web/MoviesController.php | 4 +++ .../modal-advanced-search-movie.html.twig | 9 +++++++ 9 files changed, 79 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 01f3b97e..2b639b72 100644 --- a/Makefile +++ b/Makefile @@ -64,12 +64,12 @@ db_mysql_create_database: make app_database_migrate db_mysql_import: - docker cp storage/dump.sql movary_mysql_1:/tmp/dump.sql - docker compose exec mysql bash -c 'mysql -uroot -p${DATABASE_MYSQL_ROOT_PASSWORD} < /tmp/dump.sql' + docker cp storage/dump.sql movary-mysql-1:/tmp/dump.sql + docker compose exec mysql bash -c 'mysql -uroot -p${DATABASE_MYSQL_ROOT_PASSWORD} movary < /tmp/dump.sql' db_mysql_export: docker compose exec mysql bash -c 'mysqldump --databases --add-drop-database -uroot -p$(DATABASE_MYSQL_ROOT_PASSWORD) $(DATABASE_MYSQL_NAME) > /tmp/dump.sql' - docker cp movary_mysql_1:/tmp/dump.sql storage/dump.sql + docker cp movary-mysql-1:/tmp/dump.sql storage/dump.sql chown $(USER_ID):$(USER_ID) storage/dump.sql db_migration_create: diff --git a/public/js/component/modal-advanced-search-movie.html.js b/public/js/component/modal-advanced-search-movie.html.js index bb46db00..f802cf5a 100644 --- a/public/js/component/modal-advanced-search-movie.html.js +++ b/public/js/component/modal-advanced-search-movie.html.js @@ -14,6 +14,7 @@ const searchPerPageSelect = document.getElementById('searchPerPageSelect'); const searchUserRatingSelect = document.getElementById('searchUserRatingSelect'); const searchMinUserRatingSelect = document.getElementById('searchMinUserRatingSelect'); const searchMaxUserRatingSelect = document.getElementById('searchMaxUserRatingSelect'); +const searchLocationSelect = document.getElementById('searchLocationSelect'); function search() { let sortBy = searchSortBySelect.value @@ -26,6 +27,7 @@ function search() { let searchMinUserRating = searchMinUserRatingSelect.value let searchMaxUserRating = searchMaxUserRatingSelect.value let searchTerm = document.getElementById('searchTermInput').value + let searchLocation = searchLocationSelect.value let getParameters = '?' @@ -45,6 +47,9 @@ function search() { if (searchTerm != '') { getParameters += '&s=' + searchTerm } + if (searchLocation != '') { + getParameters += '&loc=' + searchLocation + } if (searchUserRating != '') { getParameters += '&ur=' + searchUserRating if (searchUserRating === '1') { @@ -68,6 +73,7 @@ function resetSearchOptions() { searchMinUserRatingSelect.value = '' searchMaxUserRatingSelect.value = '' searchPerPageSelect.value = '24' + searchLocationSelect.value = '' } diff --git a/src/Domain/Movie/History/MovieHistoryApi.php b/src/Domain/Movie/History/MovieHistoryApi.php index 5b2eccd3..10a7a6b0 100644 --- a/src/Domain/Movie/History/MovieHistoryApi.php +++ b/src/Domain/Movie/History/MovieHistoryApi.php @@ -265,6 +265,7 @@ public function fetchPlayedMoviesPaginated( ?bool $hasUserRating = null, ?int $userRatingMin = null, ?int $userRatingMax = null, + ?int $locationId = null, ) : array { if ($sortOrder === null) { $sortOrder = SortOrder::createAsc(); @@ -283,6 +284,7 @@ public function fetchPlayedMoviesPaginated( $hasUserRating, $userRatingMin, $userRatingMax, + $locationId, ); return $this->urlGenerator->replacePosterPathWithImageSrcUrl($movies); @@ -369,6 +371,11 @@ public function fetchUniqueDirectorsGenders(int $userId) : array return $uniqueDirectorsGendersEnriched; } + public function fetchUniqueLocations(int $userId) : array + { + return $this->movieRepository->fetchUniqueLocations($userId); + } + public function fetchUniqueMovieGenres(int $userId) : array { return $this->movieRepository->fetchUniqueMovieGenres($userId); @@ -407,6 +414,7 @@ public function fetchUniqueWatchedMoviesCount( ?bool $hasUserRating = null, ?int $userRatingMin = null, ?int $userRatingMax = null, + ?int $locationId = null, ) : int { return $this->movieRepository->fetchUniqueWatchedMoviesCount( $userId, @@ -417,6 +425,7 @@ public function fetchUniqueWatchedMoviesCount( $hasUserRating, $userRatingMin, $userRatingMax, + $locationId, ); } @@ -433,6 +442,7 @@ public function fetchUniqueWatchedMoviesPaginated( ?bool $hasUserRating = null, ?int $userRatingMin = null, ?int $userRatingMax = null, + ?int $locationId = null, ) : array { if ($sortOrder === null) { $sortOrder = SortOrder::createAsc(); @@ -451,6 +461,7 @@ public function fetchUniqueWatchedMoviesPaginated( $hasUserRating, $userRatingMin, $userRatingMax, + $locationId, ); return $this->urlGenerator->replacePosterPathWithImageSrcUrl($movies); diff --git a/src/Domain/Movie/MovieApi.php b/src/Domain/Movie/MovieApi.php index 7180bf73..3d633d10 100644 --- a/src/Domain/Movie/MovieApi.php +++ b/src/Domain/Movie/MovieApi.php @@ -277,6 +277,11 @@ public function fetchTotalPlayCountUnique(int $userId) : int return $this->historyApi->fetchTotalPlayCountUnique($userId); } + public function fetchUniqueLocations(int $userId) : array + { + return $this->historyApi->fetchUniqueLocations($userId); + } + public function fetchUniqueMovieGenres(int $userId) : array { return $this->historyApi->fetchUniqueMovieGenres($userId); @@ -301,6 +306,7 @@ public function fetchUniqueWatchedMoviesCount( ?bool $hasUserRating, ?int $userRatingMin, ?int $userRatingMax, + ?int $locationId, ) : int { return $this->historyApi->fetchUniqueWatchedMoviesCount( $userId, @@ -311,6 +317,7 @@ public function fetchUniqueWatchedMoviesCount( $hasUserRating, $userRatingMin, $userRatingMax, + $locationId, ); } @@ -327,6 +334,7 @@ public function fetchUniqueWatchedMoviesPaginated( ?bool $hasUserRating, ?int $userRatingMin, ?int $userRatingMax, + ?int $locationId, ) : array { return $this->historyApi->fetchUniqueWatchedMoviesPaginated( $userId, @@ -341,6 +349,7 @@ public function fetchUniqueWatchedMoviesPaginated( $hasUserRating, $userRatingMin, $userRatingMax, + $locationId, ); } diff --git a/src/Domain/Movie/MovieRepository.php b/src/Domain/Movie/MovieRepository.php index 9f2b2088..9c0ce742 100644 --- a/src/Domain/Movie/MovieRepository.php +++ b/src/Domain/Movie/MovieRepository.php @@ -710,6 +710,21 @@ public function fetchUniqueDirectorsGenders(int $userId) : array ); } + public function fetchUniqueLocations(int $userId) : array + { + return $this->dbConnection->fetchAllAssociative( + <<dbConnection->fetchFirstColumn( @@ -776,6 +791,7 @@ public function fetchUniqueWatchedMoviesCount( ?bool $hasUserRating, ?int $userRatingMin, ?int $userRatingMax, + ?int $locationId, ) : int { $payload = [$userId, $userId, "%$searchTerm%"]; @@ -809,6 +825,11 @@ public function fetchUniqueWatchedMoviesCount( $payload[] = $userRatingMax; } + if ($locationId !== null) { + $whereQuery .= 'AND mh.location_id = ? '; + $payload[] = $locationId; + } + return $this->dbConnection->fetchFirstColumn( <<dbConnection->fetchAllAssociative( <<limit; } + public function getLocationId() : ?int + { + return $this->locationId; + } + public function getPage() : int { return $this->page; diff --git a/src/HttpController/Web/Mapper/MoviesRequestMapper.php b/src/HttpController/Web/Mapper/MoviesRequestMapper.php index ff188e57..6b9ebe9c 100644 --- a/src/HttpController/Web/Mapper/MoviesRequestMapper.php +++ b/src/HttpController/Web/Mapper/MoviesRequestMapper.php @@ -49,6 +49,7 @@ public function mapRenderPageRequest(Request $request) : MoviesRequestDto $userRating = isset($getParameters['ur']) === true ? (bool)$getParameters['ur'] : self::DEFAULT_HAS_USER_RATING; $userRatingMin = isset($getParameters['minur']) === true ? (int)$getParameters['minur'] : self::DEFAULT_USER_RATING_MIN; $userRatingMax = isset($getParameters['maxur']) === true ? (int)$getParameters['maxur'] : self::DEFAULT_USER_RATING_MAX; + $locationId = isset($getParameters['loc']) === true ? (int)$getParameters['loc'] : null; return MoviesRequestDto::createFromParameters( $userId, @@ -63,6 +64,7 @@ public function mapRenderPageRequest(Request $request) : MoviesRequestDto $userRating, $userRatingMin, $userRatingMax, + $locationId, ); } diff --git a/src/HttpController/Web/MoviesController.php b/src/HttpController/Web/MoviesController.php index b3ec984b..d2cb00a0 100644 --- a/src/HttpController/Web/MoviesController.php +++ b/src/HttpController/Web/MoviesController.php @@ -39,6 +39,7 @@ public function renderPage(Request $request) : Response $requestData->hasUserRating(), $requestData->getUserRatingMin(), $requestData->getUserRatingMax(), + $requestData->getLocationId(), ); $watchedMoviesCount = $this->movieApi->fetchUniqueWatchedMoviesCount( @@ -50,6 +51,7 @@ public function renderPage(Request $request) : Response $requestData->hasUserRating(), $requestData->getUserRatingMin(), $requestData->getUserRatingMax(), + $requestData->getLocationId(), ); $paginationElements = $this->paginationElementsCalculator->createPaginationElements($watchedMoviesCount, $requestData->getLimit(), $requestData->getPage()); @@ -66,9 +68,11 @@ public function renderPage(Request $request) : Response 'releaseYear' => (string)$requestData->getReleaseYear(), 'language' => (string)$requestData->getLanguage(), 'genre' => (string)$requestData->getGenre(), + 'locationId' => $requestData->getLocationId(), 'uniqueReleaseYears' => $this->movieApi->fetchUniqueMovieReleaseYears($requestData->getUserId()), 'uniqueLanguages' => $this->movieApi->fetchUniqueMovieLanguages($requestData->getUserId()), 'uniqueGenres' => $this->movieApi->fetchUniqueMovieGenres($requestData->getUserId()), + 'uniqueLocations' => $this->movieApi->fetchUniqueLocations($requestData->getUserId()), 'hasUserRating' => $requestData->hasUserRating(), 'minUserRating' => $requestData->getUserRatingMin(), 'maxUserRating' => $requestData->getUserRatingMax(), diff --git a/templates/component/modal-advanced-search-movie.html.twig b/templates/component/modal-advanced-search-movie.html.twig index 82caab5a..6604592a 100644 --- a/templates/component/modal-advanced-search-movie.html.twig +++ b/templates/component/modal-advanced-search-movie.html.twig @@ -82,6 +82,15 @@ +
+ Location + +
Pagination