src/Controller/ApiController.php line 2124

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Async\AnswerNotificationMessage;
  4. use App\Entity\Answer;
  5. use App\Entity\AnswerContent;
  6. use App\Entity\BigList;
  7. use App\Entity\Comment;
  8. use App\Entity\Device;
  9. use App\Entity\Field;
  10. use App\Entity\Form;
  11. use App\Entity\Geolocation;
  12. use App\Entity\Like;
  13. use App\Entity\Log;
  14. use App\Entity\MapObject;
  15. use App\Entity\MapObjectType;
  16. use App\Entity\Media;
  17. use App\Entity\NotifParams;
  18. use App\Entity\Shape;
  19. use App\Entity\ShapeHasPoint;
  20. use App\Entity\User;
  21. use App\Entity\UserConnexion;
  22. use App\Entity\UserEntity;
  23. use App\Form\UserMobileType;
  24. use App\Repository\AnimalRepository;
  25. use App\Repository\AnswerContentRepository;
  26. use App\Repository\AnswerRepository;
  27. use App\Repository\BigListRepository;
  28. use App\Repository\CategoryRepository;
  29. use App\Repository\CityRepository;
  30. use App\Repository\CommentRepository;
  31. use App\Repository\DeviceRepository;
  32. use App\Repository\EntityRepository;
  33. use App\Repository\FieldRepository;
  34. use App\Repository\FieldTypeRepository;
  35. use App\Repository\FormRepository;
  36. use App\Repository\GeolocationRepository;
  37. use App\Repository\LikeRepository;
  38. use App\Repository\LineRepository;
  39. use App\Repository\LogRepository;
  40. use App\Repository\MapObjectRepository;
  41. use App\Repository\MapObjectTypeRepository;
  42. use App\Repository\MediaRepository;
  43. use App\Repository\NotifParamsRepository;
  44. use App\Repository\SavedNotificationRepository;
  45. use App\Repository\ProfileRepository;
  46. use App\Repository\ShapeHasPointRepository;
  47. use App\Repository\ShapeRepository;
  48. use App\Repository\StatutAnswerRepository;
  49. use App\Repository\TerritoryRepository;
  50. use App\Repository\UserConnexionRepository;
  51. use App\Repository\UserEntityRepository;
  52. use App\Repository\UserRepository;
  53. use App\Serialization\BigListSerialization;
  54. use App\Serialization\CategorySerialization;
  55. use App\Serialization\CommentSerialization;
  56. use App\Serialization\FieldSerialization;
  57. use App\Serialization\AnswerSerialization;
  58. use App\Serialization\FormSerialization;
  59. use App\Serialization\LineSerialization;
  60. use App\Serialization\MapObjectTypeSerialization;
  61. use App\Serialization\MediaSerialization;
  62. use App\Serialization\NotifParamsSerialization;
  63. use App\Serialization\SavedNotificationSerialization;
  64. use App\Serialization\UserSerialization;
  65. use App\Service\Fdc27Fence;
  66. use App\Service\Fdc55Fence;
  67. use App\Service\Fdc77Agrainage;
  68. use App\Service\Fdc77Fence;
  69. use App\Service\FileUploader;
  70. use App\Service\Geocoder;
  71. use App\Service\MailerService;
  72. use App\Service\NotificationService;
  73. use App\Service\UserRoleChecker;
  74. use Doctrine\ORM\EntityManagerInterface;
  75. use Dompdf\Dompdf;
  76. use Elastica\Query;
  77. use Elastica\Query\BoolQuery;
  78. use Elastica\Query\Range;
  79. use Exception;
  80. use FOS\ElasticaBundle\Finder\TransformedFinder;
  81. use FOS\ElasticaBundle\Persister\ObjectPersister;
  82. use FOS\RestBundle\Controller\Annotations as Rest;
  83. use Imagick;
  84. use Kreait\Firebase\Exception\FirebaseException;
  85. use Kreait\Firebase\Exception\MessagingException;
  86. use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
  87. use Psr\Container\ContainerExceptionInterface;
  88. use Psr\Container\NotFoundExceptionInterface;
  89. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  90. use Symfony\Component\HttpFoundation\JsonResponse;
  91. use Symfony\Component\HttpFoundation\Request;
  92. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  93. use Symfony\Component\Messenger\MessageBusInterface;
  94. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  95. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  96. use Symfony\Component\HttpFoundation\Session\Session;
  97. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  98. /**
  99.  * ApiController.
  100.  */
  101. class ApiController extends AbstractController
  102. {
  103.     /**
  104.      * @var false|string
  105.      */
  106.     private $role;
  107.     public function __construct(UserRoleChecker            $roleChecker,
  108.                                 private readonly Encryptor $encryptor,
  109.                                 public TransformedFinder   $answersFinder, public TransformedFinder $map_objectsFinder,
  110.                                 public TransformedFinder   $territoriesFinder,
  111.                                 public ObjectPersister     $answersPersister, public ObjectPersister $map_objectsPersister)
  112.     {
  113.         $this->role $roleChecker->getRole();
  114.     }
  115.     #[Rest\Get('/api-login')]
  116.     public function login(Request                     $requestUserRepository $userRepository,
  117.                           UserPasswordHasherInterface $passwordEncoder,
  118.                           UserConnexionRepository     $userConnexionRepositoryDeviceRepository $deviceRepository): JsonResponse
  119.     {
  120.         $params = ['email' => urldecode($request->query->get('email'''))];
  121.         $user $userRepository->findOneBy($params);
  122.         if (!$user)
  123.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  124.         //get password validation
  125.         $password $passwordEncoder->isPasswordValid($user$request->query->get('password'''));
  126.         if ($user && $password) {
  127.             $token = new UsernamePasswordToken($user"main"$user->getRoles());
  128.             $this->container->get('security.token_storage')->setToken($token);
  129.             $session $this->container->get('request_stack')->getSession();
  130.             if (!$session->isStarted()) {
  131.                 $session = new Session();
  132.                 $session->start();
  133.             }
  134.             $identifier $request->query->get('identifier'null);
  135.             $name $request->query->get('name''');
  136.             $userConnexion = new UserConnexion();
  137.             $userConnexion->setUser($this->getUser());
  138.             $userConnexion->setPlatform($name);
  139.             $userConnexionRepository->add($userConnexionfalse);
  140.             //Check Device
  141.             if ($user->getDevice() == null && $identifier != null) {
  142.                 //Add Device
  143.                 $device = new Device();
  144.                 $device->setName($name);
  145.                 $device->setIdentifier($identifier);
  146.                 $user->setDevice($device);
  147.                 $deviceRepository->add($devicetrue);
  148.             } elseif ($identifier != null && $identifier != $user->getDevice()->getIdentifier()) {
  149.                 //Update Device
  150.                 $device $user->getDevice();
  151.                 $device->setName($name);
  152.                 $device->setIdentifier($identifier);
  153.                 $deviceRepository->add($devicetrue);
  154.             }
  155.             return new JsonResponse(
  156.                 json_encode(['user' => UserSerialization::serializeUserForLogin($user$session)], JSON_THROW_ON_ERROR), 200, [], true);
  157.         } else {
  158.             return new JsonResponse(json_encode('error'), 400, [], true);
  159.         }
  160.     }
  161.     #[Rest\Post('/api-register')]
  162.     public function register(Request       $requestUserPasswordHasherInterface $userPasswordHasherUserRepository $userRepository,
  163.                              MailerService $mailerService): JsonResponse
  164.     {
  165.         $user = new User();
  166.         $params $request->request->all();
  167.         //add Birthdate as object & remove it from parameters
  168.         $params['birthDate'] = explode("/", (string)$params['birthDate']);
  169.         $params["birthDate"] = $params["birthDate"][1] . "/" $params["birthDate"][0] . "/" $params["birthDate"][2];
  170.         $user->setBirthDate(new \DateTime($params['birthDate']));
  171.         unset($params['birthDate']);
  172.         $form $this->createForm(UserMobileType::class, $user);
  173.         $params['isAccept'] = 0;
  174.         $params['isActivated'] = 1;
  175.         $form->submit($paramsfalse);
  176.         if ($form->isSubmitted() && $form->isValid()) {
  177.             // Password
  178.             $user->setPassword(
  179.                 $userPasswordHasher->hashPassword(
  180.                     $user,
  181.                     $form->getData()->getPassword()
  182.                 )
  183.             );
  184.             $userRepository->add($usertrue);
  185.             $userRepository->refresh($user);
  186.             foreach ($user->getUserEntities() as $entityUser) {
  187.                 $mailerService->newUserApproval($entityUser->getAdmins(), $user$entityUser);
  188.             }
  189.             //login registered User
  190.             $token = new UsernamePasswordToken($user"main"$user->getRoles());
  191.             $this->container->get('security.token_storage')->setToken($token);
  192.             $session $this->container->get('request_stack')->getSession();
  193.             if (!$session->isStarted()) {
  194.                 $session = new Session();
  195.                 $session->start();
  196.             }
  197.             return new JsonResponse(
  198.                 json_encode(['user' => UserSerialization::serializeUserForLogin($user$session)], JSON_THROW_ON_ERROR), 200, [], true);
  199.         } else {
  200.             $errors = [];
  201.             foreach ($form->getErrors(true) as $error) {
  202.                 $errors[] = $error->getMessage();
  203.             }
  204.             return new JsonResponse(json_encode($errorsJSON_THROW_ON_ERROR), 400, [], true);
  205.         }
  206.     }
  207.     #[Rest\Post('/api-edit-user')]
  208.     public function editUser(Request        $requestUserPasswordHasherInterface $userPasswordHasher,
  209.                              UserRepository $userRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  210.     {
  211.         $user $this->getUser();
  212.         if (!$user) {
  213.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  214.         }
  215.         $params $request->request->all();
  216.         //add Birthdate as object & remove it from parameters
  217.         if (array_key_exists('birthDate'$params)) {
  218.             if ($params['birthDate'] !== "") {
  219.                 $params['birthDate'] = explode("/", (string)$params['birthDate']);
  220.                 $params["birthDate"] = $params["birthDate"][1] . "/" $params["birthDate"][0] . "/" $params["birthDate"][2];
  221.                 $user->setBirthDate(new \DateTime($params['birthDate']));
  222.                 unset($params['birthDate']);
  223.             }
  224.         }
  225.         $form $this->createForm(UserMobileType::class, $user);
  226.         $form->submit($paramsfalse);
  227.         if ($form->isSubmitted() && $form->isValid()) {
  228.             if ($request->request->get('password''') != '') {
  229.                 $user->setPassword(
  230.                     $userPasswordHasher->hashPassword(
  231.                         $user,
  232.                         $form->getData()->getPassword()
  233.                     )
  234.                 );
  235.             }
  236.             $userRepository->add($usertrue);
  237.             // Update Elasticsearch
  238.             if (!$user->getAnswers()->isEmpty()) {
  239.                 $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  240.                 $mapObjects $mapObjectRepository->findByUser($user);
  241.                 if (!empty($mapObjects)) {
  242.                     $this->map_objectsPersister->replaceMany($mapObjects);
  243.                 }
  244.             }
  245.             return new JsonResponse(
  246.                 json_encode(['user' => UserSerialization::serializeUserForLogin($user)], JSON_THROW_ON_ERROR), 200, [], true);
  247.         } else {
  248.             return new JsonResponse(json_encode('Bad Request'), 400, [], true);
  249.         }
  250.     }
  251.     #[Rest\Post('/api-edit-user-picture')]
  252.     public function updateProfilePicture(Request $requestUserRepository $userRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  253.     {
  254.         $user $this->getUser();
  255.         if (!$user) {
  256.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  257.         }
  258.         $filesBag $request->files->all()[0];
  259.         if (!is_null($filesBag)) {
  260.             $fileName $filesBag->getClientOriginalName();
  261.             $fileName md5(uniqid()) . '_' $fileName;
  262.             $filesBag->move($this->getParameter('upload__publication_file_directory'), $fileName);
  263.             $user->setPicture($fileName);
  264.         }
  265.         $userRepository->add($usertrue);
  266.         // Update Elasticsearch
  267.         if (!$user->getAnswers()->isEmpty()) {
  268.             $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  269.             $mapObjects $mapObjectRepository->findByUser($user);
  270.             if (!empty($mapObjects)) {
  271.                 $this->map_objectsPersister->replaceMany($mapObjects);
  272.             }
  273.         }
  274.         return new JsonResponse(
  275.             json_encode(['picture' => $user->getPicture()], JSON_THROW_ON_ERROR), 200, [], true);
  276.     }
  277.     #[Rest\Get('/api-send-sms')]
  278.     public function sendSMS(UserRepository $userRepository): JsonResponse
  279.     {
  280.         if (!$this->getUser())
  281.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  282.         $user $this->getUser();
  283.         $user->setSmsToken("000000");
  284.         $userRepository->add($usertrue);
  285.         $sms = ['code' => $this->getUser()->getSmsToken()];
  286.         return new JsonResponse(json_encode("sended"), 200, [], true);
  287.     }
  288.     #[Rest\Post('/api-check-sms')]
  289.     public function checkSMS(Request $requestUserRepository $userRepository): JsonResponse
  290.     {
  291.         $checkCode $request->request->get("code");
  292.         $user $this->getUser();
  293.         if (!$user) {
  294.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  295.         }
  296.         if ($checkCode == $user->getSmsToken()) {
  297.             $user->setIsActivated(true);
  298.             $userRepository->add($usertrue);
  299.             return new JsonResponse(json_encode('granted'), 200, [], true);
  300.         } else {
  301.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  302.         }
  303.     }
  304.     #[Rest\Post('/api-edit-user-entities')]
  305.     public function editUserEntities(Request              $requestEntityRepository $entityRepository,
  306.                                      MailerService        $mailerServiceNotificationService $notificationService,
  307.                                      UserEntityRepository $userEntityRepositoryUserRepository $userRepository,
  308.                                      MapObjectRepository  $mapObjectRepository): JsonResponse
  309.     {
  310.         $user $this->getUser();
  311.         if (!$user) {
  312.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  313.         }
  314.         $entities $request->request->all("entities");
  315.         $oldEntities = [];
  316.         $newEntities = [];
  317.         foreach ($user->getUserEntities() as $userEntity) {
  318.             if (!in_array($userEntity->getEntity()->getId(), $entities)) {
  319.                 $user->removeUserEntity($userEntity);
  320.             }
  321.             $oldEntities[] = $userEntity->getEntity()->getId();
  322.         }
  323.         foreach ($entities as $entity) {
  324.             if (!in_array($entity$oldEntities)) {
  325.                 $newEntities[] = $entity;
  326.             }
  327.         }
  328.         foreach ($newEntities as $newEntity) {
  329.             $entity $entityRepository->findOneById((int)$newEntity);
  330.             if ($entity) {
  331.                 $userEntity = new UserEntity();
  332.                 $userEntity->setEntity($entity);
  333.                 $userEntity->setIsAccepted(false);
  334.                 $userEntity->setUser($user);
  335.                 $userEntityRepository->add($userEntityfalse);
  336.                 $mailerService->newUserApproval($entity->getAdmins(), $user$entity);
  337.             }
  338.         }
  339.         $userRepository->add($usertrue);
  340.         // Update Elasticsearch
  341.         if (!$user->getAnswers()->isEmpty()) {
  342.             $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  343.             $mapObjects $mapObjectRepository->findByUser($user);
  344.             if (!empty($mapObjects)) {
  345.                 $this->map_objectsPersister->replaceMany($mapObjects);
  346.             }
  347.         }
  348.         return new JsonResponse(json_encode(['user' => UserSerialization::serializeUserForLogin($user)], JSON_THROW_ON_ERROR), 200, [], true);
  349.     }
  350.     #[Rest\Post('/api-post-user-entities')]
  351.     public function postUserEntities(Request              $requestEntityRepository $entityRepositoryMailerService $mailerService,
  352.                                      NotificationService  $notificationService,
  353.                                      UserEntityRepository $userEntityRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  354.     {
  355.         $user $this->getUser();
  356.         if (!$user) {
  357.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  358.         }
  359.         $entities $request->request->all("entities");
  360.         $oldEntities $userEntityRepository->findBy(['user' => $user]);
  361.         foreach ($oldEntities as $oldEntity) {
  362.             $userEntityRepository->remove($oldEntitytrue);
  363.         }
  364.         foreach ($entities as $entity) {
  365.             $entity $entityRepository->findOneById((int)$entity);
  366.             if ($entity) {
  367.                 $userEntity = new UserEntity();
  368.                 $userEntity->setEntity($entity);
  369.                 $userEntity->setIsAccepted(false);
  370.                 $userEntity->setUser($user);
  371.                 $userEntityRepository->add($userEntitytrue);
  372.                 $mailerService->newUserApproval($entity->getAdmins(), $user$entity);
  373.             };
  374.         }
  375.         // Update Elasticsearch
  376.         if (!$user->getAnswers()->isEmpty()) {
  377.             $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  378.             $mapObjects $mapObjectRepository->findByUser($user);
  379.             if (!empty($mapObjects)) {
  380.                 $this->map_objectsPersister->replaceMany($mapObjects);
  381.             }
  382.         }
  383.         return new JsonResponse(json_encode(['user' => UserSerialization::serializeUserForLogin($user)], JSON_THROW_ON_ERROR), 200, [], true);
  384.     }
  385.     #[Rest\Post('/api-post-user-profiles')]
  386.     public function postUserProfiles(Request        $requestProfileRepository $profileRepository,
  387.                                      UserRepository $userRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  388.     {
  389.         $user $this->getUser();
  390.         if (!$user) {
  391.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  392.         }
  393.         $profiles $request->request->all("profiles");
  394.         $oldProfilesTemp $user->getProfiles();
  395.         $oldProfiles = [];
  396.         // if profiles updates, delete old profiles
  397.         foreach ($oldProfilesTemp as $profile) {
  398.             $oldProfiles[] = $profile->getId();
  399.             $user->removeProfile($profile);
  400.         }
  401.         $addProfile true;
  402.         if ($oldProfiles) {
  403.             $addProfile false;
  404.             foreach ($profiles as $newProfile) {
  405.                 if (!in_array($newProfile$oldProfiles)) {
  406.                     $addProfile true;
  407.                 }
  408.             }
  409.         }
  410.         if ($addProfile) {
  411.             foreach ($user->getUserEntities() as $userEntity) {
  412.                 $userEntity->setIsAccepted(false);
  413.             }
  414.         }
  415.         foreach ($profiles as $profile) {
  416.             $profile $profileRepository->findOneById((int)$profile);
  417.             if ($profile)
  418.                 $user->addProfile($profile);
  419.         }
  420.         $userRepository->add($usertrue);
  421.         // Update Elasticsearch
  422.         if (!$user->getAnswers()->isEmpty()) {
  423.             $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  424.             $mapObjects $mapObjectRepository->findByUser($user);
  425.             if (!empty($mapObjects)) {
  426.                 $this->map_objectsPersister->replaceMany($mapObjects);
  427.             }
  428.         }
  429.         return new JsonResponse(json_encode(['user' => UserSerialization::serializeUserForLogin($user)], JSON_THROW_ON_ERROR), 200, [], true);
  430.     }
  431.     #[Rest\Post('/api-testfile')]
  432.     public function testFile(Request $request): JsonResponse
  433.     {
  434.         $filesResult = [];
  435.         $filesBag $request->files->all();
  436.         foreach ($filesBag as $file) {
  437.             $filename $file->getClientOriginalName();
  438.             $filesResult [] = $file->getPathname();
  439.             $file->move($this->getParameter('upload_file_directory'), $filename);
  440.         }
  441.         return new JsonResponse(json_encode($filesResultJSON_THROW_ON_ERROR));
  442.     }
  443.     private function exportData($filename): array
  444.     {
  445.         $result = [];
  446.         if (($h fopen("{$filename}""r")) !== FALSE) {
  447.             while (($data fgetcsv($h0","'"')) !== FALSE) {
  448.                 $result[] = $data;
  449.             }
  450.             fclose($h);
  451.         }
  452.         unset($result[0]);
  453.         return $result;
  454.     }
  455.     #[Rest\Post('/api-post-form')]
  456.     public function postFormAction(Request                 $requestProfileRepository $profileRepository,
  457.                                    AnimalRepository        $animalRepositoryFieldTypeRepository $fieldTypeRepository,
  458.                                    EntityRepository        $entityRepositoryCategoryRepository $categoryRepository,
  459.                                    FieldRepository         $fieldRepositoryFormRepository $formRepository,
  460.                                    MapObjectTypeRepository $mapObjectTypeRepositoryBigListRepository $bigListRepository): JsonResponse
  461.     {
  462.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  463.         $form = new Form();
  464.         if ($this->role === "ROLE_ADMIN") {
  465.             $selectedEntity $this->getUser()->getSelectedEntity()->getId();
  466.             $entity $entityRepository->findOneBy(['id' => $selectedEntity]);
  467.             $form->setEntity($entity);
  468.         }
  469.         $form->setTitle($data['title']);
  470.         if ($data["publicationDate"]) {
  471.             $dateArray explode('/', (string)$data['publicationDate']);
  472.             $date $dateArray[0] . '-' $dateArray[1] . '-' $dateArray[2];
  473.             $form->setPublicationDate(new \DateTime($date));
  474.         }
  475.         if($data["publicationEnd"]) {
  476.             $dateArray explode('/', (string)$data['publicationEnd']);
  477.             $dateEnd $dateArray[0] . '-' $dateArray[1] . '-' $dateArray[2];
  478.             $form->setPublicationEnd(new \DateTime($dateEnd));
  479.         }
  480.         $form->setIsActive($data['isActive']);
  481.         if (array_key_exists("isShape"$data)) {
  482.             $form->setIsShape($data['isShape']);
  483.         }
  484.         if(array_key_exists("isLine"$data)){
  485.             $form->setIsPolyline($data['isLine']);
  486.         }
  487.         if (array_key_exists("isGeolocated"$data))
  488.             $form->setIsGeolocated($data['isGeolocated']);
  489.         if (array_key_exists("gotMedia"$data)) {
  490.             $form->setGotMedia($data['gotMedia']);
  491.             if (array_key_exists("mediaExplanation"$data)) {
  492.                 $form->setMediaExplanation($data['mediaExplanation']);
  493.             }
  494.         }
  495.         $form->setIsPublic($data['isPublic']);
  496.         $form->setIsSigned($data['isSigned']);
  497.         $form->setDescription($data['description']);
  498.         $form->setIsBooking($data['isBooking']);
  499.         $form->setBookingSpace($data['bookingSpace']);
  500.         if (array_key_exists("bookingNumber"$data)) {
  501.             $form->setNumberBooking($data['bookingNumber']);
  502.         }
  503.         if (array_key_exists("bookingDate"$data)) {
  504.             if ($data['bookingDate']) {
  505.                 $dateArray explode('/', (string)$data['bookingDate']);
  506.                 $date $dateArray[0] . '-' $dateArray[1] . '-' $dateArray[2];
  507.                 $form->setBookingDate(new \DateTime($date));
  508.             }
  509.         }
  510.         foreach ($data['profiles'] as $profile) {
  511.             $profile $profileRepository->findOneById($profile);
  512.             $form->addProfile($profile);
  513.         }
  514.         $category $categoryRepository->findOneById($data['category']);
  515.         $form->setCategory($category);
  516.         $form->setIsAnimal($data['isAnimal']);
  517.         if ($data['animal'])
  518.             $form->setAnimal($animalRepository->findOneById($data['animal']));
  519.         //Add fiel for booking
  520.         if ($data["isBooking"] === true) {
  521.             if ($data['bookingNameDisplay']) {
  522.                 $form->setBookingNameDisplay(true);
  523.             }
  524.             $fieldType $fieldTypeRepository->findOneBy(['name' => 'select']);
  525.             $fieldBooking = new Field();
  526.             $fieldBooking->setFieldType($fieldType);
  527.             $fieldBooking->setTitle("Nombre de places");
  528.             $fieldBooking->setIsRequired(true);
  529.             $fieldBooking->setIsBooking(true);
  530.             $fieldRepository->add($fieldBookingfalse);
  531.             $form->addField($fieldBooking);
  532.             $fieldType $fieldTypeRepository->findOneBy(['name' => 'userBooking']);
  533.             $fieldUserBooking = new Field();
  534.             $fieldUserBooking->setFieldType($fieldType);
  535.             $fieldUserBooking->setTitle("Users");
  536.             $fieldUserBooking->setIsRequired(true);
  537.             $fieldUserBooking->setIsBooking(false);
  538.             $fieldRepository->add($fieldUserBookingfalse);
  539.             $form->addField($fieldUserBooking);
  540.         }
  541.         if (array_key_exists('isObject'$data)) {
  542.             $form->setIsLinkedToObject($data['isObject']);
  543.             if ($form->getIsLinkedToObject()) {
  544.                 $form->setMapObjectType($mapObjectTypeRepository->findOneBy(['id' => $data['objectTypeSelected']]));
  545.             }
  546.         }
  547.         //Add fields
  548.         foreach ($data['arrayField'] as $receivedField) {
  549.             $field = new Field();
  550.             $field->setTitle($receivedField['fieldTitle']);
  551.             $field->setIsRequired($receivedField['fieldRequired']);
  552.             $field->setFieldType($fieldTypeRepository->findOneByName($receivedField['fieldType']));
  553.             if ($receivedField['fieldAnimal']) {
  554.                 $field->setAnimal($animalRepository->findOneById($receivedField['fieldAnimal']));
  555.             }
  556.             if ($field->getFieldType()->getName() == 'bigList' || $field->getFieldType()->getName() == 'bigListMultiple') {
  557.                 $field->setBigList($bigListRepository->findOneBy(['id' => $receivedField['fieldBigList']]));
  558.             }
  559.             if ($field->getFieldType()->getName() == "animals" || $field->getFieldType()->getName() == "animal") {
  560.                 if ($receivedField['fieldAnimals'])
  561.                     if (!empty($receivedField['fieldAnimals'])) {
  562.                         $options = [];
  563.                         foreach ($receivedField['fieldAnimals'] as $animal) {
  564.                             $options[] = $animal;
  565.                         }
  566.                         $field->setOptions($options);
  567.                     }
  568.             } else {
  569.                 if ($receivedField['fieldOptions'])
  570.                     if (!empty($receivedField['fieldOptions'])) {
  571.                         $options = [];
  572.                         if ($receivedField['fieldOptions'][0]['option'] != "")
  573.                             foreach ($receivedField['fieldOptions'] as $option) {
  574.                                 $options[] = $option['option'];
  575.                             }
  576.                         $field->setOptions($options);
  577.                     }
  578.             }
  579.             if ($field->getFieldType()->getName() == 'surface') {
  580.                 $field->setUnit($receivedField['fieldUnit']);
  581.             }
  582.             $field->setForm($form);
  583.             $fieldRepository->add($fieldfalse);
  584.             $form->addField($field);
  585.         }
  586.         $formRepository->add($formtrue);
  587.         return new JsonResponse(json_encode($form->getId(), JSON_THROW_ON_ERROR));
  588.     }
  589.     #[Rest\Post('/api-post-media-description-form')]
  590.     public function postDescriptionMediaAction(Request         $requestFormRepository $formRepository,
  591.                                                MediaRepository $mediaRepositoryFileUploader $fileUploader): JsonResponse
  592.     {
  593.         $form $formRepository->findOneBy(['id' => $request->request->get('form'null)]);
  594.         //PDF
  595.         $pdf $request->files->get("pdf");
  596.         //TODO: USE FILEUPLOADER
  597.         if ($pdf) {
  598.             $path $this->getParameter('upload__form_pdf_directory');
  599.             $filename $fileUploader->upload($pdf$path);
  600.             $media = new Media();
  601.             $media->setFilename($filename);
  602.             $media->setMimeType($pdf->getClientMimeType());
  603.             $media->setPath($path "/" $filename);
  604.             $media->setFormPdf($form);
  605.             $mediaRepository->add($mediafalse);
  606.             $request->files->remove('pdf');
  607.         }
  608.         //Old pdf in case of duplication
  609.         $oldPdf $request->request->get("oldPdf"null);
  610.         if ($oldPdf) {
  611.             $oldPdf $mediaRepository->findOneBy(['id' => $oldPdf]);
  612.             $newPdf = new Media();
  613.             $filename $oldPdf->getFilename();
  614.             $filename md5(uniqid()) . '_' $filename;
  615.             $newPdf->setFilename($filename);
  616.             $newPdf->setMimeType($oldPdf->getMimeType());
  617.             copy($this->getParameter('upload__form_pdf_directory') . "/" $oldPdf->getFilename(), $this->getParameter('upload__form_pdf_directory') . "/" $filename);
  618.             $newPdf->setPath($this->getParameter('upload__form_pdf_directory') . "/" $filename);
  619.             $newPdf->setFormPdf($form);
  620.             $mediaRepository->add($newPdffalse);
  621.         }
  622.         //Pictures
  623.         $filesBag $request->files->all();
  624.         foreach ($filesBag as $file) {
  625.             $path $this->getParameter('upload__form_pictures_directory');
  626.             $filename $fileUploader->upload($file$path);
  627.             $media = new Media();
  628.             $media->setFilename($filename);
  629.             $media->setMimeType($file->getClientMimeType());
  630.             $media->setPath($path "/" $filename);
  631.             $mediaRepository->add($mediafalse);
  632.             $form->addPicture($media);
  633.         }
  634.         //Old pictures in case of duplication
  635.         foreach ($request->request->all("oldPictures") as $oldPicture) {
  636.             $oldPicture $mediaRepository->findOneBy(['id' => $oldPicture]);
  637.             $newPicture = new Media();
  638.             $filename $oldPicture->getFilename();
  639.             $filename md5(uniqid()) . '_' $filename;
  640.             $newPicture->setFilename($filename);
  641.             $newPicture->setMimeType($oldPicture->getMimeType());
  642.             copy($this->getParameter('upload__form_pictures_directory') . "/" $oldPicture->getFilename(), $this->getParameter('upload__form_pictures_directory') . "/" $filename);
  643.             $newPicture->setPath($this->getParameter('upload__form_pictures_directory') . "/" $filename);
  644.             $mediaRepository->add($newPicturefalse);
  645.             $form->addPicture($newPicture);
  646.         }
  647.         $formRepository->add($formtrue);
  648.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR));
  649.     }
  650.     #[Rest\Post('/api-delete-post-media-description-form')]
  651.     public function postDeleteDescriptionMediaAction(Request $requestFormRepository $formRepositoryMediaRepository $mediaRepository): JsonResponse
  652.     {
  653.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  654.         $form $formRepository->findOneBy(['id' => $data['form']]);
  655.         //PDF
  656.         if (array_key_exists("pdf"$data)) {
  657.             if ($data['pdf']) {
  658.                 $pdf $form->getPdf();
  659.                 unlink($this->getParameter('upload__form_pdf_directory') . "/" $pdf->getFilename());
  660.                 $mediaRepository->remove($pdftrue);
  661.             }
  662.         }
  663.         if (array_key_exists("pictures"$data)) {
  664.             $pictures $data["pictures"];
  665.             foreach ($pictures as $picture) {
  666.                 $picture $mediaRepository->findOneBy(['id' => $picture]);
  667.                 unlink($this->getParameter('upload__form_pictures_directory') . "/" $picture->getFilename());
  668.                 $mediaRepository->remove($picturetrue);
  669.             }
  670.         }
  671.         $formRepository->add($formtrue);
  672.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR));
  673.     }
  674.     #[Rest\Post('/api-edit-form')]
  675.     public function postEditFormAction(Request            $requestProfileRepository $profileRepository,
  676.                                        AnimalRepository   $animalRepositoryFieldTypeRepository $fieldTypeRepository,
  677.                                        FormRepository     $formRepositoryFieldRepository $fieldRepository,
  678.                                        CategoryRepository $categoryRepositoryMapObjectTypeRepository $mapObjectTypeRepository,
  679.                                        BigListRepository  $bigListRepository): JsonResponse
  680.     {
  681.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  682.         $form $formRepository->findOneById($data['form']);
  683.         if ($form) {
  684.             $form->setTitle($data['title']);
  685.             if ($data["publicationDate"]) {
  686.                 $dateArray explode('/', (string)$data['publicationDate']);
  687.                 $date $dateArray[0] . '-' $dateArray[1] . '-' $dateArray[2];
  688.                 $form->setPublicationDate(new \DateTime($date));
  689.             }
  690.             if ($data["publicationEnd"]){
  691.                 $dateArray explode('/', (string)$data['publicationEnd']);
  692.                 $dateEnd $dateArray[0] . '-' $dateArray[1] . '-' $dateArray[2];
  693.                 $form->setPublicationEnd(new \DateTime($dateEnd));
  694.             }else{
  695.                 $form->setPublicationEnd(null);
  696.             }
  697.             $form->setIsActive($data['isActive']);
  698.             $form->setDescription($data['description']);
  699.             $form->removeAllProfiles();
  700.             foreach ($data['profiles'] as $profile) {
  701.                 $profile $profileRepository->findOneById($profile);
  702.                 $form->addProfile($profile);
  703.             }
  704.             $category $categoryRepository->findOneById($data['category']);
  705.             $form->setCategory($category);
  706.             $form->setIsAnimal($data['isAnimal']);
  707.             if ($data['animal']) {
  708.                 $form->setAnimal($animalRepository->findOneById($data['animal']));
  709.             }
  710.             $form->setBookingNameDisplay($data['bookingNameDisplay']);
  711.             $form->setIsShape($data['isShape']);
  712.             if (array_key_exists("gotMedia"$data)) {
  713.                 $form->setGotMedia($data['gotMedia']);
  714.                 if (array_key_exists("mediaExplanation"$data)) {
  715.                     $form->setMediaExplanation($data['mediaExplanation']);
  716.                 }
  717.             }
  718.             $form->setIsGeolocated($data['isGeolocated']);
  719.             $form->setIsPublic($data['isPublic']);
  720.             $form->setIsSigned($data['isSigned']);
  721.             $form->setIsBooking($data['isBooking']);
  722.             $form->setBookingSpace($data['bookingSpace']);
  723.             if (array_key_exists("bookingNumber"$data)) {
  724.                 $form->setNumberBooking($data['bookingNumber']);
  725.             }
  726.             if (array_key_exists("bookingDate"$data)) {
  727.                 if ($data['bookingDate']) {
  728.                     $dateArray explode('/', (string)$data['bookingDate']);
  729.                     $date $dateArray[0] . '-' $dateArray[1] . '-' $dateArray[2];
  730.                     $form->setBookingDate(new \DateTime($date));
  731.                 }
  732.             }
  733.             foreach ($data['arrayField'] as $receivedField) {
  734.                 if (array_key_exists('id'$receivedField)) {
  735.                     $field $fieldRepository->findOneById($receivedField['id']);
  736.                 } else {
  737.                     $field = new Field();
  738.                 }
  739.                 $field->setOptions([]);
  740.                 $field->setTitle($receivedField['fieldTitle']);
  741.                 $field->setIsRequired($receivedField['fieldRequired']);
  742.                 $field->setFieldType($fieldTypeRepository->findOneByName($receivedField['fieldType']));
  743.                 if ($field->getFieldType()->getName() == 'bigList' || $field->getFieldType()->getName() == 'bigListMultiple') {
  744.                     $field->setBigList($bigListRepository->findOneBy(['id' => $receivedField['fieldBigList']]));
  745.                 }
  746.                 if ($receivedField['fieldAnimal']) {
  747.                     $field->setAnimal($animalRepository->findOneById($receivedField['fieldAnimal']));
  748.                 }
  749.                 if ($field->getFieldType()->getName() == "animals" || $field->getFieldType()->getName() == "animal") {
  750.                     if ($receivedField['fieldAnimals'])
  751.                         if (!empty($receivedField['fieldAnimals'])) {
  752.                             $options = [];
  753.                             foreach ($receivedField['fieldAnimals'] as $animal) {
  754.                                 $options[] = $animal;
  755.                             }
  756.                             $field->setOptions($options);
  757.                         }
  758.                 } else {
  759.                     if ($receivedField['fieldOptions'])
  760.                         if (!empty($receivedField['fieldOptions'])) {
  761.                             $options = [];
  762.                             if ($receivedField['fieldOptions'][0]['option'] != "")
  763.                                 foreach ($receivedField['fieldOptions'] as $option) {
  764.                                     $options[] = $option['option'];
  765.                                 }
  766.                             $field->setOptions($options);
  767.                         }
  768.                 }
  769.                 if ($field->getFieldType()->getName() == 'surface') {
  770.                     $field->setUnit($receivedField['fieldUnit']);
  771.                 }
  772.                 $fieldRepository->add($fieldfalse);
  773.                 if (!array_key_exists('id'$receivedField)) {
  774.                     $form->addField($field);
  775.                 }
  776.             }
  777.             if (array_key_exists('isObject'$data)) {
  778.                 $form->setIsLinkedToObject($data['isObject']);
  779.                 if ($form->getIsLinkedToObject()) {
  780.                     $form->setMapObjectType($mapObjectTypeRepository->findOneBy(['id' => $data['objectTypeSelected']]));
  781.                 }
  782.             }
  783.         }
  784.         $formRepository->add($formtrue);
  785.         // Update Elasticsearch
  786.         if (!$form->getAnswers()->isEmpty()) {
  787.             $this->answersPersister->replaceMany($form->getAnswers()->getValues());
  788.             if ($form->getMapObjectType())
  789.                 if (!empty($form->getMapObjectType()->getMapObjects()->getValues()))
  790.                     $this->map_objectsPersister->replaceMany($form->getMapObjectType()->getMapObjects()->getValues());
  791.         }
  792.         return new JsonResponse(json_encode($form->getId(), JSON_THROW_ON_ERROR));
  793.     }
  794.     #[Rest\Get('/api-get-form')]
  795.     public function getFormAction(Request $requestFormRepository $formRepositoryAnimalRepository $animalRepository): JsonResponse
  796.     {
  797.         $form $formRepository->findOneById($request->query->get('form'));
  798.         $profiles = [];
  799.         foreach ($form->getProfiles() as $profile) {
  800.             $profiles [] = $profile->getId();
  801.         }
  802.         $return = [
  803.             'title' => $form->getTitle(),
  804.             'isActive' => $form->getIsActive(),
  805.             'description' => $form->getDescription(),
  806.             'isAnimal' => $form->getIsAnimal(),
  807.             'isGeolocated' => $form->getIsGeolocated(),
  808.             'isShape' => $form->getIsShape(),
  809.             'isPolyline' => $form->getIsPolyline(),
  810.             'mediaDescription' => $form->getMediaExplanation(),
  811.             'gotMedia' => $form->getGotMedia(),
  812.             'isPublic' => $form->getIsPublic(),
  813.             'isSigned' => $form->getIsSigned(),
  814.             'animal' => $form->getAnimal() ? $form->getAnimal()->getId() : "",
  815.             'publicationDate' => $form->getPublicationDate()->format("d/m/Y"),
  816.             'publicationEnd' => $form->getPublicationEnd() ? $form->getPublicationEnd()->format("d/m/Y") : null,
  817.             'profiles' => $profiles,
  818.             'category' => $form->getCategory() ? $form->getCategory()->getId() : null,
  819.             'arrayField' => FieldSerialization::serializeWebFields($form->getFields(), $animalRepository),
  820.             'isBooking' => $form->getIsBooking(),
  821.             'bookingNumber' => $form->getNumberBooking(),
  822.             'bookingDate' => $form->getBookingDate() ? $form->getBookingDate()->format("d/m/Y") : "",
  823.             'pdf' => $form->getPdf() ? MediaSerialization::serializeMedia($form->getPdf()) : null,
  824.             'pictures' => !$form->getPictures()->isEmpty() ? MediaSerialization::serializeMedias($form->getPictures()) : [],
  825.             'bookingNameDisplay' => $form->getBookingNameDisplay(),
  826.             'anyAnswers' => is_countable($form->getAnswers()) ? count($form->getAnswers()) : 0,
  827.             'bookingSpace' => $form->getBookingSpace(),
  828.             'isLinkedToObject' => $form->getIsLinkedToObject(),
  829.             'objectTypeSelected' => $form->getMapObjectType()?->getId()
  830.         ];
  831.         return new JsonResponse($return);
  832.     }
  833.     #[Rest\Get('/api-get-forms')]
  834.     public function getFormsAction(FormRepository $formRepository): JsonResponse
  835.     {
  836.         if (!$this->getUser())
  837.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  838.         //$forms = $formRepository->findAll();
  839.         $forms $formRepository->findAllByUser($this->getUser(), true);
  840.         $forms FormSerialization::serializeForms($forms);
  841.         return new JsonResponse(json_encode($formsJSON_THROW_ON_ERROR), 200, [], true);
  842.     }
  843.     #[Rest\Get('/api-get-forms-categories')]
  844.     public function getFormsCategoriesAction(FormRepository $formRepository): JsonResponse
  845.     {
  846.         if (!$this->getUser())
  847.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  848.         //$forms = $formRepository->findAll();
  849.         $forms $formRepository->findAllByUser($this->getUser(), true);
  850.         // TODO: SuperAdmin
  851.         $undefined = [];
  852.         $categories = [];
  853.         foreach ($forms as $form) {
  854.             if ($form->getCategory() == null) {
  855.                 $undefined[] = $form;
  856.             } else {
  857.                 $category $form->getCategory();
  858.                 if (!array_key_exists($category->getId(), $categories)) {
  859.                     $categories[$category->getId()] = [];
  860.                     $categories[$category->getId()]["category"] = $category;
  861.                     $categories[$category->getId()]["forms"] = [];
  862.                 }
  863.                 $categories[$category->getId()]["forms"][] = $form;
  864.             }
  865.         }
  866.         $results = [];
  867.         foreach ($categories as $categoryTab) {
  868.             $results[] = CategorySerialization::serializeFeedCategory($categoryTab["category"], $categoryTab["forms"]);
  869.         }
  870.         usort($results, function ($a$b) {
  871.             return $a['name'] <=> $b['name'];
  872.         });
  873.         $results[] = [
  874.             "id" => 0,
  875.             "name" => "Undefined",
  876.             "forms" => FormSerialization::serializeForms($undefined)
  877.         ];
  878.         return new JsonResponse(json_encode($resultsJSON_THROW_ON_ERROR), 200, [], true);
  879.     }
  880.     #[Rest\Get('/api-get-feed')]
  881.     public function getAnswerFeedAction(Request $requestLineRepository $lineRepositoryAnimalRepository $animalRepository,): JsonResponse
  882.     {
  883.         if (!$this->getUser())
  884.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  885.         $limit $request->query->get('limit'50);
  886.         $offset $request->query->get('offset'0);
  887.         $isNew $request->query->get('isNew'false);
  888.         $answers $this->answersElastica(true$limit$offset);
  889.         $answers AnswerSerialization::serializeFeedAnswers($answers$animalRepository$this->getUser(), $lineRepository);
  890.         $validated false;
  891.         foreach ($this->getUser()->getUserEntities() as $userEntity) {
  892.             if ($userEntity->getIsAccepted()) {
  893.                 $validated true;
  894.             }
  895.         }
  896.         if (!$isNew) {
  897.             return new JsonResponse(json_encode($answersJSON_THROW_ON_ERROR), 200, [], true);
  898.         } else {
  899.             return new JsonResponse(json_encode(['answers' => $answers'validated' => $validated], JSON_THROW_ON_ERROR), 200, [], true);
  900.         }
  901.     }
  902.     #[Rest\Get('/api-get-feed-for-days')]
  903.     public function getAnswerFromDays(Request        $requestAnswerRepository $answerRepositoryAnimalRepository $animalRepository,
  904.                                       LineRepository $lineRepository): JsonResponse
  905.     {
  906.         if (!$this->getUser())
  907.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  908.         $daysFrom $request->query->get("days");
  909.         $answers $answerRepository->findAllDaysAgoByUser($this->getUser(), nullnullnullnull$daysFrom ?? 7);
  910.         $answers AnswerSerialization::serializeFeedAnswers($answers$animalRepository$this->getUser(), $lineRepository);
  911.         return new JsonResponse(json_encode($answersJSON_THROW_ON_ERROR), 200, [], true);
  912.     }
  913.     #[Rest\Get('/api-count-feed-for-days')]
  914.     public function countAnswerFromDays(Request  $requestAnswerRepository $answerRepositoryAnimalRepository $animalRepository,
  915.                                         Geocoder $geocoderMediaRepository $mediaRepository): JsonResponse
  916.     {
  917.         if (!$this->getUser())
  918.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  919.         $daysFrom $request->query->get("days");
  920.         $answers $answerRepository->countAllAnswersForDaysByUser($this->getUser(), nullnullnullnull$daysFrom ?? 7);
  921.         return new JsonResponse(json_encode(['feedCounter' => $answers], JSON_THROW_ON_ERROR), 200, [], true);
  922.     }
  923.     #[Rest\Get('/api-get-personal-feed')]
  924.     public function getAnswerPersonalFeedAction(Request          $requestAnswerRepository $answerRepository,
  925.                                                 AnimalRepository $animalRepositoryLineRepository $lineRepository): JsonResponse
  926.     {
  927.         if (!$this->getUser())
  928.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  929.         $limit $request->query->get('limit'10);
  930.         $offset $request->query->get('offset'0);
  931.         $answers $answerRepository->findPersonal($this->getUser(), $limit$offset);
  932.         $answers AnswerSerialization::serializeFeedAnswers($answers$animalRepository$this->getUser(), $lineRepository);
  933.         return new JsonResponse(json_encode($answersJSON_THROW_ON_ERROR), 200, [], true);
  934.     }
  935.     #[Rest\Get('/api-get-delete-user')]
  936.     public function getDeleteUserAction(UserRepository $userRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  937.     {
  938.         if (!$this->getUser())
  939.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  940.         $user $this->getUser();
  941.         foreach ($user->getAnswers() as $answer) {
  942.             $answer->setAuthor($userRepository->findOneByEmail("anonyme@anonyme.fr"));
  943.             // Update Elasticsearch
  944.         }
  945.         if (!$user->getAnswers()->isEmpty()) {
  946.             $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  947.         }
  948.         $mapObjects $mapObjectRepository->findByUser($user);
  949.         if (!empty($mapObjects)) {
  950.             $this->map_objectsPersister->replaceMany($mapObjects);
  951.         }
  952.         $userRepository->remove($usertrue);
  953.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  954.     }
  955.     #[Rest\Get('/api-get-detail')]
  956.     public function getAnswerDetailAction(Request $requestAnswerRepository $answerRepositoryAnimalRepository $animalRepositoryLineRepository $lineRepository): JsonResponse
  957.     {
  958.         if (!$this->getUser())
  959.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  960.         $answer $answerRepository->findOneById($request->query->get("id"));
  961.         $answer AnswerSerialization::serializeDetailAnswer($answer$animalRepository$this->getUser(), $lineRepository);
  962.         return new JsonResponse(json_encode($answerJSON_THROW_ON_ERROR), 200, [], true);
  963.     }
  964.     #[Rest\Get('/api-get-form-fields')]
  965.     public function getFormFieldsAction(Request $requestFormRepository $formRepositoryAnimalRepository $animalRepository): JsonResponse
  966.     {
  967.         if (!$this->getUser())
  968.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  969.         $form $formRepository->findOneById($request->query->get("id"));
  970.         if (!$form) {
  971.             return new JsonResponse(json_encode('Bad request'), 400, [], true);
  972.         } else {
  973.             $fields FieldSerialization::serializeFields($form->getFields(), $animalRepository);
  974.             return new JsonResponse(json_encode($fieldsJSON_THROW_ON_ERROR), 200, [], true);
  975.         }
  976.     }
  977.     #[Rest\Get('/api-get-answer-count-by-date')]
  978.     public function getAnswerCountByDateAction(Request $requestAnswerRepository $answerRepository): JsonResponse
  979.     {
  980.         $result = [];
  981.         if (!$this->getUser())
  982.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  983.         $dateStart = new \DateTimeImmutable($request->query->get('startDate'));
  984.         $dateEnd = new \DateTimeImmutable($request->query->get('endDate'));
  985.         $result["answersCounts"] = $answerRepository->countAllAsAdminByIntervalDate($this->getUser(), $dateStart$dateEnd);
  986.         $result["count"] = $result["answersCounts"]["count"];
  987.         unset($result["answersCounts"]["count"]);
  988.         return new JsonResponse(json_encode($resultJSON_THROW_ON_ERROR), 200, [], true);
  989.     }
  990.     #[Rest\Get('/api-get-inscription-count-by-date')]
  991.     public function getInscriptionCountByDateAction(Request $requestUserRepository $userRepository): JsonResponse
  992.     {
  993.         $result = [];
  994.         if (!$this->getUser())
  995.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  996.         $dateStart = new \DateTimeImmutable($request->query->get('startDate'));
  997.         $dateEnd = new \DateTimeImmutable($request->query->get('endDate'));
  998.         $result["inscriptionsCounts"] = $userRepository->countAllAsAdminByIntervalDate($this->getUser(), $dateStart$dateEnd);
  999.         $result["count"] = $result["inscriptionsCounts"]["count"];
  1000.         unset($result["inscriptionsCounts"]["count"]);
  1001.         return new JsonResponse(json_encode($resultJSON_THROW_ON_ERROR), 200, [], true);
  1002.     }
  1003.     #[Rest\Get('/api-get-profil-by-inscription')]
  1004.     public function getProfilByInscription(Request $requestProfileRepository $profileRepository): JsonResponse
  1005.     {
  1006.         if (!$this->getUser())
  1007.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1008.         $dateStart = new \Datetime($request->query->get('startDate'));
  1009.         $dateEnd = new \Datetime($request->query->get('endDate'));
  1010.         $answersCounts $profileRepository->getProfileOfCountAllAsAdminByIntervalleDate($this->getUser(), $dateStart$dateEnd);
  1011.         return new JsonResponse(json_encode($answersCountsJSON_THROW_ON_ERROR), 200, [], true);
  1012.     }
  1013.     #[Rest\Get('/api-get-title-by-form-answer')]
  1014.     public function getTitleByFormAnswer(request $requestAnswerRepository $answerRepository): JsonResponse
  1015.     {
  1016.         if (!$this->getUser())
  1017.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1018.         $dateStart = new \DateTime($request->query->get('startDate'));
  1019.         $dateEnd = new \DateTime($request->query->get('endDate'));
  1020.         $answersCounts $answerRepository->countTitleAllAsAdminByIntervalDate($this->getUser(), $dateStart$dateEnd);
  1021.         return new JsonResponse(json_encode($answersCountsJSON_THROW_ON_ERROR), 200, [], true);
  1022.     }
  1023.     #[Rest\Post('/api-post-answer')]
  1024.     public function postAnswerAction(
  1025.         Request                 $requestFormRepository $formRepositoryFieldRepository $fieldRepository,
  1026.         GeolocationRepository   $geolocationRepositoryCityRepository $cityRepository,
  1027.         Geocoder                $geocoderAnswerContentRepository $answerContentRepository,
  1028.         MailerService           $emailFileUploader $fileUploaderMessageBusInterface $messageBus,
  1029.         NotificationService     $notificationServiceAnswerRepository $answerRepository,
  1030.         ShapeHasPointRepository $shapeHasPointRepositoryShapeRepository $shapeRepositoryMediaRepository $mediaRepository,
  1031.         MapObjectRepository     $mapObjectRepositoryMapObjectTypeRepository $mapObjectTypeRepository,
  1032.         Fdc55Fence              $fdc55FenceFdc77Fence $fdc77FenceFdc27Fence $fdc27FenceFdc77Agrainage $fdc77Agrainage): JsonResponse
  1033.     {
  1034.         $placeAvailableEmail null;
  1035.         $mapObjectLinked null;
  1036.         $user $this->getUser();
  1037.         if (!$user) {
  1038.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1039.         }
  1040.         $form $formRepository->findOneById($request->request->get('form'''));
  1041.         if (!$form) {
  1042.             return new JsonResponse(json_encode('Bad request For Form'), 400, [], true);
  1043.         }
  1044.         $answer = new Answer();
  1045.         $answer->setAuthor($user);
  1046.         $answer->setForm($form);
  1047.         if ($form->getIsLinkedToObject()) {
  1048.             $mapObjectLinked $mapObjectRepository->findOneBy(['id' => $request->request->get('objectId''')]);
  1049.             $answer->setMapObject($mapObjectLinked);
  1050.         }
  1051.         if ($request->request->get('private') == "true") {
  1052.             $answer->setPrivate(true);
  1053.         } else {
  1054.             $answer->setPrivate(false);
  1055.         }
  1056.         $latitude = (float)$request->request->get('latitude'null);
  1057.         $longitude = (float)$request->request->get('longitude'null);
  1058.         if ($answer->getForm()->getIsGeolocated() === true && !$form->getIsLinkedToObject()) {
  1059.             if (!$latitude && !$longitude) {
  1060.                 return new JsonResponse(json_encode('Bad request For Geolocation'), 400, [], true);
  1061.             }
  1062.             $geolocation = new Geolocation();
  1063.             $geolocation->setLat($latitude);
  1064.             $geolocation->setLng($longitude);
  1065.             $city $geocoder->reverseGeocode($latitude$longitude);
  1066.             $geolocation->setFullAddress($city["fullAdress"]);
  1067.             if (array_key_exists("ville"$city)) {
  1068.                 $city $city['ville'];
  1069.                 $city $cityRepository->findOneByCityName($city);
  1070.                 if ((is_countable($city) ? count($city) : 0) > 0) {
  1071.                     $geolocation->setCity($city[0]);
  1072.                 }
  1073.             }
  1074.             $geolocationRepository->add($geolocationfalse);
  1075.             $answer->setGeolocation($geolocation);
  1076.         }
  1077.         if (($answer->getForm()->getIsShape() === true || $answer->getForm()->getIsPolyline() === true) && !$form->getIsLinkedToObject()) {
  1078.             $shape = new Shape();
  1079.             $points $request->request->all('shape');
  1080.             $type $request->request->get('shapeType'$answer->getForm()->getIsPolyline() === true "polyline" "polygon");
  1081.             $shape->setType($type);
  1082.             if (!empty($points)) {
  1083.                 $geolocation = new Geolocation();
  1084.                 $geolocation->setLat($points[0]['lat']);
  1085.                 $geolocation->setLng($points[0]['lng']);
  1086.                 $city $geocoder->reverseGeocode($geolocation->getLat(), $geolocation->getLng());
  1087.                 $geolocation->setFullAddress($city["fullAdress"]);
  1088.                 if (array_key_exists("ville"$city)) {
  1089.                     $city $city['ville'];
  1090.                     $city $cityRepository->findOneByCityName($city);
  1091.                     if ((is_countable($city) ? count($city) : 0) > 0) {
  1092.                         $geolocation->setCity($city[0]);
  1093.                     }
  1094.                 }
  1095.                 $geolocationRepository->add($geolocationfalse);
  1096.                 $answer->setGeolocation($geolocation);
  1097.                 foreach ($points as $point) {
  1098.                     $shapeAsPoint = new ShapeHasPoint();
  1099.                     $shapeAsPoint->setShape($shape);
  1100.                     $shapeAsPoint->setLat($point['lat']);
  1101.                     $shapeAsPoint->setLng($point['lng']);
  1102.                     $shapeHasPointRepository->add($shapeAsPointfalse);
  1103.                     $shape->addShapeHasPoint($shapeAsPoint);
  1104.                 }
  1105.             } else
  1106.                 return new JsonResponse(json_encode('Bad request For Shape'), 400, [], true);
  1107.             $shapeRepository->add($shapefalse);
  1108.             $answer->setShape($shape);
  1109.         }
  1110.         $timestamp $request->request->get('publicationDate'null);
  1111.         if ($timestamp != null) {
  1112.             $pubDate = new \DateTime();
  1113.             $pubDate->setTimestamp($timestamp);
  1114. //            $pubDate->format("d/m/Y à H:i");
  1115.             $answer->setDate($pubDate);
  1116.         } else {
  1117.             $pubDate = new \DateTime('now');
  1118.             $answer->setDate($pubDate);
  1119.         }
  1120.         $answers $request->request->all('answers');
  1121.         $placeBooking '';
  1122.         $placesAvailableEmail '';
  1123.         for ($i 0$i count($answers); $i++) {
  1124.             $content $answers[$i];
  1125.             //Booking places available
  1126.             if (array_key_exists('isBooking'$content)) {
  1127.                 if ($content['isBooking'] == 'true') {
  1128.                     $answerBooking $answerContentRepository->findBy(['field' => $content['field']]);
  1129.                     $places $formRepository->findOneBy(['id' => $form]);
  1130.                     $placeAvailable '';
  1131.                     if ($answerBooking) {
  1132.                         // Subtract number of available places
  1133.                         $integer 0;
  1134.                         foreach ($answerBooking as $value) {
  1135.                             $integer $integer $value->getContent();
  1136.                         }
  1137.                         $placesAvailable $places->getNumberBooking() - $integer;
  1138.                     } else {
  1139.                         // Display number places origin
  1140.                         $placesAvailable $places->getNumberBooking();
  1141.                     }
  1142.                     if ($answer->getForm()->getBookingSpace()) {
  1143.                         $placeBooking 1;
  1144.                     } else {
  1145.                         $placeBooking $content['content'];
  1146.                     }
  1147.                     if ($placesAvailable $placeBooking 0) {
  1148.                         return new JsonResponse(json_encode(falseJSON_THROW_ON_ERROR), 200, [], true);
  1149.                     } else {
  1150.                         $placeAvailableEmail $placesAvailable $placeBooking;
  1151.                     }
  1152.                 }
  1153.             }
  1154.             $answerContent = new AnswerContent();
  1155.             if (array_key_exists('isBooking'$content)) {
  1156.                 if ($content['isBooking'] == 'true') {
  1157.                     $answerContent->setContent(1);
  1158.                 } else {
  1159.                     $answerContent->setContent($content['content']);
  1160.                 }
  1161.             } else {
  1162.                 $answerContent->setContent($content['content']);
  1163.             }
  1164.             $answerContent->setField($fieldRepository->findOneById($content['field']));
  1165.             if ($answerContent->getField()->getForm() == $answer->getForm()) {
  1166.                 $answerContentRepository->add($answerContentfalse);
  1167.                 $answer->addAnswerContent($answerContent);
  1168.             }
  1169.         }
  1170.         $filesBag $request->files->all();
  1171.         // Files
  1172.         $path $this->getParameter('upload__publication_file_directory');
  1173.         foreach ($filesBag as $key => $file) {
  1174.             if ($key != 'signature') {
  1175.                 $filename $fileUploader->upload($file$path);
  1176.                 $mimeType $file->getClientMimeType();
  1177.                 if (str_contains((string)$mimeType"heic") || str_contains((string)$mimeType"heif")) {
  1178.                     // convert heic or heif to jpg
  1179.                     $im = new Imagick($path "/" $filename);
  1180.                     $im->setCompression(Imagick::COMPRESSION_JPEG);
  1181.                     $im->setCompressionQuality(90);
  1182.                     $im->setImageFormat('jpeg');
  1183.                     $oldName $filename;
  1184.                     if (str_contains((string)$mimeType"heic")) {
  1185.                         //rename file for new extension
  1186.                         $filename str_replace('.heic''.jpg'$filename);
  1187.                         //reset mimeType for media
  1188.                         $mimeType str_replace('heic''jpg', (string)$mimeType);
  1189.                     } else if (str_contains((string)$mimeType"heif")) {
  1190.                         //rename file for new extension
  1191.                         $filename str_replace('.heif''.jpg'$filename);
  1192.                         //reset mimeType for media
  1193.                         $mimeType str_replace('heif''jpg', (string)$mimeType);
  1194.                     }
  1195.                     unlink($path "/" $oldName);
  1196.                     if ($im->getImageWidth() < $im->getImageHeight()) {
  1197.                         $rotate "portrait";
  1198.                     } else {
  1199.                         $rotate "landscape";
  1200.                     }
  1201.                     switch ($rotate) {
  1202.                         case "portrait":
  1203.                             $im->scaleImage(7201280true);
  1204.                             break;
  1205.                         case "landscape":
  1206.                             $im->scaleImage(1280720true);
  1207.                             break;
  1208.                         default:
  1209.                             break;
  1210.                     }
  1211.                     $im->writeImage($path "/" $filename);
  1212.                     $im->clear();
  1213.                 }
  1214.                 $media = new Media();
  1215.                 $media->setFilename($filename);
  1216.                 $media->setMimeType($mimeType);
  1217.                 $media->setPath($path "/" $filename);
  1218.                 $mediaRepository->add($mediafalse);
  1219.                 $answer->addMedia($media);
  1220.             }
  1221.         }
  1222.         if ($answer->getForm()->getIsSigned() === true) {
  1223.             $signature $request->files->get('signature');
  1224.             if ($signature) {
  1225.                 $filename $fileUploader->upload($signature$path);
  1226.                 $media = new Media();
  1227.                 $media->setFilename($filename);
  1228.                 $media->setMimeType($signature->getClientMimeType());
  1229.                 $media->setPath($path "/" $filename);
  1230.                 $mediaRepository->add($mediafalse);
  1231.                 $answer->setSignature($media);
  1232.             } else {
  1233.                 return new JsonResponse(json_encode("Aucune signature trouvée"), 400, [], true);
  1234.             }
  1235.         }
  1236.         $isDouble $answerRepository->isDouble($user$pubDate$latitude$longitude);
  1237.         if (empty($isDouble)) {
  1238.             $answerRepository->add($answertrue);
  1239.             // Encode video async
  1240.             if (!$answer->getMedias()->isEmpty()) {
  1241.                 $messageBus->dispatch(new AnswerNotificationMessage($answer->getId()));
  1242.             }
  1243.             if ($form->getIsBooking()) {
  1244.                 $email->sendBookingAdmins($user$placeBooking$form$placeAvailableEmail);
  1245.                 $email->sendBookingUser($user$form);
  1246.             }
  1247.             $admins $form->getEntity()->getAdmins();
  1248.             $adminSend = [];
  1249.             $adminSave = [];
  1250.             foreach ($admins as $admin) {
  1251.                 if ($admin != $user)
  1252.                     if ($admin->getNotifParams()->getNewPublication()) {
  1253.                         $adminSend[] = $admin;
  1254.                     } else {
  1255.                         $adminSave[] = $admin;
  1256.                     }
  1257.             }
  1258.             $title "Une nouvelle publication a été ajoutée à votre entité";
  1259.             $body $user->getLastName() . " " $user->getName() . " à publié dans le formulaire " $form->getTitle();
  1260.             $data = ["type" => "answerAdmin",
  1261.                 "id" => $answer->getId()];
  1262.             $notificationService->saveNotifications($adminSave$title$body$data);
  1263.             $notificationService->sendNotifications($adminSend$title$body$data);
  1264.             if ($form->getIsObject()) {
  1265.                 $mapObject = new MapObject();
  1266.                 $geolocation = new Geolocation();
  1267.                 $geolocation->setLat($answer->getGeolocation()->getLat());
  1268.                 $geolocation->setLng($answer->getGeolocation()->getLng());
  1269.                 $geolocation->setCity($answer->getGeolocation()->getCity());
  1270.                 $geolocationRepository->add($geolocationfalse);
  1271.                 $mapObject->setGeolocation($geolocation);
  1272.                 $mapObject->setAnswer($answer);
  1273.                 if ($mapObject->getShape()) {
  1274.                     $mapObjectShape = new Shape();
  1275.                     $mapObjectShape->setType($answer->getShape()->getType());
  1276.                     foreach ($answer->getShape()->getShapeHasPoints() as $shapeHasPoint) {
  1277.                         $newShapeHasPoint = new ShapeHasPoint();
  1278.                         $newShapeHasPoint->setLat($shapeHasPoint->getLat());
  1279.                         $newShapeHasPoint->setLng($shapeHasPoint->getLng());
  1280.                         $newShapeHasPoint->setShape($mapObjectShape);
  1281.                         $shapeHasPointRepository->add($newShapeHasPointfalse);
  1282.                         $mapObjectShape->addShapeHasPoint($newShapeHasPoint);
  1283.                     }
  1284.                     $shapeRepository->add($mapObjectShapefalse);
  1285.                     $mapObject->setShape($mapObjectShape);
  1286.                 }
  1287.                 $mapObjectType $mapObjectTypeRepository->findOneBy(['form' => $form]);
  1288.                 if ($mapObjectType) {
  1289.                     if ($mapObjectType->getLegendField()) {
  1290.                         $answerContent $answerContentRepository->findOneBy(['answer' => $answer'field' => $mapObjectType->getLegendField()]);
  1291.                         if ($answerContent?->getContent()) {
  1292.                             $mapObject->setLegend($answerContent->getContent());
  1293.                         } else {
  1294.                             $mapObject->setLegend($answer->getId());
  1295.                         }
  1296.                     } elseif ($mapObjectType->getIsIdLegend()) {
  1297.                         $mapObject->setLegend($answer->getId());
  1298.                     }
  1299.                     $mapObjectType->addMapObject($mapObject);
  1300.                     $mapObjectRepository->save($mapObjecttrue);
  1301.                     $mapObjectTypeRepository->save($mapObjectTypetrue);
  1302.                     $this->map_objectsPersister->insertOne($mapObject);
  1303.                 }
  1304.             }
  1305.             //FDC55 Fence
  1306.             if ($form->getEntity()->getId() == 23) {
  1307.                 if ($form->getIsLinkedToObject()) {
  1308.                     // modification publication step 2,3,4
  1309.                     $fdc55Fence->updateFenceObject($answer$mapObjectLinked);
  1310.                 }
  1311.                 // Mail validation initiale
  1312.                 $fdc55Fence->mailStepOneInitial($answer);
  1313.             }
  1314.             //FDC77
  1315.             if ($form->getEntity()->getId() == 7) {
  1316.                 if ($form->getIsLinkedToObject()) {
  1317.                     // modification publication step 2,3,4
  1318.                     $fdc77Fence->updateFenceObject($answer$mapObjectLinked);
  1319.                 }
  1320.                 // Mail validation initiale
  1321.                 $fdc77Fence->mailStepOneInitial($answer);
  1322.                 $fdc77Agrainage->mailStepOneInitial($answer);
  1323.             }
  1324.             //FDC27 Fence
  1325.             if ($form->getEntity()->getId() == 10) {
  1326.                 if ($form->getIsLinkedToObject()) {
  1327.                     // modification publication step 2
  1328.                     $fdc27Fence->actionOnFenceObject($answer$mapObjectLinked);
  1329.                 }
  1330.                 // Mail validation initiale
  1331.                 $fdc27Fence->mailStepOneInitial($answer);
  1332.             }
  1333.         }
  1334.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1335.     }
  1336. //    /**
  1337. //     *test upload Files.
  1338. //     * @Rest\Get("/api-import")
  1339. //     * @param DepartmentRepository $departmentRepository
  1340. //     * @param RegionRepository $regionRepository
  1341. //     * @param CityRepository $cityRepository
  1342. //     * @param AnimalRepository $animalRepository
  1343. //     * @return JsonResponse
  1344. //     */
  1345. //    public function importBase(DepartmentRepository $departmentRepository, RegionRepository $regionRepository, CityRepository $cityRepository, AnimalRepository $animalRepository): JsonResponse
  1346. //    {
  1347. //        set_time_limit(0);
  1348. //        $entityManager = $this->getDoctrine()->getManager();
  1349. //        $entityManager->getConfiguration()->setSQLLogger(null);
  1350. //        $regions = $this->exportData($this->getParameter('kernel.project_dir') . "/public/assets/import/regions.csv");
  1351. //        foreach ($regions as $region) {
  1352. //            $code = $regionRepository->findOneByCode($region[0]);
  1353. //            if (!$code) {
  1354. //                $newRegion = new Region();
  1355. //                $newRegion->setCode($region[0]);
  1356. //                $newRegion->setName($region[1]);
  1357. //                $entityManager->persist($newRegion);
  1358. //            }
  1359. //        }
  1360. //        $entityManager->flush();
  1361. //
  1362. //        $departments = $this->exportData($this->getParameter('kernel.project_dir') . "/public/assets/import/departments.csv");
  1363. //        foreach ($departments as $department) {
  1364. //            $code = $departmentRepository->findOneByCode($department[0]);
  1365. //            if (!$code) {
  1366. //                $newDepartment = new Department();
  1367. //                $newDepartment->setCode($department[0]);
  1368. //                $newDepartment->setName($department[1]);
  1369. //                $entityManager->persist($newDepartment);
  1370. //            }
  1371. //        }
  1372. //
  1373. //        $entityManager->flush();
  1374. //        $cities = $this->exportData($this->getParameter('kernel.project_dir') . "/public/assets/import/cities.csv");
  1375. //        $department = null;
  1376. //        $region = null;
  1377. //        $last = null;
  1378. //        foreach ($cities as $key => $city) {
  1379. //            $code = $cityRepository->findOneByCode($city[0]);
  1380. //            if (!$code) {
  1381. //                $newCity = new City();
  1382. //                $newCity->setCode($city[0]);
  1383. //                $newCity->setPostalName($city[1]);
  1384. //                $newCity->setPostalCode($city[2]);
  1385. //                $newCity->setName($city[3]);
  1386. //
  1387. //                if (!$department)
  1388. //                    $department = $departmentRepository->findOneByCode($city[4]);
  1389. //                else {
  1390. //                    if ($city[4] != $department->getCode())
  1391. //                        $department = $departmentRepository->findOneByCode($city[4]);
  1392. //                }
  1393. //                $newCity->setDepartment($department);
  1394. //
  1395. //                if (!$region)
  1396. //                    $region = $regionRepository->findOneByCode($city[5]);
  1397. //                else {
  1398. //                    if ($city[5] != $region->getCode())
  1399. //                        $region = $regionRepository->findOneByCode($city[5]);
  1400. //                }
  1401. //                $newCity->setRegion($region);
  1402. //                if ($region && $department)
  1403. //                    $entityManager->persist($newCity);
  1404. //            }
  1405. //            if ($key % 100 == 1) {
  1406. //                $entityManager->flush();
  1407. //            }
  1408. //        }
  1409. //        $animals = $this->exportData($this->getParameter('kernel.project_dir') . "/public/assets/import/animals.csv");
  1410. //
  1411. //        foreach ($animals as $animal) {
  1412. //            $name = $animalRepository->findOneByName($animal[0]);
  1413. //            if (!$name) {
  1414. //                $newAnimal = new Animal;
  1415. //                $newAnimal->setName($animal[0]);
  1416. //                $entityManager->persist($newAnimal);
  1417. //            }
  1418. //        }
  1419. //        $entityManager->flush();
  1420. //        return new JsonResponse(json_encode(true), 200, [], true);
  1421. //    }
  1422.     #[Rest\Get('/api-notification-feed')]
  1423.     public function getUserNotifications(Request $requestSavedNotificationRepository $notificationRepository): JsonResponse
  1424.     {
  1425.         $limit $request->query->get('limit'20);
  1426.         $offset $request->query->get('offset'0);
  1427.         $user $this->getUser();
  1428.         if (!$user) {
  1429.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1430.         }
  1431.         $notifications SavedNotificationSerialization::serializeSavedNotifications($notificationRepository->findByUser($user$limit$offset));
  1432.         return new JsonResponse(json_encode($notificationsJSON_THROW_ON_ERROR), 200, [], true);
  1433.     }
  1434.     #[Rest\Get('api-like-action')]
  1435.     public function getUserLikeAnswer(Request             $requestAnswerRepository $answerRepository,
  1436.                                       NotificationService $notificationServiceLikeRepository $likeRepository): JsonResponse
  1437.     {
  1438.         $user $this->getUser();
  1439.         if (!$user) {
  1440.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1441.         }
  1442.         $answer $answerRepository->findOneById($request->query->get('answer'));
  1443.         if ($answer) {
  1444.             $likes $answer->getLikes();
  1445.             $find false;
  1446.             foreach ($likes as $like) {
  1447.                 if ($like->getAuthor() == $user) {
  1448.                     $find $like;
  1449.                 }
  1450.             }
  1451.             if (!$find) {
  1452.                 $like = new Like();
  1453.                 $like->setAuthor($user);
  1454.                 $like->setAnswer($answer);
  1455.                 $likeRepository->add($likefalse);
  1456.                 $title "Votre publication a été aimée";
  1457.                 $body "Votre publication a été aimée par " $user->getLastName() . " " $user->getName();
  1458.                 $data = ["type" => "answer",
  1459.                     "id" => $answer->getId()];
  1460.                 if ($answer->getAuthor()->getNotifParams()->getNewLike() && $user != $answer->getAuthor()) {
  1461.                     $notificationService->sendUniqueNotification($answer->getAuthor(), $title$body$data);
  1462.                 }
  1463.                 $answerRepository->add($answertrue);
  1464.             } else {
  1465.                 $likeRepository->remove($findtrue);
  1466.             }
  1467.         }
  1468.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1469.     }
  1470.     #[Rest\Post('api-comment-action')]
  1471.     public function postUserCommentAnswer(Request             $requestAnswerRepository $answerRepository,
  1472.                                           NotificationService $notificationServiceCommentRepository $commentRepository): JsonResponse
  1473.     {
  1474.         $user $this->getUser();
  1475.         if (!$user) {
  1476.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1477.         }
  1478.         $answer $answerRepository->findOneById($request->request->get('answer'));
  1479.         if ($answer) {
  1480.             $comment = new Comment();
  1481.             $comment->setAuthor($user);
  1482.             $comment->setDate(new \DateTime());
  1483.             $comment->setContent($request->request->get('content'""));
  1484.             $comment->setAnswer($answer);
  1485.             $commentRepository->add($commenttrue);
  1486.             $title "Votre publication a été commentée";
  1487.             $body "Votre publication a été commentée par " $user->getLastName() . " " $user->getName();
  1488.             $data = ["type" => "answer",
  1489.                 "id" => $answer->getId()];
  1490.             if ($answer->getAuthor()->getNotifParams()->getNewComment()) {
  1491.                 $notificationService->sendUniqueNotification($answer->getAuthor(), $title$body$data);
  1492.             }
  1493.             return new JsonResponse(json_encode(CommentSerialization::serializeComment($comment), JSON_THROW_ON_ERROR), 200, [], true);
  1494.         }
  1495.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1496.     }
  1497.     #[Rest\Get('api-get-delete-comment-action')]
  1498.     public function getUserDeleteCommentAnswer(Request $requestCommentRepository $commentRepository): JsonResponse
  1499.     {
  1500.         $user $this->getUser();
  1501.         if (!$user) {
  1502.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1503.         }
  1504.         $comment $commentRepository->findOneById($request->query->get('comment'));
  1505.         if ($comment) {
  1506.             if ($comment->getAuthor() == $user) {
  1507.                 $commentRepository->add($commenttrue);
  1508.             } else {
  1509.                 return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1510.             }
  1511.         }
  1512.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1513.     }
  1514.     #[Rest\Get('api-forget-password')]
  1515.     public function forgotPassword(Request $requestUserRepository $userRepositoryTokenGeneratorInterface $tokenGeneratorMailerService $mailerService): JsonResponse
  1516.     {
  1517.         $login $request->query->get('login');
  1518.         $user $userRepository->findOneByEmail($login);
  1519.         if (!$user)
  1520.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1521.         $token $tokenGenerator->generateToken();
  1522.         try {
  1523.             $user->setResetToken($token);
  1524.             $userRepository->add($usertrue);
  1525.         } catch (\Exception) {
  1526.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1527.         }
  1528.         $url $this->generateUrl('app_reset_password', ['token' => $token]);
  1529.         $url sprintf(
  1530.             "%s://%s%s",
  1531.             isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' 'https' 'http',
  1532.             $_SERVER['SERVER_NAME'],
  1533.             $url
  1534.         );
  1535.         $mailerService->sendEmail($user->getEmail(),
  1536.             "Réinitialisation de mot de passe",
  1537.             $this->renderView(
  1538.                 'email/forget-password.html.twig',
  1539.                 [
  1540.                     'user' => $user,
  1541.                     'url' => $url]
  1542.             ));
  1543.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1544.     }
  1545.     #[Rest\Post('/api-notification-params')]
  1546.     public function postUserParams(Request $requestNotifParamsRepository $notifParamsRepository): JsonResponse
  1547.     {
  1548.         if (!$this->getUser()) {
  1549.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1550.         }
  1551.         if (!$this->getUser()->getNotifParams()) {
  1552.             $notifParams = new NotifParams();
  1553.             $notifParams->setUser($this->getUser());
  1554.         } else {
  1555.             $notifParams $this->getUser()->getNotifParams();
  1556.         }
  1557.         $notifParams->setNewFormEmail(json_decode((string)$request->get("newFormEmail"false), null512JSON_THROW_ON_ERROR));
  1558.         $notifParams->setNewFormPush(json_decode((string)$request->get("newFormPush"false), null512JSON_THROW_ON_ERROR));
  1559.         $notifParams->setNewPublication(json_decode((string)$request->get("newPublication"false), null512JSON_THROW_ON_ERROR));
  1560.         $notifParams->setNewLike(json_decode((string)$request->get("like"false), null512JSON_THROW_ON_ERROR));
  1561.         $notifParams->setNewComment(json_decode((string)$request->get("comment"false), null512JSON_THROW_ON_ERROR));
  1562.         $notifParams->setEntityApproval(json_decode((string)$request->get("entityApproval"false), null512JSON_THROW_ON_ERROR));
  1563.         $notifParamsRepository->add($notifParamstrue);
  1564.         return new JsonResponse(json_encode(NotifParamsSerialization::serializeNotifParams($notifParams), JSON_THROW_ON_ERROR), 200, [], true);
  1565.     }
  1566.     #[Rest\Post('/api-log')]
  1567.     public function postLog(Request $requestLogRepository $logRepository): JsonResponse
  1568.     {
  1569. //        if (!$this->getUser()){
  1570. //            return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1571. //        }
  1572.         $params $request->request->all();
  1573.         $params['date'] = explode("/", (string)$params['date']);
  1574.         $params["date"] = $params["date"][1] . "/" $params["date"][0] . "/" $params["date"][2];
  1575.         $log = new Log();
  1576.         $log->setDate(new \DateTime($params['date']));
  1577.         if ($this->getUser()) {
  1578.             $log->setUser($this->getUser());
  1579.         }
  1580.         $log->setPhoneModel($params['phoneModel']);
  1581.         $log->setLog($params['log']);
  1582.         $log->setPlatform($params['platform']);
  1583.         $log->setVersionOs($params['versionOs']);
  1584.         $log->setApplicationVersion($params['applicationVersion']);
  1585.         $logRepository->add($logtrue);
  1586.         return new JsonResponse(json_encode("logs has been sent"), 200, [], true);
  1587.     }
  1588. //    /**
  1589. //     * @Rest\Get("api-clean-database")
  1590. //     * @param EntityRepository $entityRepository
  1591. //     * @return JsonResponse
  1592. //     */
  1593. //    public function cleanDatabase(EntityRepository $entityRepository): JsonResponse
  1594. //    {
  1595. //        $entityManager = $this->getDoctrine()->getManager();
  1596. //        $entity = $entityRepository->findOneById(7);
  1597. //        $forms = $entity->getform();
  1598. //        foreach ($forms as $form){
  1599. //            foreach($form->getAnswers() as $answer){
  1600. //                $entityManager->remove($answer);
  1601. //            }
  1602. //
  1603. //        } $entityManager->flush();
  1604. //        $entityManager = $this->getDoctrine()->getManager();
  1605. //        return new JsonResponse(json_encode(true), 200, [], true);
  1606. //    }
  1607.     #[Rest\Get('api-anonyme-everywhere')]
  1608.     public function anonymeEverywhere(UserRepository    $userRepository,
  1609.                                       EntityRepository  $entityRepository,
  1610.                                       ProfileRepository $profileRepositoryUserEntityRepository $userEntityRepository): JsonResponse
  1611.     {
  1612.         $user $userRepository->findOneByEmail("anonyme@anonyme.fr");
  1613.         $entities $entityRepository->findAll();
  1614.         $profiles $profileRepository->findAll();
  1615.         foreach ($entities as $entity) {
  1616.             $userEntity = new UserEntity();
  1617.             $userEntity->setUser($user);
  1618.             $userEntity->setEntity($entity);
  1619.             $userEntity->setIsAccepted(true);
  1620.             $userEntityRepository->add($userEntityfalse);
  1621.         }
  1622.         foreach ($profiles as $profile) {
  1623.             $user->addProfile($profile);
  1624.         }
  1625.         $userRepository->add($usertrue);
  1626.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1627.     }
  1628.     #[Rest\Get('/api-delete-user')]
  1629.     public function deleteUserAction(UserRepository $userRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  1630.     {
  1631.         $user $this->getUser();
  1632.         if (!$user) {
  1633.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1634.         }
  1635.         foreach ($user->getAnswers() as $answer) {
  1636.             $answer->setAuthor($userRepository->findOneByEmail("anonyme@anonyme.fr"));
  1637.             // Update Elasticsearch
  1638.         }
  1639.         if (!$user->getAnswers()->isEmpty()) {
  1640.             $this->answersPersister->replaceMany($user->getAnswers()->getValues());
  1641.         }
  1642.         $mapObjects $mapObjectRepository->findByUser($user);
  1643.         if (!empty($mapObjects)) {
  1644.             $this->map_objectsPersister->replaceMany($mapObjects);
  1645.         }
  1646.         $userRepository->remove($usertrue);
  1647.         $session $this->container->get('request_stack')->getSession();
  1648.         $session->invalidate();
  1649.         return new JsonResponse(json_encode('deleted'), 200, [], true);
  1650.     }
  1651.     #[Rest\Get('/api-booking-forms')]
  1652.     public function findBookingsByEntity(Request $requestFormRepository $formRepository): JsonResponse
  1653.     {
  1654.         return new JsonResponse(
  1655.             json_encode(
  1656.                 FormSerialization::serializeForms(
  1657.                     $formRepository->findBooking()), JSON_THROW_ON_ERROR), 200, [], true);
  1658.     }
  1659.     #[Rest\Get('api-booking-form-places')]
  1660.     public function findNumberOfPlacesAvailable(Request $requestAnswerContentRepository $answerContentRepositoryFormRepository $formRepository): JsonResponse
  1661.     {
  1662.         $field $request->query->get('field');
  1663.         $form $request->query->get('form');
  1664.         $answers $answerContentRepository->findBy(['field' => $field]);
  1665.         $places $formRepository->findOneBy(['id' => $form]);
  1666.         $placesAvailable '';
  1667.         if ($answers) {
  1668.             // Subtract number of available places
  1669.             $i 0;
  1670.             foreach ($answers as $answer) {
  1671.                 $i $i $answer->getContent();
  1672.             }
  1673.             $placesAvailable $places->getNumberBooking() - $i;
  1674.         } else {
  1675.             // Display number places origin
  1676.             $placesAvailable $places->getNumberBooking();
  1677.         }
  1678.         return new JsonResponse(json_encode($placesAvailableJSON_THROW_ON_ERROR), 200, [], true);
  1679.     }
  1680.     #[Rest\Get('api-booking-user')]
  1681.     public function findAnswersBookingUser(LineRepository $lineRepository): JsonResponse
  1682.     {
  1683.         $user $this->getUser();
  1684.         $answers $user->getAnswers();
  1685.         $results = [];
  1686.         foreach ($answers as $answer) {
  1687.             if ($answer->getForm()->getIsBooking()) {
  1688.                 $results[] = $answer;
  1689.             }
  1690.         }
  1691.         return new JsonResponse(json_encode(AnswerSerialization::serializeFeedAnswers($resultsnullnull$lineRepository), JSON_THROW_ON_ERROR), 200, [], true);
  1692.     }
  1693.     #[Rest\Get('api-delete-answer-user')]
  1694.     public function deleteAnswerUser(Request        $requestAnswerRepository $answerRepository,
  1695.                                      MailerService  $emailAnswerContentRepository $answerContentRepository,
  1696.                                      FormRepository $formRepositoryUserRepository $userRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  1697.     {
  1698.         $user $this->getUser();
  1699.         $answer $answerRepository->findOneBy(['id' => $request->query->get('answer')]);
  1700.         if ($answer->getAuthor() == $user) {
  1701.             if($answer->getMapObject()){
  1702.                 $mapObjectRepository->remove($answer->getMapObject(), true);
  1703.             }
  1704.             $answerRepository->remove($answertrue);
  1705.             if ($answer->getForm()->getIsBooking()) {
  1706.                 $admins $answer->getForm()->getEntity()->getAdmins();
  1707.                 $form $answer->getForm();
  1708.                 $answersContents $answer->getAnswerContents();
  1709.                 $places $formRepository->findOneBy(['id' => $answer->getForm()]);
  1710.                 $field $answersContents[0]->getField();
  1711.                 $answers $answerContentRepository->findBy(['field' => $field]);
  1712.                 $i 0;
  1713.                 // Subtract number of available places
  1714.                 foreach ($answers as $answer) {
  1715.                     $i $i $answer->getContent();
  1716.                 }
  1717.                 $placesAvailable $places->getNumberBooking() - $i;
  1718.                 $email->deleteBookingUser($admins$user$placesAvailable$form);
  1719.             }
  1720.             return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1721.         } else {
  1722.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1723.         }
  1724.     }
  1725.     #[Rest\Post('/api-search-forms')]
  1726.     public function searchForms(Request $requestFormRepository $formRepositoryAnswerRepository $answerRepositoryAnimalRepository $animalRepositoryGeocoder $geocoder): JsonResponse
  1727.     {
  1728.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  1729.         $startDate $data['params']['startDate'];
  1730.         $endDate $data['params']['endDate'];
  1731.         $animals $data['params']['animals'];
  1732.         $profiles $data['params']['profiles'];
  1733.         $entities $data['params']['entities'];
  1734.         $statut $data['params']['statut'];
  1735.         $mapObjectType $data['params']['mapObjectTypes'];
  1736.         if (!$entities) {
  1737.             $entities[] = $this->getUser()->getSelectedEntity()->getId();
  1738.         }
  1739.         //Get all answers relative to parameters
  1740.         $answers $answerRepository->findAnswersByFieldsTypeAnimals($entities$profiles$statut$startDate$endDate$animals$mapObjectType);
  1741.         //Group by form
  1742.         $results = [];
  1743.         foreach ($answers as $answer) {
  1744.             $form $answer->getForm();
  1745.             if (!array_key_exists($form->getId(), $results)) {
  1746.                 $results[$form->getId()]["title"] = $form->getTitle();
  1747.                 $results[$form->getId()]["isBooking"] = $form->getIsBooking();
  1748.                 $results[$form->getId()]["isGeolocated"] = $form->getIsGeolocated() || $form->getIsShape();
  1749.                 $results[$form->getId()]["answers"] = [];
  1750.                 $results[$form->getId()]["answers"][] = AnswerSerialization::serializeExportAnswer($answer$animalRepository$geocoder$this->getUser());
  1751.             } else {
  1752.                 $results[$form->getId()]["answers"][] = AnswerSerialization::serializeExportAnswer($answer$animalRepository$geocoder$this->getUser());
  1753.             }
  1754.         }
  1755.         return new JsonResponse(json_encode($resultsJSON_THROW_ON_ERROR), 200, [], true);
  1756.     }
  1757.     #[Rest\Get('/api-get-all-answers')]
  1758.     public function getAllAnswersForForm(Request        $requestFormRepository $formRepository,
  1759.                                          LineRepository $lineRepositoryAnswerRepository $answerRepository): JsonResponse
  1760.     {
  1761.         $formId $request->query->get('form');
  1762.         $form $formRepository->find(['id' => $formId]);
  1763.         $results AnswerSerialization::serializeAdminTabAnswers($form->getAnswers(), nullfalse$this->encryptor$lineRepository$answerRepository);
  1764.         return new JsonResponse(json_encode($resultsJSON_THROW_ON_ERROR), 200, [], true);
  1765.     }
  1766.     #[Rest\Get('/api-get-statuts-answer')]
  1767.     public function getStatutsAnswer(StatutAnswerRepository $statutAnswerRepository): JsonResponse
  1768.     {
  1769.         $result = [];
  1770.         foreach ($statutAnswerRepository->findAll() as $statutAnswer) {
  1771.             $result[] = [
  1772.                 'id' => $statutAnswer->getId(),
  1773.                 'name' => $statutAnswer->getName()
  1774.             ];
  1775.         }
  1776.         return new JsonResponse(json_encode($resultJSON_THROW_ON_ERROR), 200, [], true);
  1777.     }
  1778.     #[Rest\Post('/api-post-valid-answer')]
  1779.     public function postValidAnswer(Request $requestAnswerRepository $answerRepositoryStatutAnswerRepository $statutAnswerRepository): JsonResponse
  1780.     {
  1781.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  1782.         $answer $answerRepository->findOneBy(['id' => $this->encryptor->decrypt($data['params']['answer'])]);
  1783.         $statut $statutAnswerRepository->findOneBy(['id' => $data['params']['statut']]);
  1784.         $answer->setStatut($statut);
  1785.         try {
  1786.             $answerRepository->add($answertrue);
  1787.             return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1788.         } catch (\Exception $e) {
  1789.             return new JsonResponse(json_encode("Erreur dans le post d'une réponse, le serveur à renvoyé l'exception suivante ${$e}"JSON_THROW_ON_ERROR), 500, [], true);
  1790.         }
  1791.     }
  1792.     #[Rest\Get('/api-delete-answer')]
  1793.     public function getDeleteAnswer(Request $requestAnswerRepository $answerRepositoryMapObjectRepository $mapObjectRepository): JsonResponse
  1794.     {
  1795.         $user $this->getUser();
  1796.         if (!$user) {
  1797.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1798.         } else {
  1799.             $answerId $request->query->get('answer');
  1800.             $answer $answerRepository->findOneBy(['id' => $answerId]);
  1801.             $entities = [];
  1802.             $allowed false;
  1803.             $answerAuthor $answer->getAuthor();
  1804.             if ($user == $answerAuthor) {
  1805.                 $allowed true;
  1806.             } elseif (in_array('ROLE_SUPER_ADMIN'$user->getRoles())) {
  1807.                 $allowed true;
  1808.             } elseif (in_array('ROLE_ADMIN'$user->getRoles())) {
  1809.                 $adminEntities $user->getEntitiesAdmins();
  1810.                 foreach ($adminEntities as $adminEntity) {
  1811.                     $entities[] = $adminEntity->getName();
  1812.                 }
  1813.                 $allowed in_array($answer->getForm()->getEntity()->getName(), $entities);
  1814.             }
  1815.             if ($allowed) {
  1816.                 $medias $answer->getMedias();
  1817.                 if ($medias) {
  1818.                     foreach ($medias as $media) {
  1819.                         $answer->removeMedia($media);
  1820.                     }
  1821.                 }
  1822.                 if($answer->getMapObject()){
  1823.                     $mapObjectRepository->remove($answer->getMapObject(), true);
  1824.                 }
  1825.                 $answerRepository->remove($answertrue);
  1826.                 return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1827.             } else {
  1828.                 return new JsonResponse(json_encode("Erreur lors de la suppression d'un post, l'utilisateur n'est pas l'auteur du post"), 403, [], true);
  1829.             }
  1830.         }
  1831.     }
  1832.     #[Rest\Post('/api-encrypt')]
  1833.     public function postEncrypt(Request $request): JsonResponse
  1834.     {
  1835.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  1836.         $encrypted $this->encryptor->encrypt($data['params']['encrypt']);
  1837.         return new JsonResponse(json_encode(['encrypted' => $encrypted], JSON_THROW_ON_ERROR), 200, [], true);
  1838.     }
  1839.     #[Rest\Get('/api-extended-view')]
  1840.     public function answersExtendedViewTable(Request          $requestFormRepository $formRepository,
  1841.                                              AnimalRepository $animalRepositoryLineRepository $lineRepositoryAnswerRepository $answerRepository): JsonResponse
  1842.     {
  1843.         $formId $request->query->get('form');
  1844.         $form $formRepository->findOneBy(['id' => $formId]);
  1845.         $result = [];
  1846.         $result["fields"] = [];
  1847.         foreach ($form->getFields() as $field) {
  1848.             $result["fields"][] = ['title' => $field->getTitle()];
  1849.         }
  1850.         $result['answers'] = AnswerSerialization::serializeAdminTabAnswers($form->getAnswers(), $animalRepositorytrue$this->encryptor$lineRepository$answerRepository);
  1851.         return new JsonResponse(json_encode($resultJSON_THROW_ON_ERROR), 200, [], true);
  1852.     }
  1853.     #[Rest\Get('/api-shape-has-point')]
  1854.     public function getShape_has_point(Request $requestShapeHasPointRepository $hasPointRepository): JsonResponse
  1855.     {
  1856.         $shapesHasPoint $hasPointRepository->findBy(['shape' => $request->query->get('id')]);
  1857.         $result = [];
  1858.         $result["shapeType"] = $shapesHasPoint[0]->getShape()->getType();
  1859.         $result["points"] = [];
  1860.         foreach ($shapesHasPoint as $shapeHasPoint) {
  1861.             $result["points"][] = [
  1862.                 $shapeHasPoint->getLat(),
  1863.                 $shapeHasPoint->getLng()
  1864.             ];
  1865.         }
  1866.         return new JsonResponse(json_encode($resultJSON_THROW_ON_ERROR), 200, [], true);
  1867.     }
  1868.     #[Rest\Get('/api-report-map')]
  1869.     public function getReportMap(Request $requestAnswerRepository $answerRepository): JsonResponse
  1870.     {
  1871.         if (!$this->getUser()) {
  1872.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1873.         } else {
  1874.             $swLat $request->query->get('swLat'false);
  1875.             $swLng $request->query->get('swLng'false);
  1876.             $neLat $request->query->get('neLat'false);
  1877.             $neLng $request->query->get('neLng'false);
  1878.             $id $request->query->get('id'null);
  1879.             $web filter_var($request->query->get('web'false), FILTER_VALIDATE_BOOLEAN);;
  1880.             if ($swLat && $swLng && $neLat && $neLng) {
  1881. //                $answers = $answerRepository->findAllByUser($this->getUser(), $swLat, $swLng, $neLat, $neLng);
  1882.                 $answers $this->answersElastica(false00$swLat$swLng$neLat$neLng$web$id);
  1883. //                $answers = AnswerSerialization::serializeMapAnswers($answers);
  1884.                 return new JsonResponse(json_encode($answersJSON_THROW_ON_ERROR), 200, [], true);
  1885.             } else {
  1886.                 return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1887.             }
  1888.         }
  1889.     }
  1890.     #[Rest\Get('/api-entity-category')]
  1891.     public function getEntityCategories(Request $requestCategoryRepository $categoryRepository): JsonResponse
  1892.     {
  1893.         if (!$this->getUser()) {
  1894.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1895.         } else {
  1896.             return new JsonResponse(
  1897.                 json_encode(
  1898.                     CategorySerialization::serializeCategorys(
  1899.                         $categoryRepository->findByEntity($this->getUser()->getSelectedEntity())
  1900.                     ), JSON_THROW_ON_ERROR
  1901.                 ), 200, [], true);
  1902.         }
  1903.     }
  1904.     #[Rest\Get('/api-clean-geoloc')]
  1905.     public function getCleanGeoloc(Request $requestAnswerRepository $answerRepositoryGeocoder $geocoderCityRepository $cityRepository): JsonResponse
  1906.     {
  1907.         $answer null;
  1908.         if ($this->role === "ROLE_SUPER_ADMIN") {
  1909.             $answers $answerRepository->findAll();
  1910.             foreach ($answers as $answer) {
  1911.                 if ($answer->getGeolocation()) {
  1912.                     if ($answer->getGeolocation()->getLat() && $answer->getGeolocation()->getLng()) {
  1913.                         $city $geocoder->reverseGeocode($answer->getGeolocation()->getLat(), $answer->getGeolocation()->getLng());
  1914.                         $answer->getGeolocation()->setFullAddress($city["fullAdress"]);
  1915.                         if (!is_null($answer->getGeolocation()->getCity())) {
  1916.                             if (array_key_exists("ville"$city)) {
  1917.                                 $city $city['ville'];
  1918.                                 $city $cityRepository->findOneByCityName($city);
  1919.                                 if ((is_countable($city) ? count($city) : 0) > 0) {
  1920.                                     $answer->getGeolocation()->setCity($city[0]);
  1921.                                 }
  1922.                             }
  1923.                         }
  1924.                     }
  1925.                 }
  1926.             }
  1927.             $answerRepository->add($answertrue);
  1928.         }
  1929.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1930.     }
  1931.     #[Rest\Get('/api-user-validated')]
  1932.     public function getUserValidated(): JsonResponse
  1933.     {
  1934.         if (!$this->getUser()) {
  1935.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  1936.         } else {
  1937.             if ($this->role == "ROLE_ADMIN" || $this->role == "ROLE_SUPER_ADMIN")
  1938.                 $validated true;
  1939.             else {
  1940.                 $validated false;
  1941.                 foreach ($this->getUser()->getUserEntities() as $userEntity) {
  1942.                     if ($userEntity->getIsAccepted()) {
  1943.                         $validated true;
  1944.                     }
  1945.                 }
  1946.             }
  1947.             return new JsonResponse(json_encode($validatedJSON_THROW_ON_ERROR), 200, [], true);
  1948.         }
  1949.     }
  1950.     #[Rest\Get('/update-users-notif-params')]
  1951.     public function updateUsersNotificationParams(UserRepository $userRepository): JsonResponse
  1952.     {
  1953.         if ($this->role === "ROLE_SUPER_ADMIN" && $this->getUser()) {
  1954.             foreach ($userRepository->findAll() as $user) {
  1955.                 if ($user->getNotifParams() == null) {
  1956.                     $user->setNotifParams(new NotifParams());
  1957.                     $userRepository->add($usertrue);
  1958.                 }
  1959.             }
  1960.         }
  1961.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1962.     }
  1963.     #[Rest\Get('/api-is-admin')]
  1964.     public function getIsAdmin(): JsonResponse
  1965.     {
  1966.         if ($this->role === "ROLE_ADMIN") {
  1967.             return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1968.         } else {
  1969.             return new JsonResponse(json_encode(falseJSON_THROW_ON_ERROR), 200, [], true);
  1970.         }
  1971.     }
  1972.     #[Rest\Get('/api-notification-params')]
  1973.     public function getUserNotificationParams(): JsonResponse
  1974.     {
  1975.         $notifParams $this->getUser()->getNotifParams();
  1976.         return new JsonResponse(json_encode(NotifParamsSerialization::serializeNotifParams($notifParams), JSON_THROW_ON_ERROR), 200, [], true);
  1977.     }
  1978.     #[Rest\Get('/api-test-notification')]
  1979.     public function getTestNotification(Request $requestNotificationService $notificationService): JsonResponse
  1980.     {
  1981.         $identifier $request->query->get('identifier');
  1982.         return new JsonResponse(json_encode($notificationService->sendTestNotification($identifier"test""test", ["test" => "test"]), JSON_THROW_ON_ERROR), 200, [], true);
  1983.     }
  1984.     #[Rest\Get('/api-clean-shape')]
  1985.     public function getCleanShape(ShapeRepository $shapeRepository): JsonResponse
  1986.     {
  1987.         if ($this->role === "ROLE_SUPER_ADMIN") {
  1988.             $shapes $shapeRepository->findAll();
  1989.             foreach ($shapes as $shape) {
  1990.                 if ($shape->getType() == null) {
  1991.                     $shape->setType("polygon");
  1992.                     $shapeRepository->add($shapetrue);
  1993.                 }
  1994.             }
  1995.         }
  1996.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  1997.     }
  1998.     #[Rest\Get('/api-testemail')]
  1999.     public function testEmail(MailerService $mailer): JsonResponse
  2000.     {
  2001.         $mailer->sendEmail();
  2002.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2003.     }
  2004.     #[Rest\Get('/api-read-notification')]
  2005.     public function getReadNotification(Request $requestNotificationService $notificationServiceSavedNotificationRepository $savedNotificationRepository): JsonResponse
  2006.     {
  2007.         $notification $request->query->get('notification');
  2008.         $notification $savedNotificationRepository->findOneById($notification);
  2009.         if (!$this->getUser() || !$notification) {
  2010.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2011.         }
  2012.         if ($this->getUser() != $notification->getUser()) {
  2013.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2014.         }
  2015.         $notification->setIsReaded(true);
  2016.         $savedNotificationRepository->add($notificationtrue);
  2017.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2018.     }
  2019.     #[Rest\Get('/api-clean-double')]
  2020.     public function getCleanDouble(AnswerRepository  $answerRepository,
  2021.                                    LikeRepository    $likeRepository,
  2022.                                    CommentRepository $commentRepository): JsonResponse
  2023.     {
  2024.         $answer null;
  2025.         if ($this->role === "ROLE_SUPER_ADMIN") {
  2026.             $answers $answerRepository->findDouble();
  2027.             foreach ($answers as $answer) {
  2028.                 $doubles $answerRepository->isDouble($answer->getAuthor(), $answer->getDate());
  2029.                 $double1 $doubles[0];
  2030.                 $double2 $doubles[1];
  2031.                 foreach ($double2->getLikes() as $likeDouble2) {
  2032.                     $find false;
  2033.                     foreach ($double1->getLikes() as $likeDouble1) {
  2034.                         if ($likeDouble1->getAuthor() == $likeDouble2->getAuthor()) {
  2035.                             $find true;
  2036.                         }
  2037.                     }
  2038.                     if (!$find) {
  2039.                         $likeDouble2->setAnswer($double1);
  2040.                         $likeRepository->add($likeDouble2false);
  2041.                     }
  2042.                 }
  2043.                 foreach ($double2->getComments() as $comment) {
  2044.                     $comment->setAnswer($double1);
  2045.                     $commentRepository->add($commentfalse);
  2046.                 }
  2047.                 $likeRepository->add($double2false);
  2048.             }
  2049.             $answerRepository->add($answertrue);
  2050.         }
  2051.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2052.     }
  2053.     #[Rest\Get('/api-map-icon')]
  2054.     public function getMapIcon(): JsonResponse
  2055.     {
  2056.         return new JsonResponse(json_encode(array_diff(scandir($this->getParameter('kernel.project_dir') . "/public/assets/img/icons"), ['.''..''default_icon.png']), JSON_THROW_ON_ERROR), 200, [], true);
  2057.     }
  2058.     #[Rest\Post('/api-object-type')]
  2059.     public function postObjectType(Request               $requestFormRepository $formRepository,
  2060.                                    FieldRepository       $fieldRepositoryMapObjectTypeRepository $mapObjectTypeRepository,
  2061.                                    MapObjectRepository   $mapObjectRepositoryAnswerContentRepository $answerContentRepository,
  2062.                                    GeolocationRepository $geolocationRepositoryShapeHasPointRepository $shapeHasPointRepository,
  2063.                                     ShapeRepository $shapeRepository): JsonResponse
  2064.     {
  2065.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR)['params'];
  2066.         $mapObjectType = new MapObjectType();
  2067.         $mapObjectType->setTitle($data['title']);
  2068.         $mapObjectType->setColor($data['color']);
  2069.         $mapObjectType->setDescription($data['description']);
  2070.         if ($data['icon'] != "") {
  2071.             $mapObjectType->setIcon($data['icon']);
  2072.         }
  2073.         $form $formRepository->findOneBy(['id' => $data['form']]);
  2074.         if ($data['legend'] != 'no' && $data['legend'] != 'id') {
  2075.             $field $fieldRepository->findOneBy(['id' => $data['legend']]);
  2076.             $mapObjectType->setLegendField($field);
  2077.         }
  2078.         $mapObjectType->setForm($form);
  2079.         $mapObjectType->setEntity($form->getEntity());
  2080.         $form->setIsObject(true);
  2081.         $mapObjectTypeRepository->save($mapObjectTypetrue);
  2082.         foreach ($form->getAnswers() as $answer) {
  2083.             $mapObject = new MapObject();
  2084.             $geolocation = new Geolocation();
  2085.             $geolocation->setLat($answer->getGeolocation()->getLat());
  2086.             $geolocation->setLng($answer->getGeolocation()->getLng());
  2087.             $geolocation->setCity($answer->getGeolocation()->getCity());
  2088.             $geolocationRepository->add($geolocationfalse);
  2089.             $mapObject->setGeolocation($geolocation);
  2090.             $mapObjectShape = new Shape();
  2091.             $mapObjectShape->setType($answer->getShape()->getType());
  2092.             foreach($answer->getShape()->getShapeHasPoints() as $shapeHasPoint){
  2093.                 $newShapeHasPoint = new ShapeHasPoint();
  2094.                 $newShapeHasPoint->setLat($shapeHasPoint->getLat());
  2095.                 $newShapeHasPoint->setLng($shapeHasPoint->getLng());
  2096.                 $newShapeHasPoint->setShape($mapObjectShape);
  2097.                 $shapeHasPointRepository->add($newShapeHasPointfalse);
  2098.                 $mapObjectShape->addShapeHasPoint($newShapeHasPoint);
  2099.             }
  2100.             $shapeRepository->add($mapObjectShapefalse);
  2101.             $mapObject->setShape($mapObjectShape);
  2102.             $mapObject->setAnswer($answer);
  2103.             if ($data['legend'] != 'no' && $data['legend'] != 'id') {
  2104.                 $mapObjectType->setIsIdLegend(false);
  2105.                 $answerContent $answerContentRepository->findOneBy(['answer' => $answer'field' => $field]);
  2106.                 if ($answerContent?->getContent()) {
  2107.                     $mapObject->setLegend($answerContent->getContent());
  2108.                 } else {
  2109.                     $mapObject->setLegend($answer->getId());
  2110.                 }
  2111.             } elseif ($data['legend'] == 'id') {
  2112.                 $mapObjectType->setIsIdLegend(true);
  2113.                 $mapObject->setLegend($answer->getId());
  2114.             }
  2115.             $mapObjectType->addMapObject($mapObject);
  2116.             $mapObjectRepository->save($mapObject);
  2117.         }
  2118.         $mapObjectTypeRepository->save($mapObjectTypetrue);
  2119.         return new JsonResponse(json_encode("true"JSON_THROW_ON_ERROR), 200, [], true);
  2120.     }
  2121.     #[Rest\Post('/api-edit-object-type')]
  2122.     public function postEditObjectType(Request             $requestFormRepository $formRepository,
  2123.                                        FieldRepository     $fieldRepositoryMapObjectTypeRepository $mapObjectTypeRepository,
  2124.                                        MapObjectRepository $mapObjectRepositoryAnswerContentRepository $answerContentRepository): JsonResponse
  2125.     {
  2126.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR)['params'];
  2127.         $mapObjectType $mapObjectTypeRepository->findOneBy(['id' => $data['id']]);
  2128.         $mapObjectType->setTitle($data['title']);
  2129.         $mapObjectType->setColor($data['color']);
  2130.         $mapObjectType->setDescription($data['description']);
  2131.         if ($data['icon'] != "") {
  2132.             $mapObjectType->setIcon($data['icon']);
  2133.         }
  2134.         if ($data['legend'] != 'no' && $data['legend'] != 'id') {
  2135.             $mapObjectType->setIsIdLegend(false);
  2136.             $field $fieldRepository->findOneBy(['id' => $data['legend']]);
  2137.             $mapObjectType->setLegendField($field);
  2138.             if ($field !== $mapObjectType->getLegendField()) {
  2139.                 $mapObjectType->setLegendField($field);
  2140.                 foreach ($mapObjectType->getMapObjects() as $mapObject) {
  2141.                     $answerContent $answerContentRepository->findOneBy(['answer' => $mapObject->getAnswer(), 'field' => $field]);
  2142.                     if ($answerContent?->getContent()) {
  2143.                         $mapObject->setLegend($answerContent->getContent());
  2144.                     } else {
  2145.                         $mapObject->setLegend($mapObject->getAnswer()->getId());
  2146.                     }
  2147.                 }
  2148.             }
  2149.         } elseif ($data['legend'] == 'id') {
  2150.             $mapObjectType->setIsIdLegend(true);
  2151.             foreach ($mapObjectType->getMapObjects() as $mapObject) {
  2152.                 $mapObject->setLegend($mapObject->getAnswer()->getId());
  2153.             }
  2154.         } else {
  2155.             $mapObjectType->setIsIdLegend(false);
  2156.             $mapObjectType->setLegendField(null);
  2157.             foreach ($mapObjectType->getMapObjects() as $mapObject) {
  2158.                 $mapObject->setLegend(null);
  2159.             }
  2160.         }
  2161.         $mapObjectTypeRepository->save($mapObjectTypetrue);
  2162.         return new JsonResponse(json_encode("true"JSON_THROW_ON_ERROR), 200, [], true);
  2163.     }
  2164.     #[Rest\Get('/api-entity-object-type')]
  2165.     public function getEntityObjectTypes(Request $requestMapObjectTypeRepository $mapObjectTypeRepository): JsonResponse
  2166.     {
  2167.         if (!$this->getUser()) {
  2168.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2169.         } else {
  2170.             return new JsonResponse(
  2171.                 json_encode(
  2172.                     MapObjectTypeSerialization::serializeMapObjectTypes(
  2173.                         $mapObjectTypeRepository->findByEntity($this->getUser()->getSelectedEntity())
  2174.                     ), JSON_THROW_ON_ERROR
  2175.                 ), 200, [], true);
  2176.         }
  2177.     }
  2178.     public function answersElastica(bool $feed trueint $limit 50int $offset 0string|null $swLat nullstring|null $swLng nullstring|null $neLat nullstring|null $neLng null$web falsestring|null $id null): array
  2179.     {
  2180.         $answersFinder $this->answersFinder;
  2181.         $user $this->getUser();
  2182.         $resultQuery = new BoolQuery();
  2183.         if (in_array('ROLE_SUPER_ADMIN'$user->getRoles())) {
  2184.             $maxLimit 100;
  2185.         } else {
  2186.             $paramsAnswersQuery = [];
  2187.             $entities = [];
  2188.             $maxLimit 50;
  2189.             $tempEntityQuery = new BoolQuery();
  2190.             $entityQuery = new BoolQuery();
  2191.             //admin entities
  2192.             if (in_array('ROLE_ADMIN'$user->getRoles())) {
  2193.                 $answersAdminEntityQuery = new BoolQuery();
  2194.                 foreach ($user->getEntitiesAdmins() as $entitiesAdmin) {
  2195.                     // Display all answers for his entity because is admin
  2196.                     $answersAdminEntityQuery->addShould(new Query\Term(['form.entity.id' => $entitiesAdmin->getId()]));
  2197.                     $entities[] = $entitiesAdmin->getId();
  2198.                 }
  2199.                 $answerAdminQuery = new Boolquery();
  2200.                 $answerAdminQuery->addMust($answersAdminEntityQuery);
  2201.                 $tempEntityQuery->addShould($answerAdminQuery);
  2202.                 // Add admin answer (just in case)
  2203.                 $tempEntityQuery->addShould(new Query\Term(['author.id' => $user->getId()]));
  2204.             } else {
  2205.                 // Hidden answer not public except your answers
  2206.                 $publicUserQuery = new BoolQuery();
  2207.                 $publicUserQuery->addShould(new Query\Term(['form.isPublic' => true]));
  2208.                 $publicUserQuery->addShould(new Query\Term(['author.id' => $user->getId()]));
  2209.                 $publicQuery = new BoolQuery();
  2210.                 $publicQuery->addMust($publicUserQuery);
  2211.                 $paramsAnswersQuery[] = $publicQuery;
  2212.             }
  2213.             //Entity where user is not admin
  2214.             $authorized false;
  2215.             foreach ($user->getUserEntities() as $userEntity) {
  2216.                 if (!in_array($userEntity->getEntity()->getId(), $entities)) {
  2217.                     $formsProfileQuery = new BoolQuery();
  2218.                     $tempFormsProfileQuery = new BoolQuery();
  2219.                     if ($userEntity->getIsAccepted()) {
  2220.                         foreach ($user->getProfiles() as $profile) {
  2221.                             $profilesQuery = new BoolQuery();
  2222.                             $profilesQuery->addMust(new Query\Term(['form.profiles.id' => $profile->getId()]));
  2223.                             $profilesQuery->addMust(new Query\Term(['form.entity.id' => $userEntity->getEntity()->getId()]));
  2224.                             $tempFormsProfileQuery->addShould($profilesQuery);
  2225.                         }
  2226.                         $noProfilesQuery = new BoolQuery();
  2227.                         $noProfilesQuery->addMustNot(new Query\Exists('form.profiles'));
  2228.                         $noProfilesQuery->addMust(new Query\Term(['form.entity.id' => $userEntity->getEntity()->getId()]));
  2229.                         $tempFormsProfileQuery->addShould($noProfilesQuery);
  2230.                         $formsProfileQuery->addMust($tempFormsProfileQuery);
  2231.                         $tempEntityQuery->addShould($formsProfileQuery);
  2232.                         $authorized true;
  2233.                     }
  2234.                 }
  2235.             }
  2236.             //If not authorized and not admin
  2237.             if (!$authorized && !in_array('ROLE_ADMIN'$user->getRoles())) {
  2238.                 $formAuthorQuery = new BoolQuery();
  2239.                 $formAuthorQuery->addMust(new Query\Term(['author.id' => $user->getId()]));
  2240.                 $paramsAnswersQuery[] = $formAuthorQuery;
  2241.             }
  2242.             $entityQuery->addMust($tempEntityQuery);
  2243.             $paramsAnswersQuery[] = $entityQuery;
  2244.             $resultQuery->addMust($paramsAnswersQuery);
  2245.         }
  2246.         // Hidden isBooking
  2247.         $resultQuery->addMust(new Query\Term(['form.isBooking' => false]));
  2248.         // Hidden not active
  2249.         $resultQuery->addMust(new Query\Term(['form.isActive' => true]));
  2250.         $resultQuery->addMust(new Query\Term(['isActive' => true]));
  2251.         // If map display
  2252.         if ($swLat && $swLng && $neLat && $neLng) {
  2253.             $posAnswersQuery = new BoolQuery();
  2254.             $posAnswersQuery->addMust(new Range('geolocation.lat', [
  2255.                 'gte' => (float)$swLat,
  2256.                 'lte' => (float)$neLat
  2257.             ]));
  2258.             $posAnswersQuery->addMust(new Range('geolocation.lng', [
  2259.                 'gte' => (float)$swLng,
  2260.                 'lte' => (float)$neLng
  2261.             ]));
  2262.             $resultQuery->addMust($posAnswersQuery);
  2263.             if ($id) {
  2264.                 $resultQuery->addMust(new Query\Term(['form.id' => $id]));
  2265.             } else {
  2266.                 if (!$web) {
  2267.                     $existMapObject = new Query\Exists('mapObject');
  2268.                     $resultQuery->addMustNot($existMapObject);
  2269.                 }
  2270.             }
  2271.         }
  2272.         $query = new Query($resultQuery);
  2273.         $query->addSort(['date' => 'desc']);
  2274.         if ($feed) {
  2275.             if ($offset == $maxLimit) {
  2276.                 $limit 0;
  2277.             }
  2278.             $query->setSize($limit);
  2279.             $query->setFrom($offset);
  2280.             return $answersFinder->find($query);
  2281.         }
  2282.         // Return for map
  2283.         $query->setSource([
  2284.             'id',
  2285.             'date',
  2286.             'author.name''author.lastName',
  2287.             'form.title',
  2288.             'form.id',
  2289.             'geolocation.lat''geolocation.lng',
  2290.             'shape']);
  2291.         $results $answersFinder->findRaw($query100000);
  2292.         $answers = [];
  2293.         foreach ($results as $answer) {
  2294.             $answers[] = $answer->getSource();
  2295.         }
  2296.         return $answers;
  2297.     }
  2298.     public function mapObjectsElastica(string|null $swLat nullstring|null $swLng nullstring|null $neLat nullstring|null $neLng nullint|null $id null): array
  2299.     {
  2300.         $mapObjectsFinder $this->map_objectsFinder;
  2301.         $user $this->getUser();
  2302.         $resultQuery = new BoolQuery();
  2303.         if (!in_array('ROLE_SUPER_ADMIN'$user->getRoles())) {
  2304.             $paramsAnswersQuery = [];
  2305.             $entities = [];
  2306.             $tempEntityQuery = new BoolQuery();
  2307.             $entityQuery = new BoolQuery();
  2308.             //admin entities
  2309.             if (in_array('ROLE_ADMIN'$user->getRoles())) {
  2310.                 $answersAdminEntityQuery = new BoolQuery();
  2311.                 foreach ($user->getEntitiesAdmins() as $entitiesAdmin) {
  2312.                     // Display all answers for his entity because is admin
  2313.                     $answersAdminEntityQuery->addShould(new Query\Term(['mapObjectType.form.entity.id' => $entitiesAdmin->getId()]));
  2314.                     $entities[] = $entitiesAdmin->getId();
  2315.                 }
  2316.                 $answerAdminQuery = new Boolquery();
  2317.                 $answerAdminQuery->addMust($answersAdminEntityQuery);
  2318.                 $tempEntityQuery->addShould($answerAdminQuery);
  2319.                 // Add admin answer (just in case)
  2320.                 $tempEntityQuery->addShould(new Query\Term(['answer.author.id' => $user->getId()]));
  2321.             } else {
  2322.                 // Hidden answer not public except your answers
  2323.                 $publicUserQuery = new BoolQuery();
  2324.                 $publicUserQuery->addShould(new Query\Term(['mapObjectType.form.isPublic' => true]));
  2325.                 $publicUserQuery->addShould(new Query\Term(['answer.author.id' => $user->getId()]));
  2326.                 $publicQuery = new BoolQuery();
  2327.                 $publicQuery->addMust($publicUserQuery);
  2328.                 $paramsAnswersQuery[] = $publicQuery;
  2329.             }
  2330.             //Entity where user is not admin
  2331.             $authorized false;
  2332.             foreach ($user->getUserEntities() as $userEntity) {
  2333.                 if (!in_array($userEntity->getEntity()->getId(), $entities)) {
  2334.                     $formsProfileQuery = new BoolQuery();
  2335.                     $tempFormsProfileQuery = new BoolQuery();
  2336.                     if ($userEntity->getIsAccepted()) {
  2337.                         foreach ($user->getProfiles() as $profile) {
  2338.                             $profilesQuery = new BoolQuery();
  2339.                             $profilesQuery->addMust(new Query\Term(['mapObjectType.form.profiles.id' => $profile->getId()]));
  2340.                             $profilesQuery->addMust(new Query\Term(['mapObjectType.form.entity.id' => $userEntity->getEntity()->getId()]));
  2341.                             $tempFormsProfileQuery->addShould($profilesQuery);
  2342.                         }
  2343.                         $noProfilesQuery = new BoolQuery();
  2344.                         $noProfilesQuery->addMustNot(new Query\Exists('mapObjectType.form.profiles'));
  2345.                         $noProfilesQuery->addMust(new Query\Term(['mapObjectType.form.entity.id' => $userEntity->getEntity()->getId()]));
  2346.                         $tempFormsProfileQuery->addShould($noProfilesQuery);
  2347.                         $formsProfileQuery->addMust($tempFormsProfileQuery);
  2348.                         $tempEntityQuery->addShould($formsProfileQuery);
  2349.                         $authorized true;
  2350.                     }
  2351.                 }
  2352.             }
  2353.             //If not authorized and not admin
  2354.             if (!$authorized && !in_array('ROLE_ADMIN'$user->getRoles())) {
  2355.                 $formAuthorQuery = new BoolQuery();
  2356.                 $formAuthorQuery->addMust(new Query\Term(['answer.author.id' => $user->getId()]));
  2357.                 $paramsAnswersQuery[] = $formAuthorQuery;
  2358.             }
  2359.             $entityQuery->addMust($tempEntityQuery);
  2360.             $paramsAnswersQuery[] = $entityQuery;
  2361.             $resultQuery->addMust($paramsAnswersQuery);
  2362.         }
  2363.         // Hidden isBooking
  2364.         $resultQuery->addMust(new Query\Term(['mapObjectType.form.isBooking' => false]));
  2365.         // Hidden not active
  2366.         $resultQuery->addMust(new Query\Term(['mapObjectType.isActive' => true]));
  2367.         $resultQuery->addMust(new Query\Term(['isActive' => true]));
  2368.         // If map display
  2369.         if ($swLat && $swLng && $neLat && $neLng) {
  2370.             $posAnswersQuery = new BoolQuery();
  2371.             $posAnswersQuery->addMust(new Range('geolocation.lat', [
  2372.                 'gte' => (float)$swLat,
  2373.                 'lte' => (float)$neLat
  2374.             ]));
  2375.             $posAnswersQuery->addMust(new Range('geolocation.lng', [
  2376.                 'gte' => (float)$swLng,
  2377.                 'lte' => (float)$neLng
  2378.             ]));
  2379.             $resultQuery->addMust($posAnswersQuery);
  2380.         }
  2381.         // If filter by object type
  2382.         if ($id) {
  2383.             $resultQuery->addMust(new Query\Term(['mapObjectType.id' => $id]));
  2384.         }
  2385.         $query = new Query($resultQuery);
  2386.         // Return for map
  2387.         $query->setSource([
  2388.             'id',
  2389.             'isIdInitial',
  2390.             'legend',
  2391.             'answer.id',
  2392.             'answer.date',
  2393.             'answer.author.name''answer.author.lastName',
  2394.             'mapObjectType.id''mapObjectType.title',
  2395.             'mapObjectType.color''mapObjectType.icon',
  2396.             'geolocation.lat''geolocation.lng',
  2397.             'shape',
  2398.             'color']);
  2399.         $results $mapObjectsFinder->findRaw($query100000);
  2400.         $mapObjects = [];
  2401.         foreach ($results as $mapObject) {
  2402.             $mapObjects[] = $mapObject->getSource();
  2403.         }
  2404.         return $mapObjects;
  2405.     }
  2406.     #[Rest\Get('/api-map-object')]
  2407.     public function getMapObject(Request $request): JsonResponse
  2408.     {
  2409.         if (!$this->getUser()) {
  2410.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2411.         } else {
  2412.             $swLat $request->query->get('swLat'false);
  2413.             $swLng $request->query->get('swLng'false);
  2414.             $neLat $request->query->get('neLat'false);
  2415.             $neLng $request->query->get('neLng'false);
  2416.             $id $request->query->get('id'null);
  2417.             $mapObjects $this->mapObjectsElastica($swLat$swLng$neLat$neLng$id);
  2418. //                $answers = AnswerSerialization::serializeMapAnswers($answers);
  2419.             return new JsonResponse(json_encode($mapObjectsJSON_THROW_ON_ERROR), 200, [], true);
  2420.         }
  2421.     }
  2422.     #[Rest\Get('/api-map-object-types')]
  2423.     public function getMapObjectTypes(MapObjectTypeRepository $mapObjectTypeRepository): JsonResponse
  2424.     {
  2425.         if (!$this->getUser()) {
  2426.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2427.         } else {
  2428.             $mapObjects $mapObjectTypeRepository->findByUser($this->getUser());
  2429.             return new JsonResponse(json_encode(MapObjectTypeSerialization::serializeForMapMapObjectTypes($mapObjects$this->getUser()), JSON_THROW_ON_ERROR), 200, [], true);
  2430.         }
  2431.     }
  2432.     #[Rest\Get('/api-map-object-type')]
  2433.     public function getMapObjectType(MapObjectTypeRepository $mapObjectTypeRepositoryRequest $requestAnimalRepository $animalRepository): JsonResponse
  2434.     {
  2435.         if (!$this->getUser()) {
  2436.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2437.         } else {
  2438.             $mapObjectType $mapObjectTypeRepository->findOneById($request->query->get('id'));
  2439.             if ($mapObjectType->getEntity() != $this->getUser()->getSelectedEntity() && $this->role != 'ROLE_SUPER_ADMIN') {
  2440.                 return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2441.             }
  2442.             return new JsonResponse(json_encode(MapObjectTypeSerialization::serializeMapObjectTypeForEdit($mapObjectType$animalRepository), JSON_THROW_ON_ERROR), 200, [], true);
  2443.         }
  2444.     }
  2445.     #[Rest\Get('/api-admin-big-list')]
  2446.     public function getAdminBigList(BigListRepository $bigListRepository): JsonResponse
  2447.     {
  2448.         if (!$this->getUser()) {
  2449.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2450.         } else {
  2451.             $bigLists $bigListRepository->findByEntity($this->getUser()->getSelectedEntity());
  2452.             return new JsonResponse(json_encode(BigListSerialization::serializeBigLists($bigLists), JSON_THROW_ON_ERROR), 200, [], true);
  2453.         }
  2454.     }
  2455.     #[Rest\Get('/api-big-list')]
  2456.     public function getBigList(BigListRepository $bigListRepositoryEntityRepository $entityRepository): JsonResponse
  2457.     {
  2458.         if (!$this->getUser()) {
  2459.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2460.         } else {
  2461.             $entities $entityRepository->getUserAdminEntities($this->getUser()->getId());
  2462.             foreach ($this->getUser()->getUserEntities() as $userEntity) {
  2463.                 $entities[] = $userEntity->getEntity();
  2464.             }
  2465.             $bigLists $bigListRepository->findByEntities($entities);
  2466.             return new JsonResponse(json_encode(BigListSerialization::serializeBigListWithLiness($bigLists), JSON_THROW_ON_ERROR), 200, [], true);
  2467.         }
  2468.     }
  2469.     #[Rest\Get('/api-lines/{bigList}')]
  2470.     public function getLines(BigList $bigList): JsonResponse
  2471.     {
  2472.         if (!$this->getUser()) {
  2473.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2474.         } else {
  2475.             $lines $bigList->getListLines();
  2476.             return new JsonResponse(json_encode(LineSerialization::serializeLines($lines->getValues()), JSON_THROW_ON_ERROR), 200, [], true);
  2477.         }
  2478.     }
  2479.     #[Rest\Get('/api-map-object/{mapObject}/forms')]
  2480.     public function getMapObjectTypeForms(MapObject $mapObjectFormRepository $formRepository): JsonResponse
  2481.     {
  2482.         if (!$this->getUser()) {
  2483.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2484.         } else {
  2485.             $forms $formRepository->findBy(['isActive' => true'mapObjectType' => $mapObject->getMapObjectType()]);
  2486.             return new JsonResponse(json_encode(FormSerialization::serializeFormLinks($forms$this->encryptor), JSON_THROW_ON_ERROR), 200, [], true);
  2487.         }
  2488.     }
  2489.     #[Rest\Get('/api-clean-answer')]
  2490.     public function getCleanAnswer(AnswerRepository $answerRepositoryEntityManagerInterface $entityManager): JsonResponse
  2491.     {
  2492.         set_time_limit(0);
  2493.         if (!$this->getUser()) {
  2494.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2495.         } else {
  2496.             $answers $answerRepository->findAll();
  2497.             foreach ($answers as $answer) {
  2498.                 $change false;
  2499.                 foreach ($answer->getAnswerContents() as $answerContent) {
  2500.                     if ($answerContent->getField()->getForm() != $answer->getForm()) {
  2501.                         $answer->removeAnswerContent($answerContent);
  2502.                         $change true;
  2503.                     }
  2504.                 }
  2505.                 if ($change)
  2506.                     $answerRepository->add($answerfalse);
  2507.             }
  2508.             $entityManager->flush();
  2509.             return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2510.         }
  2511.     }
  2512.     #[Rest\Get('/api-clean-map-object')]
  2513.     public function getCleanMapObject(MapObjectRepository $mapObjectRepositoryEntityManagerInterface $entityManager): JsonResponse
  2514.     {
  2515.         set_time_limit(0);
  2516.         if (!$this->getUser()) {
  2517.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2518.         } else {
  2519.             $mapObjects $mapObjectRepository->findAll();
  2520.             foreach ($mapObjects as $mapObject) {
  2521.                 if ($mapObject->getAnswer() == null) {
  2522.                     $mapObjectRepository->remove($mapObjectfalse);
  2523.                 }
  2524.             }
  2525.             $entityManager->flush();
  2526.             return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2527.         }
  2528.     }
  2529.     #[Rest\Get('/api-get-map-object-history')]
  2530.     public function getMapObjectHistoryAction(Request             $requestAnswerRepository $answerRepository,
  2531.                                               MapObjectRepository $mapObjectRepositoryFieldRepository $fieldRepository,
  2532.                                               AnimalRepository    $animalRepositoryLineRepository $lineRepository): JsonResponse
  2533.     {
  2534.         if (!$this->getUser())
  2535.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2536.         $mapObject $mapObjectRepository->findOneBy(['id' => $request->query->get('id'null)]);
  2537.         if (in_array('ROLE_ADMIN'$this->getUser()->getRoles()) || in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles())) {
  2538.             $answers = [];
  2539.             if ($mapObject->isIsIdInitial()) {
  2540.                 $field $fieldRepository->findOneBy(['title' => "Id Initial""form" => $mapObject->getAnswer()->getForm()]);
  2541.                 foreach ($mapObject->getAnswer()->getAnswerContents() as $answerContent) {
  2542.                     if ($answerContent->getField() == $field) {
  2543.                         $answers = [$answerRepository->findOneBy(['id' => $answerContent->getContent()])];
  2544.                     }
  2545.                 }
  2546.             }
  2547.             $answers[] = $mapObject->getAnswer();
  2548.             $answers array_merge($answers$mapObject->getAnswers()->getValues());
  2549.         } else {
  2550.             $answers = [$mapObject->getAnswer()];
  2551.             if ($mapObject->isIsIdInitial()) {
  2552.                 if (count($answerRepository->findViewAnswer($mapObject->getAnswer(), $this->getUser())) > 0) {
  2553.                     $field $fieldRepository->findOneBy(['title' => "Id Initial""form" => $mapObject->getAnswer()->getForm()]);
  2554.                     foreach ($mapObject->getAnswer()->getAnswerContents() as $answerContent) {
  2555.                         if ($answerContent->getField() == $field) {
  2556.                             $answers = [$answerRepository->findOneBy(['id' => $answerContent->getContent()])];
  2557.                         }
  2558.                     }
  2559.                 }
  2560.                 foreach ($mapObject->getAnswers() as $answer) {
  2561.                     if ($answer->getAuthor() == $this->getUser()) {
  2562.                         $answers[] = $answer;
  2563.                     } else {
  2564.                         if (count($answerRepository->findViewAnswer($answer$this->getUser())) > 0) {
  2565.                             $answers[] = $answer;
  2566.                         }
  2567.                     }
  2568.                 }
  2569.             }
  2570.         }
  2571.         return new JsonResponse(json_encode(['answers' => AnswerSerialization::serializeFeedAnswers($answers$animalRepository$this->getUser(), $lineRepository)], JSON_THROW_ON_ERROR), 200, [], true);
  2572.     }
  2573.     #[Rest\Get('/api-map-territories')]
  2574.     public function getMapTerritories(Request $request): JsonResponse
  2575.     {
  2576.         if (!$this->getUser()) {
  2577.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2578.         } else {
  2579.             $swLat $request->query->get('swLat'false);
  2580.             $swLng $request->query->get('swLng'false);
  2581.             $neLat $request->query->get('neLat'false);
  2582.             $neLng $request->query->get('neLng'false);
  2583.             $territories $this->territoriesElastica($swLat$swLng$neLat$neLng);
  2584.             return new JsonResponse(json_encode($territoriesJSON_THROW_ON_ERROR), 200, [], true);
  2585.         }
  2586.     }
  2587.     #[Rest\Get('/api-territory-test')]
  2588.     public function getTerritoryTest(Request $requestTerritoryRepository $territoryRepository): JsonResponse
  2589.     {
  2590.         if (!$this->getUser()) {
  2591.             return new JsonResponse(json_encode('forbidden'), 403, [], true);
  2592.         } else {
  2593.             $territories $territoryRepository->findAll();
  2594.             foreach ($territories as $territory) {
  2595.                 if (!$territory->getShapes()->isEmpty()) {
  2596.                     dump($territory->getShapes()->getValues());
  2597.                     dd($territory);
  2598.                 } else {
  2599.                     dump($territory);
  2600.                 }
  2601.             }
  2602.             return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2603.         }
  2604.     }
  2605.     public function territoriesElastica(string|null $swLat nullstring|null $swLng nullstring|null $neLat nullstring|null $neLng null): array
  2606.     {
  2607.         $query = new Query();
  2608.         // Filtrer les territoires en fonction des coordonnées géographiques si fournies
  2609.         if ($swLat && $swLng && $neLat && $neLng) {
  2610.             $resultQuery = new BoolQuery();
  2611.             // Construire la requête Elasticsearch
  2612.             $posTerritoriesQuery = new BoolQuery();
  2613.             $posTerritoriesQuery->addMust(new Range('geolocations.lat', [
  2614.                 'gte' => (float)$swLat,
  2615.                 'lte' => (float)$neLat
  2616.             ]));
  2617.             $posTerritoriesQuery->addMust(new Range('geolocations.lng', [
  2618.                 'gte' => (float)$swLng,
  2619.                 'lte' => (float)$neLng
  2620.             ]));
  2621.             $resultQuery->addMust($posTerritoriesQuery);
  2622.             // Exécuter la requête Elasticsearch
  2623.             $query->setQuery($resultQuery);
  2624.         }
  2625.         $results $this->territoriesFinder->findRaw($query100000);
  2626.         $territories = [];
  2627.         foreach ($results as $territory) {
  2628.             $territories[] = $territory->getSource();
  2629.         }
  2630.         return $territories;
  2631.     }
  2632.     #[Rest\Get('/api-pdf')]
  2633.     public function testPdf(): void
  2634.     {
  2635.         $signature $this->imageToBase64("https://sirene.tech/assets/upload/publication/signature-6616a89fd5954.png");
  2636.         $html $this->renderView('email/fdc77Agrainage/pdf.html.twig', [
  2637.             'signature' => $signature
  2638.         ]);
  2639.         $dompdf = new Dompdf();
  2640.         $dompdf->loadHtml($html);
  2641.         $dompdf->render();
  2642.         $output $dompdf->output();
  2643.         $now = new \DateTime();
  2644.         $filename 'assets/' $now->getTimestamp() . '.pdf';
  2645.         file_put_contents($filename$output);
  2646.     }
  2647.     private function imageToBase64($path): string
  2648.     {
  2649.         $type pathinfo($pathPATHINFO_EXTENSION);
  2650.         $data file_get_contents($path);
  2651.         return 'data:image/' $type ';base64,' base64_encode($data);
  2652.     }
  2653.     #[Rest\Get('/api-clean-geoloc-object')]
  2654.     public function getCleanGeolocObject(EntityManagerInterface $entityManagerMapObjectRepository $mapObjectRepositoryGeolocationRepository $geolocationRepository): JsonResponse
  2655.     {
  2656.         //sql get geolocation with answer and mapObject
  2657.         $conn $entityManager->getConnection();
  2658.         $sql "SELECT DISTINCT a.geolocation_id,a.id as 'answer_id',m.id as 'map_object_id' FROM answer a INNER JOIN map_object m ON a.geolocation_id = m.geolocation_id;";
  2659.         $stmt $conn->prepare($sql);
  2660.         $geoloc $stmt->executeQuery();
  2661.         foreach ($geoloc->fetchAllAssociative() as $geolocItem) {
  2662.             $geoloc $geolocationRepository->findOneBy(['id' => $geolocItem['geolocation_id']]);
  2663.             $newGeoloc = new Geolocation();
  2664.             $newGeoloc->setLat($geoloc->getLat());
  2665.             $newGeoloc->setLng($geoloc->getLng());
  2666.             $newGeoloc->setCity($geoloc->getCity());
  2667.             $mapObject $mapObjectRepository->findOneBy(['id' => $geolocItem['map_object_id']]);
  2668.             $geolocationRepository->add($newGeoloc);
  2669.             $mapObject->setGeolocation($newGeoloc);
  2670.             $mapObjectRepository->save($mapObject);
  2671.         }
  2672.         $entityManager->flush();
  2673.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2674.     }
  2675.     #[Rest\Get('/api-clean-shape-object')]
  2676.     public function getCleanShapeObject(EntityManagerInterface $entityManagerMapObjectRepository $mapObjectRepositoryShapeRepository $shapeRepositoryShapeHasPointRepository $shapeHasPointRepository): JsonResponse
  2677.     {
  2678.         //sql get shape with answer and mapObject
  2679.         $conn $entityManager->getConnection();
  2680.         $sql "SELECT DISTINCT a.shape_id,a.id as 'answer_id',m.id as 'map_object_id' FROM answer a INNER JOIN map_object m ON a.shape_id = m.shape_id;";
  2681.         $stmt $conn->prepare($sql);
  2682.         $shape $stmt->executeQuery();
  2683.         foreach ($shape->fetchAllAssociative() as $shapeItem) {
  2684.             $shape $shapeRepository->findOneBy(['id' => $shapeItem['shape_id']]);
  2685.             $newShape = new Shape();
  2686.             $newShape->setType($shape->getType());
  2687.             foreach ($shape->getShapeHasPoints() as $shapeHasPoint) {
  2688.                 $newShapeHasPoint = new ShapeHasPoint();
  2689.                 $newShapeHasPoint->setLat($shapeHasPoint->getLat());
  2690.                 $newShapeHasPoint->setLng($shapeHasPoint->getLng());
  2691.                 $shapeHasPointRepository->add($newShapeHasPoint);
  2692.                 $newShapeHasPoint->setShape($newShape);
  2693.             }
  2694.             $shapeRepository->add($newShape);
  2695.             $mapObject $mapObjectRepository->findOneBy(['id' => $shapeItem['map_object_id']]);
  2696.             $mapObject->setShape($newShape);
  2697.             $mapObjectRepository->save($mapObject);
  2698.             $this->map_objectsPersister->replaceOne($mapObject);
  2699.         }
  2700.         $entityManager->flush();
  2701.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2702.     }
  2703.     #[Rest\Get('/api-clean-surface-fdc55')]
  2704.     public function getCleanSurfaceFdc55(Fdc55Fence $fdc55Fence): JsonResponse
  2705.     {
  2706.         $fdc55Fence->cleanSurface();
  2707.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2708.     }
  2709.     #[Rest\Get('/api-clean-oprhelin-fdc55')]
  2710.     public function getCleanOrphelinFdc55(Fdc55Fence $fdc55Fence): JsonResponse
  2711.     {
  2712.         $fdc55Fence->cleanOrphelinAnswer();
  2713.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2714.     }
  2715.     #[Rest\Get('/api-clean-shape-object-dev')]
  2716.     public function getCleanShapeDev(MapObjectRepository $mapObjectRepositoryShapeRepository $shapeRepositoryShapeHasPointRepository $shapeHasPointRepositoryEntityManagerInterface $entityManager): JsonResponse
  2717.     {
  2718.         $mapObjects $mapObjectRepository->findAll();
  2719.         foreach($mapObjects as $mapObject){
  2720.             if($mapObject->getGeolocation()->getLat() == 0){
  2721.                 $mapObject->getGeolocation()->setLat($mapObject->getAnswer()->getGeolocation()->getLat());
  2722.                 $mapObject->getGeolocation()->setLng($mapObject->getAnswer()->getGeolocation()->getLng());
  2723.                 $mapObjectRepository->save($mapObject,true);
  2724.             }
  2725.         }
  2726.         $this->map_objectsPersister->replaceMany($mapObjects);
  2727.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2728.     }
  2729.     #[Rest\Get('/api-test-mail-step-one')]
  2730.     public function getTestMailStepOne(Request $requestFdc77Agrainage $fdc77AgrainageAnswerRepository $answerRepository): JsonResponse
  2731.     {
  2732.         $answer $answerRepository->findOneBy(['id' => $request->query->get('id')]);
  2733.         $fdc77Agrainage->mailStepOneValidationTest($answer);
  2734.         return new JsonResponse(json_encode(trueJSON_THROW_ON_ERROR), 200, [], true);
  2735.     }
  2736. }