src/Controller/ReviewController.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Elastica\ReviewSearch;
  4. use App\Entity\Review;
  5. use App\Entity\ReviewImage;
  6. use App\Entity\User;
  7. use App\Entity\AgencyCode;
  8. use App\Form\ReviewSearchForm;
  9. use App\Service\FileUploader;
  10. use App\Service\GeocodingService;
  11. use App\Service\MailSender;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Cocur\Slugify\SlugifyInterface;
  14. use Symfony\Component\HttpFoundation\File\UploadedFile;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  19. use Symfony\Component\Translation\TranslatorInterface;
  20. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  21. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  22. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  23. class ReviewController extends AbstractController
  24. {
  25.     /**
  26.      * @var MailSender
  27.      */
  28.     private $mailSender;
  29.     /**
  30.      * @var TranslatorInterface
  31.      */
  32.     private $translator;
  33.     private $parameterBag;
  34.     public function __construct(MailSender $mailSender TranslatorInterface $translator,ParameterBagInterface $parameterBag)
  35.     {
  36.         $this->mailSender $mailSender;
  37.         $this->translator $translator;
  38.         $this->parameterBag $parameterBag;
  39.     }
  40.     /**
  41.      * Show review list
  42.      * @param Request $request
  43.      * @param ReviewSearch $reviewSearch
  44.      * @return Response
  45.      * @Route("/review/list/{type}", options={"expose"=true}, name="review_list")
  46.      */
  47.     public function listAction($type,Request $requestReviewSearch $reviewSearch)
  48.     {
  49.         
  50.         $paramsTerm $request->query->all();
  51.         if(array_key_exists("department",$paramsTerm) && $paramsTerm['department']!="" && array_key_exists("region",$paramsTerm) && $paramsTerm['region']!=""){
  52.             $paramsTerm['publisherType'] = intval($type);
  53.             $reviewResults $reviewSearch->searchPaginated($paramsTerm);
  54.             return $this->render('review/list.html.twig', [
  55.                 'total' => $reviewResults->getTotalItemCount(),
  56.                 'reviews' => $reviewResults,
  57.                 'urlQuery' =>  http_build_query($paramsTerm),
  58.                 'paramsTerm' => $paramsTerm,
  59.             ]);
  60.         }
  61.         $this->addFlash('warning''Cette page n\'existe pas ou a été supprimé!');
  62.         return $this->redirect($this->generateUrl('advertisement_search',$paramsTerm));
  63.     }
  64.     
  65.     /**
  66.  * Show Review
  67.  * @param Request $request
  68.  * @return Response
  69.  * @Route("/review/details/{id}/{slug}", name="review_show")
  70.  */
  71.     public function show(Review $review$slug,SlugifyInterface $slugify,Request $request)
  72.     {
  73.         if ($slug !== $slugify->slugify($review->getSlug())) {
  74.             throw new NotFoundHttpException();
  75.         }
  76.         if($review->getStatus()!= Review::STATUS_VALIDATE){
  77.             throw new NotFoundHttpException();
  78.         }
  79.         $referer $request->headers->get('referer');
  80.         return $this->render('review/show.html.twig', [
  81.             'review' => $review,
  82.             'referer' => $referer
  83.         ]);
  84.     }
  85.     /**
  86.      * Add new review
  87.      * @return Response
  88.      * @Route("/review/new", name="review_new")
  89.      */
  90.     public function newAction()
  91.     {
  92.         $securityContext $this->container->get('security.authorization_checker');
  93.         if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
  94.             $user $this->getUser();
  95.             if (in_array('ROLE_USER',$user->getRoles()) && $user->getUsername()=='' ) {
  96.                 $this->addFlash('error',"Compléter votre profil pour accéder à toutes les fonctionnalités du site!");
  97.                 return $this->redirectToRoute('user_account');
  98.             }
  99.             if (in_array('ROLE_PRO'$user->getRoles())) {
  100.                 if($user->getAgency() == null){
  101.                     $this->addFlash('error'"Compléter votre profil pour accéder à toutes les fonctionnalités du site!");
  102.                     return $this->redirectToRoute('complete_profil');
  103.                 }else{
  104.                     $this->addFlash('error'"Vous n'êtes pas autorisé à poster des avis!");
  105.                     return $this->redirectToRoute('homepage');
  106.                 }
  107.             }
  108.         }
  109.         return $this->render('review/new.html.twig',[]);
  110.     }
  111.     /**
  112.      * Publish new review
  113.      * @return Response
  114.      * @Route("/review/publish", name="review_publish")
  115.      */
  116.     public function publishedMessageAction()
  117.     {
  118.         return $this->render('review/finish.html.twig',[]);
  119.     }
  120.     
  121.     /**
  122.      * Remove review
  123.      * @param Review $review
  124.      * @return JsonResponse
  125.      * @Route("/review/remove/{id}", name="remove_review")
  126.      */
  127.     public function removeReview(Review $review)
  128.     {
  129.         $user $this->getUser();
  130.         if ($user->getId() !== $review->getUser()->getId()) {
  131.             $message "Opération non autorisée!";
  132.             $error true;
  133.         } else {
  134.             $em $this->getDoctrine()->getManager();
  135.             $review->setStatus(Review::STATUS_INACTIVE);
  136.             $em->flush();
  137.             $message "Avis supprimé avec succès!";
  138.             $error false;
  139.         }
  140.         return new JsonResponse(['error' => $error"message" => $message]);
  141.     }
  142.     
  143.     
  144.     /**
  145.      * Save review appreciation
  146.      * @param Request $request
  147.      * @return JsonResponse
  148.      * @Route("/review/helpful/save/{id}", name="save_helpful")
  149.      */
  150.     public function saveHelpfulAction(Review $review,Request $request)
  151.     {
  152.         $user $this->getUser();
  153.         $em $this->getDoctrine()->getManager();
  154.             if (!$user->hasHelpfulReviews($review)) {
  155.                 $review->setHelpfulCount($review->getHelpfulCount()+1);
  156.                 $user->addHelpfulReviews($review);
  157.                 $em->flush();
  158.             } else {
  159.                 if($review->getHelpfulCount()>1){
  160.                     $review->setHelpfulCount($review->getHelpfulCount()-1);
  161.                 }else{
  162.                     $review->setHelpfulCount(0);
  163.                 }
  164.                 $user->removeHelpfulReviews($review);
  165.                 $em->flush();
  166.             }
  167.         
  168.         return new JsonResponse();
  169.     }
  170.     
  171.     
  172.     
  173.     /**
  174.      * Save a review
  175.      * @param Request $request
  176.      * @param FileUploader $uploader
  177.      * @return Response
  178.      * @Route("/review/save", name="save_review")
  179.      */
  180.     public function saveReview(Request $requestFileUploader $uploader)
  181.     {
  182.         try{
  183.             $message 'Nouvel avis publié !';
  184.             $message_type 'success';
  185.             $em $this->getDoctrine()->getManager();
  186.             $securityContext $this->container->get('security.authorization_checker');
  187.             $is_logged true;
  188.             if (!$securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
  189.                 $user_email  $em->getRepository('App\Entity\User')->findOneBy(['email' => $request->get('email')]);
  190.                 if($user_email!=null){
  191.                     $this->addFlash('error''Cette adresse email est déjà enregistré! Veuillez-vous connecter à votre compte pour poster un avis!');
  192.                     return $this->redirectToRoute('security_login');
  193.                 }
  194.                 $user = new User();
  195.                 $user->setRoles(['ROLE_USER']);
  196.                 $user->setEmail($request->get('email'));
  197.                 $user->setPlainPassword($request->get('plainPassword'));
  198.                 $user->setFirstname($request->get('firstname'));
  199.                 $user->setLastname($request->get('lastname'));
  200.                 $user->setCreatedAt(new \DateTime());
  201.                 $user->setUsername($request->get('username'));
  202.                 $ip $request->getClientIp();
  203.                 $user->setIpAddress($ip);
  204.                 $token rtrim(strtr(base64_encode(random_bytes(32)), '+/''-_'), '=');
  205.                 $user->setValidationToken($token);
  206.                 $user->setStatus(User::STATUS_INACTIVE);
  207.                 $user->setIsPublisher(true);
  208.                 $em->persist($user);
  209.                 $em->flush();
  210.                 $this->mailSender->sendActivationCode($user);
  211.                 $message "Vous allez recevoir un e-mail de confirmation à l'adresse que vous avez saisie";
  212.                 $message_type 'report';
  213.                 $is_logged false;
  214.             } else {
  215.                 $user $this->getUser();
  216.             }
  217.             $review = new Review();
  218.             $geocodingService = new GeocodingService($_ENV['GEOCODING_API_KEY'],$em);
  219.             $address $request->get('address');
  220.             $city $geocodingService->decodeAddress($address);
  221.             if($city==null){
  222.                 $this->addFlash('warning''L\'adresse renseigné est incorrecte!');
  223.                 return $this->redirectToRoute('review_new');
  224.             }
  225.             $review->setAddress($address);
  226.             $review->setPostalCode($city->getPostalCode());
  227.             $review->setCity($city->getCity());
  228.             $review->setDepartment($city->getDepartment()->getShortName());
  229.             $review->setRegion($city->getDepartment()->getRegion()->getLongName());
  230.             $review->setLongitude(floatval($city->getLongitude()));
  231.             $review->setLatitude(floatval($city->getLatitude()));
  232.             $review->setUser($user);
  233.             $review->setPublicationDate(new \DateTime());
  234.             $review->setPublisherType(1);
  235.             $pictures $request->files->get('pictures');    
  236.             if ($pictures) {
  237.                 foreach ($pictures as $image) {
  238.                     if ($image instanceof UploadedFile && in_array($image->getMimeType(), ['image/png''image/jpg','image/jpeg'])) {
  239.                         $imageName $uploader->uploadImage($image);
  240.                         $file = new ReviewImage();
  241.                         $file->setPath($imageName);
  242.                         $file->setName($image->getClientOriginalName());
  243.                         if (!$image->isFile()) {
  244.                             continue;
  245.                         }
  246.                         $file->setSize($image->getClientSize());
  247.                         $file->setReview($review);
  248.                         $review->addImage($file);
  249.                     }
  250.                 }
  251.             }
  252.             
  253.             
  254.             //Step 4
  255.             $life $this->checkRatingField($request->get('life'));
  256.             $security $this->checkRatingField($request->get('security'));
  257.             $transports $this->checkRatingField($request->get('transports'));
  258.             $greenArea $this->checkRatingField($request->get('greenArea'));
  259.             $shops $this->checkRatingField($request->get('shops'));
  260.             $leisure $this->checkRatingField($request->get('leisure'));
  261.             $global $this->checkRatingField($request->get('globalRanking'));
  262.             $water $this->checkRatingField($request->get('water'));
  263.             $electricity $this->checkRatingField($request->get('electricity'));
  264.             $review->setGlobal($global);
  265.             $review->setLife($life);
  266.             $review->setSecurity($security);
  267.             $review->setTransports($transports);
  268.             $review->setGreenArea($greenArea);
  269.             $review->setShops($shops);
  270.             $review->setSportsLeisure($leisure);
  271.             $review->setWater($water);
  272.             $review->setElectricity($electricity);
  273.             $reviewDescription $request->get('review');
  274.             $review->setReview(trim($reviewDescription));
  275.             $deal $request->get('deal');
  276.             if(isset($deal)){
  277.                 $review->setDeal(trim($deal));
  278.             }
  279.             $improvements $request->get('improvements');
  280.             if(isset($improvements) && is_array($improvements)){
  281.                 $review->setImprovements(implode(",",$improvements));
  282.             }
  283.             $improvements_suggestion $request->get('improvements_suggestion');
  284.             if(isset($improvements_suggestion)){
  285.                 $review->setImprovementsSuggestion($improvements_suggestion);
  286.             }
  287.             $agency_code $request->get('agency_code');
  288.             if(isset($agency_code) && $agency_code!=''){
  289.                 $review->setAgencyCode($agency_code);
  290.             }
  291.             if($is_logged){
  292.                 $review->setStatus(Review::STATUS_VALIDATE);
  293.             }else{
  294.                 $review->setStatus(Review::STATUS_DISABLE);
  295.             }
  296.             $agencyCode $em->getRepository(AgencyCode::class)->findOneBy(['agencyCode' => $agency_code]);
  297.             if($agencyCode){
  298.                 $agencyCode->setCount($agencyCode->getCount() + 1);
  299.                 $em->persist($agencyCode);
  300.             }
  301.             $em->persist($review);
  302.             $em->flush();
  303.             $this->addFlash($message_type$message);
  304.             if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
  305.                 return $this->redirectToRoute('review_publish');
  306.             }else{
  307.                 return $this->redirectToRoute('homepage');
  308.             }
  309.         }catch(\Exception $ex){
  310.             $this->addFlash('error''Oup! Une erreur est survenue! Veuillez réessayer plus tard!');
  311.             echo $ex->getMessage();
  312.             return $this->redirectToRoute('homepage');
  313.         }
  314.     }
  315.     private function createUsername(User $user){
  316.         $em $this->getDoctrine();
  317.         $firstname explode' ',trim($user->getFirstname()));
  318.         $lastname =  explode' ',trim($user->getLastname()));
  319.         $firstname $firstname[0];
  320.         $lastname $lastname[0];
  321.         $username strtolower$firstname '.' $lastname );
  322.         $list $em->getEntityManager()->getRepositoryUser::class )->findBy(['username'=>$username]);
  323.         $length sizeof($list);
  324.         if($length>0){
  325.             $username $username.".";
  326.             $list $em->getEntityManager()->getRepositoryUser::class )->getUserByUsername($username);
  327.             $length sizeof($list);
  328.             if($length == 0){
  329.                 $username $username."1";
  330.             }else{
  331.                 $username $username.($length+1);
  332.             }
  333.         }
  334.         $user->setUsername($username);
  335.     }
  336.     private function checkRatingField($field){
  337.         $field intval($field);
  338.         if($field<0){
  339.             $field 1;
  340.         }
  341.         if($field>5){
  342.             $field 5;
  343.         }
  344.         return $field;
  345.     }
  346. }