<?php
namespace App\Controller;
use App\Classes\AppResponse;
use App\Classes\PackageManager;
use App\Entity\Contrato;
use App\Entity\Dispositivo;
use App\Entity\Interfaces\ContratoDependenteInterface;
use App\Entity\Interfaces\EntityInterface;
use App\Entity\Interfaces\UsuarioDependenteInterface;
use App\Entity\PackageSistema;
use App\Form\DispositivoAlterarSenhaType;
use App\Form\DispositivoAlterarIdentificadorPropagandaType;
use App\Form\DispositivoAlterarFirebaseTokenType;
use App\Form\DispositivoSavePackageType;
use App\Form\DispositivoType;
use App\Repository\DispositivoRepository;
use App\Service\DispositivoService;
use App\Service\NotificationService;
use FOS\RestBundle\Context\Context;
use FOS\RestBundle\Controller\Annotations as Rest;
use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api", name="api_")
*/
class DispositivoController extends AbstractAppController
{
private $notificationService;
public function __construct(LoggerInterface $logger, DispositivoRepository $repository, DispositivoService $service, NotificationService $notificationService)
{
$this->entity = new Dispositivo();
$this->repository = $repository;
$this->formType = DispositivoType::class;
$this->service = $service;
$this->logger = $logger;
$this->notificationService = $notificationService;
}
/**
* @Rest\Get("/dispositivo")
*/
public function list(): Response
{
return parent::list();
}
/**
* @Rest\Get("/dispositivo/{selector}")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function show(EntityInterface $entity): Response
{
return parent::show($entity);
}
/**
* @Rest\Post("/dispositivo")
*/
public function new(Request $request): Response
{
$entity = $this->entity;
$entity = $this->dispositivoNewPreHydrateEntity($entity);
$form = $this->createForm($this->formType, $entity);
$data = json_decode($request->getContent(), true);
$form->submit($data);
if ($form->isSubmitted() && $form->isValid()) {
try {
$this->service->criar($entity);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
return $this->handleView($this->view([], Response::HTTP_BAD_REQUEST));
}
$view = $this->view($entity, Response::HTTP_CREATED);
$context = new Context();
$context->addGroup('new');
$view->setContext($context);
return $this->handleView($view);
}
return $this->handleView($this->view($form->getErrors(), Response::HTTP_BAD_REQUEST));
}
// Neste caso, deve ser possivel trocar o usuario, desde que o novo nao seja um device
// Essa regra nao se aplica as demais entidades, por isso nao foi feito overwrite nem alteracao na class pai
protected function dispositivoNewPreHydrateEntity(EntityInterface $entity): EntityInterface
{
// Se a entidade depende de usuario, utiliza a referencia do usuario "logado", desde que nao seja um "usuario dispositivo"
if (($entity instanceof UsuarioDependenteInterface)
&& (false === $this->getUser()->isDispositivo())
) {
$entity->setUsuario($this->getUser());
}
// Se a entidade depende de contrato, utiliza a referencia de contrato do usuario "logado", desde que nao seja um "usuario dispositivo"
if (($entity instanceof ContratoDependenteInterface)
&& (false === $this->getUser()->isDispositivo())
&& ($this->getUser()->getContrato() instanceof Contrato)
) {
$entity->setContrato($this->getUser()->getContrato());
}
return $entity;
}
/**
* @Rest\Get("/dispositivo/{selector}/status")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function status(Dispositivo $entity): Response
{
$statusCodeMessage = AppResponse::getMessage($entity->getStatus());
return $this->handleView($this->view($statusCodeMessage));
}
/**
* @Rest\Get("/dispositivo/{selector}/status/bloqueio")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function bloqueio(Dispositivo $entity): Response
{
$statusCodeMessage = AppResponse::getMessageBloqueio($entity->getBloqueio());
$ultimaMensagemBloqueio = $entity->getUltimaMensagemBloqueio();
if ($statusCodeMessage['code'] == Dispositivo::BLOQUEADO && !empty($ultimaMensagemBloqueio)) {
$statusCodeMessage['message'] = $ultimaMensagemBloqueio;
}
return $this->handleView($this->view($statusCodeMessage));
}
/**
* @Rest\Put("/dispositivo/{selector}/alterar_senha")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function alterarSenha(Request $request, Dispositivo $entity): Response
{
$this->formType = DispositivoAlterarSenhaType::class;
$result = parent::edit($request, $entity);
$this->notificationService->sendDownloadSenha($entity);
return $result;
}
/**
* @Rest\Get("/dispositivo/{selector}/package")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function listPackages(Dispositivo $entity): Response
{
return $this->handleView($this->view($entity->getPackages()));
}
/**
* @Rest\Put("/dispositivo/{selector}/desativar")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function desativar(Dispositivo $entity): Response
{
try {
$this->service->desativar($entity);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
return $this->handleView($this->view($e->getMessage(), Response::HTTP_BAD_REQUEST));
}
$this->notificationService->sendDownloadStatus($entity);
return $this->handleView($this->view($entity, Response::HTTP_OK));
}
/**
* @Rest\Put("/dispositivo/{selector}/ativar")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function ativar(Dispositivo $entity): Response
{
try {
$this->service->ativar($entity);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
return $this->handleView($this->view($e->getMessage(), Response::HTTP_BAD_REQUEST));
}
$this->notificationService->sendDownloadStatus($entity);
return $this->handleView($this->view($entity, Response::HTTP_OK));
}
/**
* @Rest\Get("/dispositivo/{selector}/senha")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function showSenha(Dispositivo $entity): Response
{
$view = $this->view($entity, Response::HTTP_OK);
$context = new Context();
$context->addGroup('senha');
$view->setContext($context);
return $this->handleView($view);
}
/**
* @Rest\Post("/dispositivo/{selector}/package")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function addPackages(Request $request, Dispositivo $entity): Response
{
$this->formType = DispositivoSavePackageType::class;
$form = $this->createForm($this->formType, $entity);
$data = json_decode($request->getContent(), true);
if (null === $data) {
return $this->handleView($this->view('JSON - Error - Not Valid', Response::HTTP_BAD_REQUEST));
}
$form->submit($data);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->handleView($this->view([], Response::HTTP_OK));
}
return $this->handleView($this->view($form->getErrors(), Response::HTTP_BAD_REQUEST));
}
/**
* @Rest\Get("/dispositivo/{selector}/package_context")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function listPackagesContext(Dispositivo $entity): Response
{
$em = $this->getDoctrine()->getManager();
$packageListSistema = $em->getRepository(PackageSistema::class)->findAll();
$packageListContrato = $entity->getContrato()->getPackages()->toArray();
$packageListDispositivo = $entity->getPackages()->toArray();
$packageManager = new PackageManager();
$packageManager->addPackageList($packageListSistema, PackageManager::SISTEMA);
$packageManager->addPackageList($packageListContrato, PackageManager::CONTRATO);
$packageManager->addPackageList($packageListDispositivo, PackageManager::DISPOSITIVO);
return $this->handleView($this->view($packageManager->getList()));
}
/**
* @Rest\Put("/dispositivo/{selector}/alterar_identificador_propaganda")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function alterarIdentificadorPropaganda(Request $request, Dispositivo $entity): Response
{
$this->formType = DispositivoAlterarIdentificadorPropagandaType::class;
// Se nao é um token do mesmo dispositivo, nao executa a alteracao
if ($entity->getSelector() != $this->getUser()->getUsername()) {
return $this->handleView($this->view([], Response::HTTP_BAD_REQUEST));
}
$result = parent::edit($request, $entity);
return $result;
}
/**
* @Rest\Put("/dispositivo/{selector}/bloquear/{msg}")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function bloquear(Dispositivo $entity, String $msg): Response
{
try {
$this->service->bloquear($entity, $msg);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
return $this->handleView($this->view($e->getMessage(), Response::HTTP_BAD_REQUEST));
}
$this->notificationService->sendDownloadBloqueio($entity);
return $this->handleView($this->view($entity, Response::HTTP_OK));
}
/**
* @Rest\Put("/dispositivo/{selector}/desbloquear")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function desbloquear(Dispositivo $entity): Response
{
try {
$this->service->desbloquear($entity);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
return $this->handleView($this->view($e->getMessage(), Response::HTTP_BAD_REQUEST));
}
$this->notificationService->sendDownloadDesbloqueio($entity);
return $this->handleView($this->view($entity, Response::HTTP_OK));
}
/**
* @Rest\Put("/dispositivo/{selector}/alterar_firebase_token")
* @ParamConverter("entity", class="App\Entity\Dispositivo")
*/
public function alterarFirebaseToken(Request $request, Dispositivo $entity): Response
{
$this->formType = DispositivoAlterarFirebaseTokenType::class;
$result = parent::edit($request, $entity);
return $result;
}
}