src/Controller/ShopReviewController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Shop;
  4. use App\Entity\ShopReview;
  5. use App\Form\ShopReviewType;
  6. use App\Repository\ShopReviewRepository;
  7. use App\Service\ShopReviewService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\Security\Http\Attribute\IsGranted;
  15. #[Route('/shop/{slug}/reviews'name'shop_reviews_')]
  16. class ShopReviewController extends AbstractController
  17. {
  18.     private ShopReviewService $shopReviewService;
  19.     private EntityManagerInterface $entityManager;
  20.     private ShopReviewRepository $shopReviewRepository;
  21.     public function __construct(ShopReviewService $shopReviewServiceEntityManagerInterface $entityManager)
  22.     {
  23.         $this->shopReviewService $shopReviewService;
  24.         $this->entityManager $entityManager;
  25.         $this->shopReviewRepository $entityManager->getRepository(ShopReview::class);
  26.     }
  27.     #[Route(''name'index'methods: ['GET'])]
  28.     public function index(Shop $shopRequest $request): Response
  29.     {
  30.         $page = (int) $request->query->get('page'1);
  31.         $limit 10;
  32.         
  33.         $filters = [
  34.             'rating' => $request->query->get('rating'),
  35.             'verified' => $request->query->get('verified') === '1',
  36.             'search' => $request->query->get('search')
  37.         ];
  38.         $reviewsData $this->shopReviewService->getShopReviews($shop$page$limit$filters);
  39.         $stats $this->shopReviewService->getShopReviewStats($shop);
  40.         // Vérifier si l'utilisateur connecté peut laisser un avis
  41.         $canReview false;
  42.         $userReview null;
  43.         
  44.         if ($this->getUser()) {
  45.             $canReview = !$this->shopReviewRepository->hasUserReviewedShop($this->getUser(), $shop);
  46.             if (!$canReview) {
  47.                 $userReview $this->shopReviewRepository->findOneBy(['user' => $this->getUser(), 'shop' => $shop]);
  48.             }
  49.         }
  50.         return $this->render('shop/reviews/index.html.twig', [
  51.             'shop' => $shop,
  52.             'reviews' => $reviewsData['reviews'],
  53.             'stats' => $stats,
  54.             'pagination' => [
  55.                 'page' => $reviewsData['page'],
  56.                 'pages' => $reviewsData['pages'],
  57.                 'total' => $reviewsData['total']
  58.             ],
  59.             'filters' => $filters,
  60.             'canReview' => $canReview,
  61.             'userReview' => $userReview
  62.         ]);
  63.     }
  64.     #[Route('/new'name'new'methods: ['GET''POST'])]
  65.     #[IsGranted('ROLE_USER')]
  66.     public function new(Shop $shopRequest $request): Response
  67.     {
  68.         // Vérifier si l'utilisateur peut laisser un avis
  69.         if ($this->shopReviewRepository->hasUserReviewedShop($this->getUser(), $shop)) {
  70.             $this->addFlash('error''Vous avez déjà laissé un avis pour cette boutique');
  71.             return $this->redirectToRoute('shop_reviews_index', ['slug' => $shop->getSlug()]);
  72.         }
  73.         $review = new ShopReview();
  74.         $form $this->createForm(ShopReviewType::class, $review);
  75.         $form->handleRequest($request);
  76.         if ($form->isSubmitted() && $form->isValid()) {
  77.             $data = [
  78.                 'rating' => $review->getRating(),
  79.                 'comment' => $review->getComment(),
  80.                 'reviewType' => $review->getReviewType()
  81.             ];
  82.             $result $this->shopReviewService->createReview($this->getUser(), $shop$data);
  83.             if ($result['success']) {
  84.                 $this->addFlash('success'$result['message']);
  85.                 return $this->redirectToRoute('shop_reviews_index', ['slug' => $shop->getSlug()]);
  86.             } else {
  87.                 $this->addFlash('error'$result['message']);
  88.             }
  89.         }
  90.         return $this->render('shop/reviews/new.html.twig', [
  91.             'shop' => $shop,
  92.             'form' => $form->createView()
  93.         ]);
  94.     }
  95.     #[Route('/{id}/edit'name'edit'methods: ['GET''POST'])]
  96.     #[IsGranted('ROLE_USER')]
  97.     public function edit(Shop $shopShopReview $reviewRequest $request): Response
  98.     {
  99.         // Vérifier que l'utilisateur est le propriétaire de l'avis
  100.         if ($review->getUser() !== $this->getUser()) {
  101.             throw $this->createAccessDeniedException('Vous ne pouvez pas modifier cet avis');
  102.         }
  103.         $form $this->createForm(ShopReviewType::class, $review);
  104.         $form->handleRequest($request);
  105.         if ($form->isSubmitted() && $form->isValid()) {
  106.             $data = [
  107.                 'rating' => $review->getRating(),
  108.                 'comment' => $review->getComment(),
  109.                 'reviewType' => $review->getReviewType()
  110.             ];
  111.             $result $this->shopReviewService->updateReview($review$data);
  112.             if ($result['success']) {
  113.                 $this->addFlash('success'$result['message']);
  114.                 return $this->redirectToRoute('shop_reviews_index', ['slug' => $shop->getSlug()]);
  115.             } else {
  116.                 $this->addFlash('error'$result['message']);
  117.             }
  118.         }
  119.         return $this->render('shop/reviews/edit.html.twig', [
  120.             'shop' => $shop,
  121.             'review' => $review,
  122.             'form' => $form->createView()
  123.         ]);
  124.     }
  125.     #[Route('/{id}/delete'name'delete'methods: ['POST'])]
  126.     #[IsGranted('ROLE_USER')]
  127.     public function delete(Shop $shopShopReview $reviewRequest $request): Response
  128.     {
  129.         // Vérifier que l'utilisateur est le propriétaire de l'avis
  130.         if ($review->getUser() !== $this->getUser()) {
  131.             throw $this->createAccessDeniedException('Vous ne pouvez pas supprimer cet avis');
  132.         }
  133.         if ($this->isCsrfTokenValid('delete' $review->getId(), $request->request->get('_token'))) {
  134.             $result $this->shopReviewService->deleteReview($review);
  135.             $this->addFlash('success'$result['message']);
  136.         }
  137.         return $this->redirectToRoute('shop_reviews_index', ['slug' => $shop->getSlug()]);
  138.     }
  139.     #[Route('/{id}/helpful'name'helpful'methods: ['POST'])]
  140.     public function markAsHelpful(Shop $shopShopReview $reviewRequest $request): JsonResponse
  141.     {
  142.         if ($request->isXmlHttpRequest()) {
  143.             $user $this->getUser();
  144.             $result $this->shopReviewService->markAsHelpful($review$user);
  145.             return new JsonResponse($result);
  146.         }
  147.         return new JsonResponse(['success' => false'message' => 'Requête invalide']);
  148.     }
  149.     #[Route('/{id}/not-helpful'name'not_helpful'methods: ['POST'])]
  150.     public function markAsNotHelpful(Shop $shopShopReview $reviewRequest $request): JsonResponse
  151.     {
  152.         if ($request->isXmlHttpRequest()) {
  153.             $user $this->getUser();
  154.             $result $this->shopReviewService->markAsNotHelpful($review$user);
  155.             return new JsonResponse($result);
  156.         }
  157.         return new JsonResponse(['success' => false'message' => 'Requête invalide']);
  158.     }
  159.     #[Route('/stats'name'stats'methods: ['GET'])]
  160.     public function stats(Shop $shop): JsonResponse
  161.     {
  162.         $stats $this->shopReviewService->getShopReviewStats($shop);
  163.         return new JsonResponse($stats);
  164.     }
  165.     #[Route('/filter'name'filter'methods: ['GET'])]
  166.     public function filter(Shop $shopRequest $request): JsonResponse
  167.     {
  168.         $page = (int) $request->query->get('page'1);
  169.         $limit 10;
  170.         
  171.         $filters = [
  172.             'rating' => $request->query->get('rating'),
  173.             'verified' => $request->query->get('verified') === '1',
  174.             'search' => $request->query->get('search')
  175.         ];
  176.         $reviewsData $this->shopReviewService->getShopReviews($shop$page$limit$filters);
  177.         return new JsonResponse([
  178.             'reviews' => $reviewsData['reviews'],
  179.             'pagination' => [
  180.                 'page' => $reviewsData['page'],
  181.                 'pages' => $reviewsData['pages'],
  182.                 'total' => $reviewsData['total']
  183.             ]
  184.         ]);
  185.     }
  186. }