src/Aviatur/SearchBundle/Controller/SearchController.php line 23

Open in your IDE?
  1. <?php
  2. namespace Aviatur\SearchBundle\Controller;
  3. use Aviatur\SearchBundle\Entity\SearchHeliports;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Aviatur\SearchBundle\Controller\TravelDestinationController;
  10. use Aviatur\SearchBundle\Entity\TravelDestination;
  11. class SearchController extends AbstractController {
  12.     function Slug($string) {
  13.         return mb_strtolower(trim(preg_replace('~[^0-9a-z]+~i''-'html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i''$1'htmlentities($stringENT_QUOTES'UTF-8')), ENT_QUOTES'UTF-8')), '-'));
  14.     }
  15.     public function citiesAutocompleteAction(Request $requestManagerRegistry $registry$type) {
  16.         if ($request->isXmlHttpRequest()) {
  17.             $term $this->Slug($request->query->get('term'));
  18.             $json_template '<value>:<label>:<countrycode>-';
  19.             $em $registry->getManager();
  20.             $jsonArray = [];
  21.             if ($type != "cars") {
  22.                 $cities $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findByOrWithSingleValue(["iata""city"], $term);
  23.                 if ($cities) {
  24.                     $jsonArray['cities'] = '';
  25.                     foreach ($cities as $city) {
  26.                         $jsonArray['cities'] .= str_replace(['<value>''<label>''<countrycode>'], [$city['iata'], $city['city'] . ', ' $city['country'], $city['countrycode']], $json_template);
  27.                     }
  28.                     $jsonArray['cities'] = \rtrim($jsonArray['cities'], '-');
  29.                 } else {
  30.                     $jsonArray['cities'] = 'NN:No hay Resultados';
  31.                 }
  32.             }
  33.             if (($type != "hotels") || ($type == "cars")) {
  34.                 $airports $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findByOrWithSingleValue(["search"], $this->unaccent($term));
  35.                 if ($airports) {
  36.                     $jsonArray['airports'] = '';
  37.                     foreach ($airports as $airport) {
  38.                         $jsonArray['airports'] .= str_replace(['<value>''<label>''<countrycode>'], [$airport['iata'], $airport['name'] . ', ' $airport['city'] . ', ' $airport['country'], $airport['countrycode']], $json_template);
  39.                     }
  40.                 } else {
  41.                     $jsonArray['airports'] = 'NN:No hay Resultados';
  42.                 }
  43.             }
  44.             $json implode(';'$jsonArray);
  45.             $response = \rtrim($json'-');
  46.             return new Response($response);
  47.         } else {
  48.             return new Response('Acceso Restringido');
  49.         }
  50.     }
  51.     public function countryAction(Request $requestManagerRegistry $registry) {
  52.         if ($request->isXmlHttpRequest()) {
  53.             $term $this->Slug($request->query->get('term'));
  54.             $json_template '<value>:<label>-';
  55.             $em $registry->getManager();
  56.             $countries $em->getRepository(\Aviatur\GeneralBundle\Entity\Country::class)->findByOrWithSingleValue(["iatacode""description"], $term);
  57.             $json '';
  58.             if ($countries) {
  59.                 foreach ($countries as $country) {
  60.                     $json .= str_replace(['<value>''<label>'], [$country['iata'], ucwords(mb_strtolower($country['description']))], $json_template);
  61.                 }
  62.             } else {
  63.                 $json 'NN:No hay Resultados';
  64.             }
  65.             $response = \rtrim($json'-');
  66.             return new Response($response);
  67.         } else {
  68.             return new Response('Acceso Restringido');
  69.         }
  70.     }
  71.     public function airlinesAction(Request $requestManagerRegistry $registry) {
  72.         if ($request->isXmlHttpRequest()) {
  73.             $term $this->Slug($request->query->get('term'));
  74.             $json_template '<value>:<label>-';
  75.             $em $registry->getManager();
  76.             $airlines $em->getRepository(\Aviatur\FlightBundle\Entity\Airline::class)->findByOrWithSingleValue(["iata""name"], $term);
  77.             $uniqueIata = [];
  78.             $uniqueNames = []; 
  79.             $filteredAirlines array_filter($airlines, function($airline) use (&$uniqueIata, &$uniqueNames) {
  80.                 $iata $airline['iata'];
  81.                 $name trim($airline['name']); // Elimina espacios extra
  82.             
  83.                 if (in_array($iata$uniqueIata) || in_array($name$uniqueNames)) {
  84.                     return false// Si ya existe en iata o en name, se ignora
  85.                 }
  86.             
  87.                 $uniqueIata[] = $iata;
  88.                 $uniqueNames[] = $name;
  89.             
  90.                 return true;
  91.             });
  92.             // Convertir a array indexado
  93.             $airlines array_values($filteredAirlines);
  94.             $json '';
  95.             if ($airlines) {
  96.                 foreach ($airlines as $airline) {
  97.                     $json .= str_replace(['<value>''<label>'], [$airline['iata'], ucwords(mb_strtolower($airline['name']))], $json_template);
  98.                 }
  99.             } else {
  100.                 $json 'NN:No hay Resultados';
  101.             }
  102.             $response = \rtrim($json'-');
  103.             return new Response($response);
  104.         } else {
  105.             return new Response('Acceso Restringido');
  106.         }
  107.     }
  108.     public function heliportsAction(Request $requestManagerRegistry $registry) {
  109.         if ($request->isXmlHttpRequest()) {
  110.             $term $this->Slug($request->query->get('term'));
  111.             $json_template '<value>:<label>-';
  112.             $em $registry->getManager();
  113.             $heliports $em->getRepository(SearchHeliports::class)->findByOrWithSingleValue(["iata""name""city"], $term);
  114.             $json '';
  115.             if ($heliports) {
  116.                 foreach ($heliports as $heliport) {
  117.                     $json .= str_replace(['<value>''<label>'], [$heliport['iata'], ucwords(mb_strtolower($heliport['name'])) . ', ' $heliport['city'] . ', ' $heliport['country']], $json_template);
  118.                 }
  119.             } else {
  120.                 $json 'NN:No hay Resultados';
  121.             }
  122.             $response = \rtrim($json'-');
  123.             return new Response($response);
  124.         } else {
  125.             return new Response('Acceso Restringido');
  126.         }
  127.     }
  128.     public function trainStationsAction(Request $requestManagerRegistry $registry) {
  129.         if ($request->isXmlHttpRequest()) {
  130.             $term $this->Slug($request->query->get('term'));
  131.             $json_template '<value>:<label>:<type>-';
  132.             $em $registry->getManager();
  133.             $trainStations $em->getRepository(\Aviatur\TrainBundle\Entity\TrainStation::class)->searchStation($term);
  134.             $json '';
  135.             if ($trainStations) {
  136.                 foreach ($trainStations as $station) {
  137.                     $nameStation = ($station['namestationes'] != null && $station['namestationes'] != "") ? $station['namestationes'] : $station['namestation'];
  138.                     $json .= str_replace(['<value>''<label>''<type>'], [$station['id'], ucwords(mb_strtolower($nameStation)), $station['type']], $json_template);
  139.                 }
  140.             } else {
  141.                 $json 'NN:No hay Resultados';
  142.             }
  143.             $response = \rtrim($json'-');
  144.             return new Response($response);
  145.         } else {
  146.             return new Response('Acceso Restringido');
  147.         }
  148.     }
  149.     public function terminalsAction(Request $requestManagerRegistry $registry) {
  150.         $fullRequest $request;
  151.         if ($fullRequest->isXmlHttpRequest()) {
  152.             $json_template '<value>:<label>-';
  153.             $em $registry->getManager();
  154.             $json '';
  155.             $term $this->Slug($fullRequest->query->get('term'));
  156.             if ($fullRequest->query->has('origin')) {
  157.                 $origin $this->Slug($fullRequest->query->get('origin'));
  158.                 $terminals $em->getRepository(\Aviatur\BusBundle\Entity\Terminal::class)->findDestinationByOrigin(["name""city""state"], $term$origin);
  159.             } else {
  160.                 $terminals $em->getRepository(\Aviatur\BusBundle\Entity\Terminal::class)->findByOrWithSingleValue(["name""city""state"], $term);
  161.             }
  162.             if ($terminals) {
  163.                 foreach ($terminals as $terminal) {
  164.                     $terminalLabel = ($terminal['state']) ? $terminal['name'] . ', ' $terminal['state'] : $terminal['name'];
  165.                     $json .= str_replace(['<value>''<label>'], [$terminal['pinbusid'], $terminalLabel], $json_template);
  166.                 }
  167.             } else {
  168.                 $json 'NN:No hay Resultados';
  169.             }
  170.             $response = \rtrim($json'-');
  171.             return new Response($response);
  172.         } else {
  173.             return new Response('Acceso Restringido');
  174.         }
  175.     }
  176.     private function unaccent($string) {
  177.         return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i''$1'htmlentities($stringENT_QUOTES'UTF-8'));
  178.     }
  179.     public static function autocompleteOnCitySearch(Request $requestManagerRegistry $registry$type) {
  180.         try {
  181.             $em $registry->getManager();
  182.             
  183.             $searchParameters json_decode($request->getContent(), true);
  184.             $searchQuery $searchParameters["city"];
  185.             $fetchMore $searchParameters["fetch_more"] ?? false;
  186.             $dbTravelDestinationCounter $em->getRepository(TravelDestination::class)->countTravelDestinationResults($searchQuery);
  187.             $limitResults 7;
  188.             if($fetchMore === true){
  189.                 $limitResults 20;
  190.             }
  191.             
  192.             if (empty($searchQuery)) {
  193.                 return new JsonResponse(
  194.                     [
  195.                         "results" => [],
  196.                         "status" => [
  197.                             "message" => "Error: Ciudad obligatoria",
  198.                             "code" => 503
  199.                         ]
  200.                     ], 
  201.                     Response::HTTP_BAD_REQUEST
  202.                 );
  203.             }
  204.             if($dbTravelDestinationCounter >= $limitResults){
  205.                 $getFromSource 'DATABASE';
  206.             }else{
  207.                 $getFromSource "API";
  208.             }
  209.            
  210.             switch ($getFromSource) {
  211.                 case 'API':
  212.                     $apiResponse TravelDestinationController::fetchAndStoreApiCities($registry$searchQuery$limitResults);
  213.                     return new JsonResponse(
  214.                         $apiResponse
  215.                         Response::HTTP_OK
  216.                     );
  217.                     break;
  218.                 
  219.                 case 'DATABASE':
  220.                     $citiesFromTravelDestinations TravelDestinationController::getCitiesFromTravelDestinations($registry,  $searchQuery$limitResults);
  221.                     return new JsonResponse(
  222.                         $citiesFromTravelDestinations
  223.                         Response::HTTP_OK,
  224.                     );
  225.                     break;
  226.                 default:
  227.                     return new JsonResponse(
  228.                         [
  229.                             "results" => [],
  230.                             "status" => [
  231.                                 "message" => "Error: Fuente inválida",
  232.                                 "code" => 503
  233.                             ]
  234.                         ], 
  235.                         Response::HTTP_BAD_REQUEST
  236.                     );
  237.             }
  238.         } catch (\Throwable $th) {
  239.             $response = array(
  240.                 "results" => [],
  241.                 "status" => array(
  242.                     //"error"  => $th->getMessage(). " - " . $th->getLine(),
  243.                     "message" => "Error: buscar ciudades",
  244.                     "code" => 503
  245.                 )
  246.             );
  247.             return new Response(
  248.                 $response
  249.                 Response::HTTP_SERVICE_UNAVAILABLE,  
  250.                 ['Content-Type' => 'application/json'
  251.             );
  252.         }
  253.     }
  254. }