<?php
namespace App\Controller\Messenger;
use App\Security\ApiUser;
use App\Service\Client\Messenger\MessengerService;
use App\Service\Client\User\MemberPropertyService;
use App\Service\Client\User\MemberService;
use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/messenger")
*/
class MessengerController extends AbstractController
{
/**
* @var MemberService
*/
protected MemberService $memberService;
/**
* @var MessengerService
*/
protected MessengerService $messengerService;
/**
* @var MemberPropertyService
*/
protected MemberPropertyService $propertyService;
/**
* @param MessengerService $messengerService
* @param MemberService $memberService
* @param MemberPropertyService $propertyService
*/
public function __construct(MessengerService $messengerService,
MemberService $memberService, MemberPropertyService $propertyService)
{
$this->messengerService = $messengerService;
$this->memberService = $memberService;
$this->propertyService = $propertyService;
}
/**
* @Route("/", methods={"GET"})
* @Template()
*/
public function index()
{
$this->denyAccessUnlessGranted('ROLE_MEMBER');
/**
* @var $user ApiUser
*/
$user = $this->getUser();
$memberId = $user->getMemberId();
$initialFilter = $this->isGranted('ROLE_AMATEUR') ?
'frivol.messenger.filters.unanswered' :
'frivol.messenger.filters.inbox';
$shortName = substr($initialFilter, strrpos($initialFilter, '.') + 1);
$initialConversation = new \stdClass();
if(!$this->isMobile()) {
$paginator = $this->messengerService->getConversationsForMember($shortName, $memberId, 1, 1);
$initialConversation = current($paginator->getItems());
if(!$initialConversation) {
$initialConversation = new \stdClass();
}
}
return [
'appConfig' => [
'initialConversation' => $initialConversation,
'initialFilterName' => $initialFilter,
'attachmentCost' => $user->hasRole('ROLE_ADMIN') ? 0 :
$this->propertyService->getMessengerProperties($memberId)['attachmentCost']
]
];
}
/**
* @return bool
*/
protected function isMobile(): bool
{
if(empty($_SERVER['HTTP_USER_AGENT'])) {
return false;
}
$pattern = "/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i";
return preg_match($pattern, $_SERVER["HTTP_USER_AGENT"]);
}
/**
* @Route("/chat/{username}", methods={"GET"})
* @Template("/messenger/messenger/index.html.twig")
*
* @param Request $request
* @param string $username
* @return array|JsonResponse|\Symfony\Component\HttpKernel\Exception\NotFoundHttpException
* @throws \Psr\Cache\InvalidArgumentException
* @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
*/
public function chat(Request $request, string $username)
{
$this->denyAccessUnlessGranted('ROLE_MEMBER');
if(!$recipient = $this->memberService->getMemberDetailByUsername($username)) {
return $this->createNotFoundException('User not found');
}
/** @var ApiUser $user */
$user = $this->getUser();
$memberId = $user->getMemberId();
if($memberId === $recipient['id']) {
return new JsonResponse([
'message' => 'Fehler: Du kannst Dir nicht selbst schreiben.'
], Response::HTTP_FORBIDDEN);
}
$conversation = $this->messengerService->createConversation($memberId, $recipient['id']);
if($request->isXmlHttpRequest()) {
return new JsonResponse($conversation);
}
return [
'appConfig' => [
'initialConversation' => $conversation,
'initialFilterName' => 'frivol.messenger.filters.inbox',
'attachmentCost' => $user->hasRole('ROLE_ADMIN') ? 0 :
$this->propertyService->getMessengerProperties($memberId)['attachmentCost']
]
];
}
/**
* @Route("/messages/{conversation}", methods={"POST"}, requirements={"conversation": "\d+"})
*
* @param Request $request
* @param int $conversation
* @return JsonResponse
*/
public function send(Request $request, int $conversation): JsonResponse
{
$this->denyAccessUnlessGranted('ROLE_OPERATOR');
$input = json_decode($request->getContent(), true);
$input['operator'] = $this->getUser()->getMemberId();
try {
$result = $this->messengerService->sendMessage($conversation, $input);
} catch(HttpException $e) {
return new JsonResponse([
'message' => $e->getMessage()
], $e->getStatusCode());
}
return new JsonResponse($result, Response::HTTP_CREATED);
}
}