<?php
namespace App\Controller\Cabinet;
use App\Entity\Chat;
use App\Entity\ChatParticipant;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/cabinet", name="cabinet.")
* @IsGranted("ROLE_USER")
*/
class CabinetController extends AbstractController
{
/**
* @Route("/", name="index")
*/
public function schedule(): Response
{
if ($this->isGranted('ROLE_SPEAKER')) {
return $this->redirectToRoute('cabinet.schedule.index');
}
return $this->redirectToRoute('cabinet.planned_consultation.index');
}
/**
* @Route("/support", name="support")
*/
public function support(TranslatorInterface $translator): RedirectResponse
{
$content = [];
$em = $this->getDoctrine()->getManager();
$uniqId = 'support_' . $this->getUser()->getId();
$chat = $em->getRepository(Chat::class)->findOneBy(['uniqId' => $uniqId]);
if (is_null($chat)) {
$qb = $em->getRepository(User::class)->createQueryBuilder('u');
$admins = $qb->andWhere($qb->expr()->like('u.roles', ':role'))
->setParameter('role', '%ROLE_ADMIN%')
->getQuery()
->getResult();
if (!empty($admins)) {
$chat = (new Chat())
->setAuthor($this->getUser())
->setName(sprintf($translator->trans('label.support_request', [], 'cabinet'), $this->getUser()))
->setUniqId($uniqId);
$part = (new ChatParticipant())->setUser($this->getUser());
$chat->addParticipant($part);
$em->persist($part);
foreach ($admins as $admin) {
$adminPart = (new ChatParticipant())->setUser($admin);
if (
$chat->getParticipants()->exists(function ($key, $value) use ($adminPart) {
return $adminPart->getUser() == $value->getUser();
})) {
continue;
}
$chat->addParticipant($adminPart);
$em->persist($adminPart);
}
$em->persist($chat);
$em->flush();
$content['id'] = $chat->getUniqId();
}
} else {
$content['id'] = $chat->getUniqId();
}
return $this->redirectToRoute('cabinet.chat.index', $content);
}
}