<?php
namespace App\Controller;
use App\Entity\Device;
use App\Entity\DeviceGroup;
use App\Entity\User;
use App\Form\DeviceGroupType;
use App\Form\DevicePolygonType;
use App\Repository\DeviceGroupRepository;
use App\Repository\DeviceRepository;
use App\Service\BlockChainService;
use App\Service\DDMService;
use App\Utils\Datatable;
use Exception;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/device/")
*/
class DeviceGroupController extends AbstractController
{
/**
* @Route("groups", name="device_group_index", methods={"GET"})
* @IsGranted("DEVICE_GROUP_VIEW")
* @param DeviceRepository $deviceRepository
* @return Response
*/
public function index(DeviceRepository $deviceRepository): Response
{
/** @var User $user */
$user = $this->getUser();
$countOfUnhandledRDevices = count($deviceRepository->queryNotAssigned($user->getWorkspace())->getQuery()->getResult());
return $this->render(
'device_group/index.html.twig', [
"countOfUnhandledRDevices" => $countOfUnhandledRDevices
]
);
}
/**
* @Route("groups/fetch/list/{nonce}", name="fetch_device_group_list", methods={"GET"})
* @IsGranted("DEVICE_GROUP_VIEW")
* @param Request $request
* @param Datatable $datatable
* @param DeviceGroupRepository $deviceGroupRepository
* @param $nonce
* @return Response
*/
public function fetchDeviceGroupList(Request $request, Datatable $datatable, DeviceGroupRepository $deviceGroupRepository, $nonce): Response
{
if (!$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
/** @var User $user */
$user = $this->getUser();
$datatables = $datatable
->withColumnType([ // list column in order
'id' => ['alias' => 'dg'],
'name' => ['alias' => 'dg', 'twig' => 'device_group/datatable.link.twig'], // type link, badge or circular status twig
'created' => ['alias' => 'dg', 'twig' => 'components/datatable.datetime.twig'],
'assignedDevices' => ['alias' => ''],
'state' => ['alias' => '', 'twig' => 'components/datatable.device_group.status.twig'],
'user' => ['alias' => ''],
'f1' => ['alias' => 'dg'],
'f2' => ['alias' => 'dg'],
'f3' => ['alias' => 'dg'],
'f4' => ['alias' => 'dg'],
'f5' => ['alias' => 'dg'],
'f6' => ['alias' => 'dg'],
'f7' => ['alias' => 'dg'],
'f8' => ['alias' => 'dg'],
'f9' => ['alias' => 'dg'],
'f10' => ['alias' => 'dg']
])
->withOptions(['nonce' => $nonce])
->renderActionView('device_group/datatable.action.twig') // provide custom twig to render action column
->isDeviceGroup(true)
->withQueryBuilder($deviceGroupRepository->getForWorkspace($user->getWorkspace()))
->withRequestParams($request->query->all());
return new JsonResponse($datatables->getResponse());
}
/**
* @Route("groups/fetch/show/{id}/{nonce}", name="fetch_device_group_show", methods={"POST"})
* @IsGranted("DEVICE_GROUP_VIEW")
* @param Request $request
* @param DeviceGroup $deviceGroup
* @param Datatable $datatable
* @param DeviceGroupRepository $deviceGroupRepository
* @param $nonce
* @return Response
*/
public function fetchDeviceGroupShow(Request $request, DeviceGroup $deviceGroup, Datatable $datatable, DeviceGroupRepository $deviceGroupRepository, $nonce): Response
{
if (!$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
$columns = [ // list column in order
'id' => ['alias' => 'd'],
'name' => ['alias' => 'd', 'twig' => 'device_group/datatable_device.link.twig'], // type link, badge or circular status twig
'macAddress' => ['alias' => 'd'],
'serialNumber' => ['alias' => 'd'],
'class' => ['alias' => 'd'],
'firmwareVersion' => ['alias' => 'd'],
'f1' => ['alias' => 'd'],
'f2' => ['alias' => 'd'],
'f3' => ['alias' => 'd'],
'f4' => ['alias' => 'd'],
'f5' => ['alias' => 'd'],
'f6' => ['alias' => 'd'],
'f7' => ['alias' => 'd'],
'f8' => ['alias' => 'd'],
'f9' => ['alias' => 'd'],
'f10' => ['alias' => 'd'],
'created' => ['alias' => 'd', 'twig' => 'components/datatable.datetime.twig']
];
if (intval($_ENV['ALLOW_LORA_A']) === 1 or intval($_ENV['ALLOW_LORA_C']) === 1) {
$columns['trustStatus'] = ['alias' => 'd', 'twig' => 'components/datatable.trust_status.twig'];
}
$datatables = $datatable
->withColumnType($columns)
->withOptions(['deviceGroup' => $deviceGroup, 'nonce' => $nonce])
->renderActionView('device_group/datatable_device.action.twig') // provide custom twig to render action column
->withQueryBuilder($deviceGroupRepository->getDevices($deviceGroup))
->isDeviceGroupShow(true)
->withRequestParams($request->request->all());
return new JsonResponse($datatables->getResponse());
}
/**
* @Route("groups/new/{nonce}", name="device_group_new", methods={"GET","POST"})
* @IsGranted("DEVICE_GROUP_CREATE")
* @param Request $request
* @param $nonce
* @return Response
* @throws Exception
*/
public function new(Request $request, $nonce): Response
{
if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
$deviceGroup = new DeviceGroup();
/** @var User $user */
$user = $this->getUser();
$deviceGroup->setWorkspace($user->getWorkspace());
$deviceGroup->setMaintainer($user);
$form = $this->createForm(
DeviceGroupType::class,
$deviceGroup,
[
'action' => $this->generateUrl(
'device_group_new',
[
'nonce' => $nonce
]
),
'method' => 'POST',
'workspace' => $user->getWorkspace()
]
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($deviceGroup);
$em->flush();
return $this->redirectToRoute('device_group_index');
}
return $this->render(
'device_group/new.html.twig',
[
'nonce' => urldecode(str_replace('?2F?', '%2F', $nonce)),
'device_group' => $deviceGroup,
'form' => $form->createView(),
]
);
}
/**
* @Route("groups/show/{id}", name="device_group_show", methods={"GET"})
* @IsGranted("DEVICE_GROUP_SHOW", subject="deviceGroup")
* @param DeviceGroup $deviceGroup
* @return Response
*/
public function show(DeviceGroup $deviceGroup): Response
{
return $this->render(
'device_group/show.html.twig',
[
'device_group' => $deviceGroup,
]
);
}
/**
* @Route("groups/edit/{id}/{nonce}", name="device_group_edit", methods={"GET","POST"})
* @IsGranted("DEVICE_GROUP_EDIT", subject="deviceGroup")
* @param Request $request
* @param DeviceGroup $deviceGroup
* @param DDMService $ddmService
* @param $nonce
* @return Response
* @throws Exception
*/
public function edit(Request $request, DeviceGroup $deviceGroup, DDMService $ddmService, $nonce): Response
{
if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
/** @var User $user */
$user = $this->getUser();
$form = $this->createForm(
DeviceGroupType::class,
$deviceGroup,
[
'action' => $this->generateUrl(
'device_group_edit',
[
'id' => $deviceGroup->getId(),
'nonce' => $nonce
]
),
'method' => 'POST',
'workspace' => $user->getWorkspace()
]
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$devices = $em->getRepository(Device::class)->findBy(["workspace" => $deviceGroup->getWorkspace(), "deviceGroup" => $deviceGroup]);
foreach ($devices as $device) {
$device->setDeviceGroup(null);
$em->persist($device);
}
foreach ($deviceGroup->getDevices() as $device) {
$device->setDeviceGroup($deviceGroup);
$em->persist($device);
$ddmService->registerDevice($device);
}
$em->flush();
return $this->redirectToRoute('device_group_index');
}
return $this->render(
'device_group/edit.html.twig',
[
'nonce' => urldecode(str_replace('?2F?', '%2F', $nonce)),
'device_group' => $deviceGroup,
'form' => $form->createView(),
]
);
}
/**
* @Route("groups/map/{id}/{nonce}", name="device_group_map", methods={"GET","POST"})
* @IsGranted("VIEW_PLAN_MAPBOX")
* @param Request $request
* @param DeviceGroup $deviceGroup
* @param $nonce
* @return Response
*/
public function map(Request $request, DeviceGroup $deviceGroup, $nonce): Response
{
if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
$form = $this->createForm(
DevicePolygonType::class,
$deviceGroup,
[
'action' => $this->generateUrl(
'device_group_map',
[
'id' => $deviceGroup->getId(),
'nonce' => $nonce
]
),
'method' => 'POST'
]
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// dump($deviceGroup);
// die;
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($deviceGroup);
$entityManager->flush();
return $this->redirectToRoute('device_group_index');
}
return $this->render(
'device_group/map.html.twig',
[
'nonce' => urldecode(str_replace('?2F?', '%2F', $nonce)),
'device_group' => $deviceGroup,
'mapbox_token' => strval($_ENV['MAPBOX_ACCESS_TOKEN']),
'form' => $form->createView(),
]
);
}
/**
* @Route("groups/show/map/{device}/{nonce}", name="device_group_show_map", methods={"GET","POST"})
* @IsGranted("VIEW_PLAN_MAPBOX")
* @param Request $request
* @param Device $device
* @param $nonce
* @return Response
*/
public function deviceMap(Request $request, Device $device, $nonce): Response
{
if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
return $this->render(
'device_group/device_map.html.twig',
[
'nonce' => urldecode(str_replace('?2F?', '%2F', $nonce)),
'device' => $device,
'mapbox_token' => strval($_ENV['MAPBOX_ACCESS_TOKEN']),
]
);
}
/**
* @Route("groups/delete/{id}", name="device_group_delete", methods={"DELETE"})
* @IsGranted("DEVICE_GROUP_DELETE", subject="deviceGroup")
* @param Request $request
* @param DeviceGroup $deviceGroup
* @return Response
*/
public function delete(Request $request, DeviceGroup $deviceGroup): Response
{
if ($this->isCsrfTokenValid(
'delete' . $deviceGroup->getId(),
$request->request->get('_token')
)) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($deviceGroup);
$entityManager->flush();
}
return $this->redirectToRoute('device_group_index');
}
/**
* @Route("groups/delete/form/{id}", name="device_group_delete_form", methods={"GET"})
* @IsGranted("DEVICE_GROUP_DELETE", subject="deviceGroup")
* @param Request $request
* @param DeviceGroup $deviceGroup
* @return Response
*/
public function deleteForm(Request $request, DeviceGroup $deviceGroup): Response
{
if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
$form = $this->createFormBuilder()
->setAction(
$this->generateUrl(
'device_group_delete',
array('id' => $deviceGroup->getId())
)
)
->setMethod('DELETE')
->getForm();
return $this->render(
'device_group/delete.html.twig',
[
'device_group' => $deviceGroup,
'form' => $form->createView(),
]
);
}
/**
* @Route("groups/delete/groups", name="device_group_delete_groups", methods={"POST"})
* @IsGranted("DEVICE_GROUP_MULTI_DELETE", subject="deviceGroup")
* @param Request $request
* @param DeviceGroupRepository $deviceGroupRepository
* @return Response
*/
public function deleteDeviceGroups(Request $request, DeviceGroupRepository $deviceGroupRepository): Response
{
if (!$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
/** @var User $user */
$user = $this->getUser();
$data = explode(
',',
$request->request->get('data_ids')
);
$em = $this->getDoctrine()->getManager();
foreach ($data as $id) {
$deviceGroup = $deviceGroupRepository->findOneBy(["id" => $id, "workspace" => $user->getWorkspace()->getId()]);
if (is_object($deviceGroup)) {
foreach ($deviceGroup->getDevices() as $device) {
$device->setDeviceGroup(null);
$em->persist($device);
$em->flush();
}
$em->remove($deviceGroup);
}
}
$em->flush();
return new Response('success');
}
/**
* @Route("groups/show/{deviceGroup}/device/{device}", name="device_group_device_show", methods={"GET"})
* @IsGranted("DEVICE_SHOW", subject="device")
* @param DeviceGroup $deviceGroup
* @param Device $device
* @return Response
*/
public function showDeviceInDeviceGroup(DeviceGroup $deviceGroup, Device $device): Response
{
return $this->render(
'device_group/show_device.html.twig',
[
'device_group' => $deviceGroup,
'device' => $device,
]
);
}
/**
* @Route("/groups/{deviceGroup}/device/fix/{device}", name="device_bc_fix", methods={"GET"})
* @IsGranted("DEVICE_SHOW", subject="device")
* @param DeviceGroup $deviceGroup
* @param Device $device
* @param DDMService $ddmService
* @return Response
* @throws Exception
*/
public function bcFix(DeviceGroup $deviceGroup, Device $device, DDMService $ddmService): Response
{
//die("hello");
$ddmService->registerDevice($device);
return $this->redirectToRoute('device_group_device_show', ['device' => $device->getId(), 'deviceGroup' => $deviceGroup->getId()]);
}
}