<?php
namespace App\Controller\Mvc;
use App\Service\Entry\MapService;
use App\Utils\TargetChoiceUtil;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* @Route("/map_search")
*/
class mapsearchController extends AbstractController
{
/**
* @Route ("/", name="map_search_index", methods={"GET"})
*/
public function index(
MapService $service
) {
return $this->render('pages/map_search/index.html.twig', [
"counts" => $service->getCount()
]);
}
/**
* @Route("/api", name="map_search_api", methods={"GET"})
*/
public function api(
Request $request,
MapService $service,
UrlGeneratorInterface $urlGenerator
): Response {
$err = [];
if(!$request->query->has('north')) $err[] = "north";
if(!$request->query->has('south')) $err[] = "south";
if(!$request->query->has('east')) $err[] = "east";
if(!$request->query->has('west')) $err[] = "west";
if(count($err)) return $this->invalid("Invalid parameter. ". implode(",", $err). " wasn't given.");
$north = floatval( $request->query->get('north'));
$south = floatval( $request->query->get('south'));
$east = floatval( $request->query->get('east'));
$west = floatval( $request->query->get('west'));
$err = [];
if(!$north) $err[] = "north";
if(!$south) $err[] = "south";
if(!$east) $err[] = "east";
if(!$west) $err[] = "west";
if(count($err)) return $this->invalid('Invalid parameter. '. implode(",", $err). " is not digits.");
$category = $request->query->has('category') ? $request->query->get('category'): "";
$entries = $service->getMarkers(
$north,
$south,
$east,
$west,
explode(",", $category)
);
$markerData = [];
foreach($entries as $entry) {
switch($entry->getCategory()) {
case TargetChoiceUtil::HOTEL:
$url = $urlGenerator->generate('facility_detail', ["id" => $entry->getId()]);
break;
case TargetChoiceUtil::WORKSPACE:
$url = $urlGenerator->generate('workspace_detail', ["id" => $entry->getId()]);
break;
case TargetChoiceUtil::ACTIVITY:
case TargetChoiceUtil::MOBILITY:
$url = $urlGenerator->generate('activity_detail', ["id" => $entry->getId()]);
break;
}
$geolocation = $entry->getGeolocation();
$markerData[] = [
"id" => $entry->getId(),
"category_id" => $entry->getCategory(),
"category" => TargetChoiceUtil::localeName($entry->getCategory(), $request->getLocale()),
"title" => $entry->titleLocale($request->getLocale()),
"link" => $url,
"lat" => $geolocation->getLat(),
"lng" => $geolocation->getLng()
];
}
$listHtml = $this->renderView("pages/map_search/_list.html.twig", [
"entries" => $entries
]);
return $this->json([
"status" => 200,
"marker" => $markerData,
"list" => $listHtml
]);
}
private function invalid(string $message): Response
{
return $this->json([
"status" => 400,
"message" => $message
]);
}
}