custom/plugins/CioCustomerMailbox/src/Controller/MailboxController.php line 68

Open in your IDE?
  1. <?php
  2. namespace CioCustomerMailbox\Controller;
  3. use CioBudget\Service\BudgetHistoryService;
  4. use CioBudget\Service\BudgetInfoService;
  5. use CioBudget\Service\BudgetLoaderService;
  6. use CioCustomerMailbox\Definition\Message\MessageEntity;
  7. use CioCustomerPermissionGroups\Service\CustomerPermissionService;
  8. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  9. use Shopware\Core\Framework\Context;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  18. use Shopware\Core\Framework\Struct\ArrayStruct;
  19. use Shopware\Core\Framework\Uuid\Uuid;
  20. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  21. use Shopware\Storefront\Controller\StorefrontController;
  22. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  23. use Shopware\Storefront\Page\GenericPageLoader;
  24. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. /**
  29.  * @RouteScope(scopes={"storefront"})
  30.  */
  31. class MailboxController extends StorefrontController
  32. {
  33.     private GenericPageLoader $pageLoader;
  34.     private CustomerPermissionService $customerPermissionsService;
  35.     /**
  36.      * @var EntityRepository
  37.      */
  38.     protected EntityRepository $cioMessageRepository;
  39.     /**
  40.      * @var EntityRepository
  41.      */
  42.     protected EntityRepository $cioMessageContentRepository;
  43.     public function __construct(
  44.         GenericPageLoader         $pageLoader,
  45.         CustomerPermissionService $customerPermissionsService,
  46.         EntityRepository $cioMessageRepository,
  47.         EntityRepository $cioMessageContentRepository
  48.     )
  49.     {
  50.         $this->customerPermissionsService $customerPermissionsService;
  51.         $this->pageLoader $pageLoader;
  52.         $this->cioMessageRepository $cioMessageRepository;
  53.         $this->cioMessageContentRepository $cioMessageContentRepository;
  54.     }
  55.     /**
  56.      * @Route("/account/mailbox", name="storefront.account.mailbox.home", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  57.      * @param Request $request
  58.      * @param SalesChannelContext $context
  59.      * @return Response
  60.      */
  61.     public function mailbox(Request $requestSalesChannelContext $context)
  62.     {
  63.         if (is_null($context->getCustomer())) {
  64.             throw new CustomerNotLoggedInException();
  65.         }
  66.         $page $this->pageLoader->load($request$context);
  67.         $criteria = new Criteria();
  68.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  69.         return $this->renderStorefront('@CioCustomerMailbox/storefront/page/account/mailbox.html.twig', ['page' => $page]);
  70.     }
  71.     /**
  72.      * @Route("/account/mailbox/list", name="storefront.account.mailbox.list", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  73.      * @param Request $request
  74.      * @param SalesChannelContext $context
  75.      * @return Response
  76.      */
  77.     public function list(Request $requestSalesChannelContext $context)
  78.     {
  79.         if (is_null($context->getCustomer())) {
  80.             throw new CustomerNotLoggedInException();
  81.         }
  82.         $page $request->query->getInt('page'1);
  83.         $category $request->query->get('category''inbox');
  84.         $search $request->query->get('search');
  85.         $criteria = new Criteria();
  86.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  87.         $criteria->addSorting((new FieldSorting('message_content.number'FieldSorting::DESCENDING)));
  88.         $criteria->setLimit(20);
  89.         $criteria->setOffset(($page 1) * 20);
  90.         $criteria->addAssociation('message_content');
  91.         if ($category === 'important') {
  92.             $criteria->addFilter(new EqualsFilter('message_content.important'1));
  93.             $criteria->addFilter(new EqualsFilter('read_at'null));
  94.         } else if ($category === 'read') {
  95.             $criteria->addFilter(new NotFilter(NotFilter::CONNECTION_OR, [
  96.                 new EqualsFilter('read_at'null)
  97.             ]));
  98.         } else if ($category === 'bookmark') {
  99.             $criteria->addFilter(new EqualsFilter('bookmark'true));
  100.         } else {
  101.             $criteria->addFilter(new EqualsFilter('read_at'null));
  102.         }
  103.         if ($search) {
  104.             $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  105.                 new ContainsFilter('message_content.subject'$search),
  106.                 new ContainsFilter('message_content.content'$search)
  107.             ]));
  108.         }
  109.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  110.             new EqualsFilter('message_content.visible_from'null),
  111.             new RangeFilter('message_content.visible_from', [
  112.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  113.             ])
  114.         ]));
  115.         $messages $this->cioMessageRepository->search($criteria$context->getContext());
  116.         /** @var MessageEntity $message */
  117.         foreach ($messages->getEntities() as $message) {
  118.             $shortMessage html_entity_decode(strip_tags($message->getMessageContent()->getContent()));
  119.             $message->addExtension('runtime', new ArrayStruct([
  120.                 'shortMessage' => substr($shortMessage075) . (strlen($shortMessage) > 75 '...' ''),
  121.             ]));
  122.         }
  123.         return $this->json($messages);
  124.     }
  125.     /**
  126.      * @Route("/account/mailbox/list/count", name="storefront.account.mailbox.list.count", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  127.      * @param Request $request
  128.      * @param SalesChannelContext $context
  129.      * @return Response
  130.      */
  131.     public function countMessages(Request $requestSalesChannelContext $context)
  132.     {
  133.         if (is_null($context->getCustomer())) {
  134.             throw new CustomerNotLoggedInException();
  135.         }
  136.         $criteria = new Criteria();
  137.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  138.         $criteria->addFilter(new EqualsFilter('read_at'null));
  139.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  140.             new EqualsFilter('message_content.visible_from'null),
  141.             new RangeFilter('message_content.visible_from', [
  142.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  143.             ])
  144.         ]));
  145.         $inboxCount $this->cioMessageRepository->search($criteria$context->getContext())->getTotal();
  146.         $criteria = new Criteria();
  147.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  148.         $criteria->addFilter(new EqualsFilter('read_at'null));
  149.         $criteria->addFilter(new EqualsFilter('message_content.important'1));
  150.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  151.             new EqualsFilter('message_content.visible_from'null),
  152.             new RangeFilter('message_content.visible_from', [
  153.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  154.             ])
  155.         ]));
  156.         $importantCount $this->cioMessageRepository->search($criteria$context->getContext())->getTotal();
  157.         return $this->json(['inbox' => $inboxCount'important' => $importantCount]);
  158.     }
  159.     /**
  160.      * @Route("/account/mailbox/{id}/markasread", name="storefront.account.mailbox.markasread", methods={"GET"})
  161.      * @param Request $request
  162.      * @param SalesChannelContext $context
  163.      * @return Response
  164.      */
  165.     public function markAsRead(Request $requestSalesChannelContext $context)
  166.     {
  167.         if (is_null($context->getCustomer())) {
  168.             throw new CustomerNotLoggedInException();
  169.         }
  170.         $id $request->get('id');
  171.         $criteria = new Criteria();
  172.         $criteria->addFilter(new EqualsFilter('id'$id));
  173.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  174.         $message $this->cioMessageRepository->search($criteria$context->getContext())->first();
  175.         if ($message instanceof MessageEntity) {
  176.             $this->cioMessageRepository->update([[
  177.                 'id' => $id,
  178.                 'read_at' => new \DateTime()
  179.             ]], $context->getContext());
  180.             return $this->json(['success' => true]);
  181.         }
  182.         return $this->json(['success' => false]);
  183.     }
  184.     /**
  185.      * @Route("/account/mailbox/{id}/togglebookmark", name="storefront.account.mailbox.togglebookmark", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  186.      * @param Request $request
  187.      * @param SalesChannelContext $context
  188.      * @return Response
  189.      */
  190.     public function toggleBookmark(Request $requestSalesChannelContext $context)
  191.     {
  192.         if (is_null($context->getCustomer())) {
  193.             throw new CustomerNotLoggedInException();
  194.         }
  195.         $id $request->get('id');
  196.         $criteria = new Criteria();
  197.         $criteria->addFilter(new EqualsFilter('id'$id));
  198.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  199.         $message $this->cioMessageRepository->search($criteria$context->getContext())->first();
  200.         if ($message instanceof MessageEntity) {
  201.             $this->cioMessageRepository->update([[
  202.                 'id' => $id,
  203.                 'bookmark' => !$message->getBookmark()
  204.             ]], $context->getContext());
  205.             return $this->json(['success' => true]);
  206.         }
  207.         return $this->json(['success' => false]);
  208.     }
  209. }