<?php
namespace App\Controller;
use App\Entity\User;
use App\Service\EsSocket;
use App\Entity\Conference;
use App\Handler\ConferenceHandler;
use App\Entity\Model\ConfigurationType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class ConferenceController extends AbstractController
{
public function __construct(
private ConferenceHandler $handler
) {
}
/**
* @Route(
* path="/api/conferences/clone",
* name="api_conferences_clone_collection",
* methods={"POST"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_collection_operation_name"="post_clone"
* }
* )
*/
public function clone($data): Conference
{
return $this->handler->clone($data);
}
/**
* @Route(
* path="/public-api/conferences/get",
* name="api_pub_conferences_get_for_public_page_collection",
* methods={"GET"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_collection_operation_name"="get_for_public_page"
* }
* )
* @Security("is_granted('PUBLIC_ACCESS')")
*/
public function getForPublicPage($data)
{
return $data;
}
/**
* @Route(
* path="/public-api/conferences/get-count",
* name="api_pub_conferences_get_for_public_page_collection_count",
* methods={"GET"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_collection_operation_name"="get_for_public_page_count"
* }
* )
* @Security("is_granted('PUBLIC_ACCESS')")
*/
public function getForPublicPageCount($data)
{
return $data;
}
/**
* @Route(
* path="/public-api/conferences/get/{id}",
* name="api_pub_conferences_get_for_public_page_item",
* methods={"GET"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_item_operation_name"="get_for_public_item_page"
* }
* )
* @Security("is_granted('PUBLIC_ACCESS')")
*/
public function getForPublicItemPage($data)
{
return $data;
}
/**
* @Route(
* path="/api/conferences/certificate-prepare",
* name="api_conferences_certificate_prepare",
* methods={"POST"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_collection_operation_name"="post_certificate_prepare"
* }
* )
*/
public function certificatePrepare($data): Conference
{
return $this->handler->certificatePrepareRequest($data);
}
/**
* @Route(
* path="/api/conferences/certificate-send",
* name="api_conferences_certificate_send",
* methods={"POST"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_collection_operation_name"="post_certificate_send"
* }
* )
*/
public function certificateSend($data): Conference
{
return $this->handler->certificateSendRequest($data);
}
/**
* @Route(
* path="/api/conferences/{id}/register",
* name="api_conferences_register",
* methods={"PATCH"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_item_operation_name"="patch_register"
* }
* )
*/
public function register($data, EsSocket $esSocket): Conference
{
if (!$data->getIsRegisterEnable()) {
return $data;
}
if ($data->getAvailableSeats() > 0) {
$user = $this->getUser();
$data->addRegisteredUser($user);
$esSocket->emit(
'backend-command',
[
'type' => 'conference_register',
'payload' => ['conferenceId' => $data->getId(), 'availableSeats' => $data->getAvailableSeats(), 'containerId' => $data->getContainer()->getId()]
]
);
} else {
throw new BadRequestHttpException(
'validation.conference.register:seatsNotAvailable'
);
}
return $data;
}
/**
* @Route(
* path="/api/conferences/{id}/unregister",
* name="api_conferences_unregister",
* methods={"PATCH"},
* defaults={
* "_api_resource_class"=Conference::class,
* "_api_item_operation_name"="patch_unregister"
* }
* )
*/
public function unregister($data, EsSocket $esSocket, EntityManagerInterface $_em): Conference
{
if (!$data->getIsRegisterEnable()) {
return $data;
}
$user = $this->getUser();
if ($data->getUnregisterUserId()) {
$user = $_em->getRepository(User::class)
->find($data->getUnregisterUserId());
if (!$user) {
throw new BadRequestHttpException(
'validation.conference.unregister:userNotRegistered'
);
}
}
if ($data->hasRegisteredUser($user)) {
$data->removeRegisteredUser($user);
$esSocket->emit(
'backend-command',
[
'type' => 'conference_register',
'payload' => ['conferenceId' => $data->getId(), 'availableSeats' => $data->getAvailableSeats(), 'containerId' => $data->getContainer()->getId()]
]
);
} else {
throw new BadRequestHttpException(
'validation.conference.unregister:userNotRegistered'
);
}
return $data;
}
}