src/Controller/Messenger/MessengerController.php line 116

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Messenger;
  3. use App\Security\ApiUser;
  4. use App\Service\Client\Messenger\MessengerService;
  5. use App\Service\Client\User\MemberPropertyService;
  6. use App\Service\Client\User\MemberService;
  7. use Psr\Log\LoggerInterface;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  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\HttpKernel\Exception\HttpException;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. /**
  16.  * @Route("/messenger")
  17.  */
  18. class MessengerController extends AbstractController
  19. {
  20.     /**
  21.      * @var MemberService
  22.      */
  23.     protected MemberService $memberService;
  24.     /**
  25.      * @var MessengerService
  26.      */
  27.     protected MessengerService $messengerService;
  28.     /**
  29.      * @var MemberPropertyService
  30.      */
  31.     protected MemberPropertyService $propertyService;
  32.     /**
  33.      * @param MessengerService $messengerService
  34.      * @param MemberService $memberService
  35.      * @param MemberPropertyService $propertyService
  36.      */
  37.     public function __construct(MessengerService $messengerService,
  38.                                 MemberService $memberServiceMemberPropertyService $propertyService)
  39.     {
  40.         $this->messengerService $messengerService;
  41.         $this->memberService $memberService;
  42.         $this->propertyService $propertyService;
  43.     }
  44.     /**
  45.      * @Route("/", methods={"GET"})
  46.      * @Template()
  47.      */
  48.     public function index()
  49.     {
  50.         $this->denyAccessUnlessGranted('ROLE_MEMBER');
  51.         /**
  52.          * @var $user ApiUser
  53.          */
  54.         $user $this->getUser();
  55.         $memberId $user->getMemberId();
  56.         $initialFilter $this->isGranted('ROLE_AMATEUR') ?
  57.             'frivol.messenger.filters.unanswered' :
  58.             'frivol.messenger.filters.inbox';
  59.         $shortName substr($initialFilterstrrpos($initialFilter'.') + 1);
  60.         $initialConversation = new \stdClass();
  61.         if(!$this->isMobile()) {
  62.             $paginator $this->messengerService->getConversationsForMember($shortName$memberId11);
  63.             $initialConversation current($paginator->getItems());
  64.             if(!$initialConversation) {
  65.                 $initialConversation = new \stdClass();
  66.             }
  67.         }
  68.         return [
  69.             'appConfig' => [
  70.                 'initialConversation' => $initialConversation,
  71.                 'initialFilterName' => $initialFilter,
  72.                 'attachmentCost' => $user->hasRole('ROLE_ADMIN') ? :
  73.                         $this->propertyService->getMessengerProperties($memberId)['attachmentCost']
  74.             ]
  75.         ];
  76.     }
  77.     /**
  78.      * @return bool
  79.      */
  80.     protected function isMobile(): bool
  81.     {
  82.         if(empty($_SERVER['HTTP_USER_AGENT'])) {
  83.             return false;
  84.         }
  85.         $pattern "/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i";
  86.         return preg_match($pattern$_SERVER["HTTP_USER_AGENT"]);
  87.     }
  88.     /**
  89.      * @Route("/chat/{username}", methods={"GET"})
  90.      * @Template("/messenger/messenger/index.html.twig")
  91.      *
  92.      * @param Request $request
  93.      * @param string $username
  94.      * @return array|JsonResponse|\Symfony\Component\HttpKernel\Exception\NotFoundHttpException
  95.      * @throws \Psr\Cache\InvalidArgumentException
  96.      * @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
  97.      * @throws \Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface
  98.      * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
  99.      * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
  100.      * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
  101.      */
  102.     public function chat(Request $requeststring $username)
  103.     {
  104.         $this->denyAccessUnlessGranted('ROLE_MEMBER');
  105.         if(!$recipient $this->memberService->getMemberDetailByUsername($username)) {
  106.             return $this->createNotFoundException('User not found');
  107.         }
  108.         /** @var ApiUser $user */
  109.         $user $this->getUser();
  110.         $memberId $user->getMemberId();
  111.         if($memberId === $recipient['id']) {
  112.             return new JsonResponse([
  113.                 'message' => 'Fehler: Du kannst Dir nicht selbst schreiben.'
  114.             ], Response::HTTP_FORBIDDEN);
  115.         }
  116.         $conversation $this->messengerService->createConversation($memberId$recipient['id']);
  117.         if($request->isXmlHttpRequest()) {
  118.             return new JsonResponse($conversation);
  119.         }
  120.         return [
  121.             'appConfig' => [
  122.                 'initialConversation' => $conversation,
  123.                 'initialFilterName' => 'frivol.messenger.filters.inbox',
  124.                 'attachmentCost' => $user->hasRole('ROLE_ADMIN') ? :
  125.                     $this->propertyService->getMessengerProperties($memberId)['attachmentCost']
  126.             ]
  127.         ];
  128.     }
  129.     /**
  130.      * @Route("/messages/{conversation}", methods={"POST"}, requirements={"conversation": "\d+"})
  131.      *
  132.      * @param Request $request
  133.      * @param int $conversation
  134.      * @return JsonResponse
  135.      */
  136.     public function send(Request $requestint $conversation): JsonResponse
  137.     {
  138.         $this->denyAccessUnlessGranted('ROLE_OPERATOR');
  139.         $input json_decode($request->getContent(), true);
  140.         $input['operator'] = $this->getUser()->getMemberId();
  141.         try {
  142.             $result $this->messengerService->sendMessage($conversation$input);
  143.         } catch(HttpException $e) {
  144.             return new JsonResponse([
  145.                 'message' => $e->getMessage()
  146.             ], $e->getStatusCode());
  147.         }
  148.         return new JsonResponse($resultResponse::HTTP_CREATED);
  149.     }
  150. }