<?php
namespace App\Controller;
use App\Entity\Event;
use App\Entity\EventComment;
use App\Entity\EventMember;
use App\Entity\Message;
use App\EntityManager\EventManager;
use App\Form\Event\CreateEventType;
use App\Form\Event\EventAddCommentType;
use App\Form\Event\EventRegistrationType;
use App\Form\Event\EventSearchType;
use App\Form\Event\UpdateParticipantType;
use App\Form\Message\CreateMessageType;
use App\Model\SearchEvent;
use App\Security\Voter\EventVoter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
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\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
/**
* Class EventController
* @package App\Controller
* @Route("/event")
*/
class EventController extends AbstractController
{
/**
* @var EventManager
*/
protected $eventManager;
public function __construct(EventManager $eventManager)
{
$this->eventManager = $eventManager;
}
/**
* @Route("", name="event_index")
* @Template()
*/
public function index(Request $request)
{
$searchObject = new SearchEvent();
$searchForm = $this->createForm(EventSearchType::class, $searchObject, ['method' => Request::METHOD_GET]);
$searchForm->handleRequest($request);
$events = $this->eventManager->getIndexList($searchObject);
return [
'events' => $events,
'searchForm' => $searchForm->createView(),
];
}
/**
* @Route("/my_events", name="event_my_events")
* @Template()
*/
public function myEvents()
{
$searchObject = new SearchEvent();
$searchObject->setByUser($this->getUser());
$searchObject->setDisplayPastEvents(true);
$events = $this->eventManager->getIndexList($searchObject);
return [
'events' => $events,
];
}
/**
* @Route("/{id<\d+>}", name="event_view")
* @Template()
*/
public function view(Request $request, Event $event)
{
$comment = new EventComment();
$commentForm = $this->createForm(EventAddCommentType::class, $comment);
$commentForm->handleRequest($request);
if ($commentForm->isSubmitted() && $commentForm->isValid()) {
$this->eventManager->addComment($event, $comment);
$this->addFlash('success', 'event.add_comment');
return $this->redirectToRoute('event_view', ['id' => $event->getId()]);
}
return [
'event' => $event,
'commentForm' => $commentForm->createView(),
];
}
/**
* @Route("/create", name="event_create")
* @Template()
*/
public function create(Request $request)
{
$event = new Event();
$form = $this->createForm(CreateEventType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->eventManager->create($event);
$this->addFlash('success', 'event.create');
return $this->redirectToRoute('event_view', ['id' => $event->getId()]);
}
return [
'form' => $form->createView(),
];
}
/**
* @Route("/{id}/edit", name="event_edit")
* @IsGranted(EventVoter::EDIT, subject="event")
* @Template()
*/
public function edit(Request $request, Event $event)
{
$form = $this->createForm(CreateEventType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->eventManager->update($event);
$this->addFlash('success', 'event.edit');
return $this->redirectToRoute('event_view', ['id' => $event->getId()]);
}
return [
'form' => $form->createView(),
'event' => $event,
];
}
/**
* @Route("/{id}/participants", name="event_participants")
* @Template()
*/
public function viewParticipants(Event $event)
{
return [
'event' => $event,
];
}
/**
* @Route("/{id}/edit_participants", name="event_edit_participants")
* @IsGranted(EventVoter::EDIT, subject="event")
* @Template()
*/
public function editParticipants(Event $event)
{
return [
'event' => $event,
];
}
/**
* @Route("/{id}/send_message", name="event_send_message")
* @IsGranted(EventVoter::EDIT, subject="event")
* @Template()
*/
public function sendMessage(Request $request, Event $event)
{
$message = new Message();
$form = $this->createForm(CreateMessageType::class, $message);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$content = $form->get('content')->getData();
$this->eventManager->sendMessageToParticipants($event, $message, $content);
$this->addFlash('success', 'event.send_message_to_participants');
return $this->redirectToRoute('event_view', ['id' => $event->getId()]);
}
return [
'event' => $event,
'form' => $form->createView(),
];
}
/**
* @Route("/{id}/update_participant/{eventMember}", name="event_update_participant", options={"expose": true})
* @IsGranted(EventVoter::EDIT, subject="event")
* @Template()
*/
public function updateParticipant(Request $request, Event $event, EventMember $eventMember)
{
$form = $this->createForm(UpdateParticipantType::class, $eventMember);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && $event->isEventMember($eventMember)) {
$this->eventManager->updateParticipant($eventMember);
return new JsonResponse(null, 200);
}
return new JsonResponse(null, 400);
}
/**
* @Route("/{id}/registration", name="event_registration")
* @Template()
*/
public function registration(Request $request, Event $event)
{
$eventMember = $event->getMemberFromUser($this->getUser());
$eventMember = $eventMember ?? new EventMember();
$form = $this->createForm(EventRegistrationType::class, $eventMember);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->eventManager->updateRegistration($event, $eventMember);
$this->addFlash('success', 'event.registration_update');
return $this->redirectToRoute('event_view', ['id' => $event->getId()]);
}
return [
'event' => $event,
'form' => $form->createView(),
];
}
/**
* @Route("/{id}/deleteComment/{commentId}", name="event_delete_comment")
* @IsGranted(EventVoter::DELETE_COMMENT, subject="event")
* @Template()
*/
public function deleteComment(Event $event, EventComment $comment)
{
if ($comment->getEvent() !== $event) {
throw new AccessDeniedException("The comment is not associated with this event.");
}
$this->eventManager->deleteComment($event, $comment);
$this->addFlash('success', 'event.delete_comment');
return $this->redirectToRoute('event_view', ['id' => $event->getId()]);
}
}