From d8cd5a2448e647d51e1817a84cce867d34c7eb82 Mon Sep 17 00:00:00 2001 From: anthodev Date: Fri, 5 Sep 2025 16:53:46 +0200 Subject: [PATCH] :recycle: (search): Refacto SearchController --- .../Search/GetSearchResultsUseCase.php | 67 +++++++++++++++++++ .../Controller/SearchController.php | 43 ++---------- .../Dto/Game/SearchResultsOutputDto.php | 20 ++++++ translations/search.en.yaml | 1 + 4 files changed, 95 insertions(+), 36 deletions(-) create mode 100644 src/Application/UseCase/Search/GetSearchResultsUseCase.php create mode 100644 src/Shared/Dto/Game/SearchResultsOutputDto.php diff --git a/src/Application/UseCase/Search/GetSearchResultsUseCase.php b/src/Application/UseCase/Search/GetSearchResultsUseCase.php new file mode 100644 index 0000000..7842e94 --- /dev/null +++ b/src/Application/UseCase/Search/GetSearchResultsUseCase.php @@ -0,0 +1,67 @@ + [], + 'total' => 0, + ]; + $searchQuery = ''; + $hasError = false; + $errorMessage = ''; + + if ($searchGamesForm->isSubmitted()) { + $gameData = $searchGamesForm->get('game')->getData(); + $searchQuery = is_string($gameData) ? trim($gameData) : ''; + + if (!$searchGamesForm->isValid()) { + $hasError = true; + $errors = []; + + /** + * @var FormError $error + */ + foreach ($searchGamesForm->getErrors(true, true) as $error) { + $errors[] = $error->getMessage(); + } + + $errorMessage = implode(' ', $errors); + } elseif (strlen($searchQuery) < SearchParameterEnum::MIN_SEARCH_LENGTH->value) { + $hasError = true; + $errorMessage = $this->translator->trans('form.errorMessage', ['minLength' => SearchParameterEnum::MIN_SEARCH_LENGTH->value], 'search'); + } else { + $results = $this->apiGameSearchService->searchGames($searchQuery); + } + } + + return new SearchResultsOutputDto( + searchQuery: $searchQuery, + results: $results, + hasError: $hasError, + errorMessage: $errorMessage, + ); + } +} diff --git a/src/Presentation/Controller/SearchController.php b/src/Presentation/Controller/SearchController.php index c949843..0228102 100644 --- a/src/Presentation/Controller/SearchController.php +++ b/src/Presentation/Controller/SearchController.php @@ -4,11 +4,9 @@ namespace App\Presentation\Controller; -use App\Application\Service\Game\ApiGameSearchService; +use App\Application\UseCase\Search\GetSearchResultsUseCase; use App\Presentation\Form\SearchGameForm; -use App\Shared\Enum\SearchParameterEnum; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\Form\FormError; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; @@ -18,46 +16,19 @@ class SearchController extends AbstractController #[Route(path: '/search', name: 'search_games', methods: [Request::METHOD_POST])] public function search( Request $request, - ApiGameSearchService $apiGameSearchService, + GetSearchResultsUseCase $getSearchResultsUseCase, ): Response { $searchGamesForm = $this->createForm(SearchGameForm::class); $searchGamesForm->handleRequest($request); - $results = []; - $searchQuery = ''; - $hasError = false; - $errorMessage = ''; - - if ($searchGamesForm->isSubmitted()) { - $gameData = $searchGamesForm->get('game')->getData(); - $searchQuery = is_string($gameData) ? trim($gameData) : ''; - - if (!$searchGamesForm->isValid()) { - $hasError = true; - $errors = []; - - /** - * @var FormError $error - */ - foreach ($searchGamesForm->getErrors(true, true) as $error) { - $errors[] = $error->getMessage(); - } - - $errorMessage = implode(' ', $errors); - } elseif (strlen($searchQuery) < SearchParameterEnum::MIN_SEARCH_LENGTH->value) { - $hasError = true; - $errorMessage = sprintf('Type at least %d characters...', SearchParameterEnum::MIN_SEARCH_LENGTH->value); - } else { - $results = $apiGameSearchService->searchGames($searchQuery); - } - } + $searchResultOutputDto = $getSearchResultsUseCase->execute($searchGamesForm); return $this->render('@turbo/search_results_frame.html.twig', [ 'searchGamesForm' => $searchGamesForm->createView(), - 'games' => $results['games'] ?? [], - 'searchQuery' => $searchQuery, - 'hasError' => $hasError, - 'errorMessage' => $errorMessage, + 'games' => $searchResultOutputDto->results['games'] ?? [], + 'searchQuery' => $searchResultOutputDto->searchQuery, + 'hasError' => $searchResultOutputDto->hasError, + 'errorMessage' => $searchResultOutputDto->errorMessage, ]); } } diff --git a/src/Shared/Dto/Game/SearchResultsOutputDto.php b/src/Shared/Dto/Game/SearchResultsOutputDto.php new file mode 100644 index 0000000..3b60d1f --- /dev/null +++ b/src/Shared/Dto/Game/SearchResultsOutputDto.php @@ -0,0 +1,20 @@ +, total:int} */ + public array $results, + public bool $hasError = false, + public string $errorMessage = '', + ) { + } +} diff --git a/translations/search.en.yaml b/translations/search.en.yaml index fb3abb9..76a7f22 100644 --- a/translations/search.en.yaml +++ b/translations/search.en.yaml @@ -3,6 +3,7 @@ form: placeholder: 'Type at least 3 characters...' submit: 'Search' helper: 'Search will run automatically from the third character' + errorMessage: 'Type at least %minLength% characters...' constraints: min_length_message: 'The search query must be at least %limit% characters' max_length_message: 'The search query cannot exceed %limit% characters'