src/Controller/DeviceGroupController.php line 55

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Device;
  4. use App\Entity\DeviceGroup;
  5. use App\Entity\User;
  6. use App\Form\DeviceGroupType;
  7. use App\Form\DevicePolygonType;
  8. use App\Repository\DeviceGroupRepository;
  9. use App\Repository\DeviceRepository;
  10. use App\Service\BlockChainService;
  11. use App\Service\DDMService;
  12. use App\Utils\Datatable;
  13. use Exception;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. /**
  21.  * @Route("/device/")
  22.  */
  23. class DeviceGroupController extends AbstractController
  24. {
  25.     /**
  26.      * @Route("groups", name="device_group_index", methods={"GET"})
  27.      * @IsGranted("DEVICE_GROUP_VIEW")
  28.      * @param DeviceRepository $deviceRepository
  29.      * @return Response
  30.      */
  31.     public function index(DeviceRepository $deviceRepository): Response
  32.     {
  33.         /** @var User $user */
  34.         $user $this->getUser();
  35.         $countOfUnhandledRDevices count($deviceRepository->queryNotAssigned($user->getWorkspace())->getQuery()->getResult());
  36.         return $this->render(
  37.             'device_group/index.html.twig', [
  38.                 "countOfUnhandledRDevices" => $countOfUnhandledRDevices
  39.             ]
  40.         );
  41.     }
  42.     /**
  43.      * @Route("groups/fetch/list/{nonce}", name="fetch_device_group_list", methods={"GET"})
  44.      * @IsGranted("DEVICE_GROUP_VIEW")
  45.      * @param Request $request
  46.      * @param Datatable $datatable
  47.      * @param DeviceGroupRepository $deviceGroupRepository
  48.      * @param $nonce
  49.      * @return Response
  50.      */
  51.     public function fetchDeviceGroupList(Request $requestDatatable $datatableDeviceGroupRepository $deviceGroupRepository$nonce): Response
  52.     {
  53.         if (!$request->isXmlHttpRequest()) {
  54.             throw $this->createAccessDeniedException("Not an ajax request!");
  55.         }
  56.         /** @var User $user */
  57.         $user $this->getUser();
  58.         $datatables $datatable
  59.             ->withColumnType([ // list column in order
  60.                 'id' => ['alias' => 'dg'],
  61.                 'name' => ['alias' => 'dg''twig' => 'device_group/datatable.link.twig'], // type link, badge or circular status twig
  62.                 'created' => ['alias' => 'dg''twig' => 'components/datatable.datetime.twig'],
  63.                 'assignedDevices' => ['alias' => ''],
  64.                 'state' => ['alias' => '''twig' => 'components/datatable.device_group.status.twig'],
  65.                 'user' => ['alias' => ''],
  66.                 'f1' => ['alias' => 'dg'],
  67.                 'f2' => ['alias' => 'dg'],
  68.                 'f3' => ['alias' => 'dg'],
  69.                 'f4' => ['alias' => 'dg'],
  70.                 'f5' => ['alias' => 'dg'],
  71.                 'f6' => ['alias' => 'dg'],
  72.                 'f7' => ['alias' => 'dg'],
  73.                 'f8' => ['alias' => 'dg'],
  74.                 'f9' => ['alias' => 'dg'],
  75.                 'f10' => ['alias' => 'dg']
  76.             ])
  77.             ->withOptions(['nonce' => $nonce])
  78.             ->renderActionView('device_group/datatable.action.twig')  // provide custom twig to render action column
  79.             ->isDeviceGroup(true)
  80.             ->withQueryBuilder($deviceGroupRepository->getForWorkspace($user->getWorkspace()))
  81.             ->withRequestParams($request->query->all());
  82.         return new JsonResponse($datatables->getResponse());
  83.     }
  84.     /**
  85.      * @Route("groups/fetch/show/{id}/{nonce}", name="fetch_device_group_show", methods={"POST"})
  86.      * @IsGranted("DEVICE_GROUP_VIEW")
  87.      * @param Request $request
  88.      * @param DeviceGroup $deviceGroup
  89.      * @param Datatable $datatable
  90.      * @param DeviceGroupRepository $deviceGroupRepository
  91.      * @param $nonce
  92.      * @return Response
  93.      */
  94.     public function fetchDeviceGroupShow(Request $requestDeviceGroup $deviceGroupDatatable $datatableDeviceGroupRepository $deviceGroupRepository$nonce): Response
  95.     {
  96.         if (!$request->isXmlHttpRequest()) {
  97.             throw $this->createAccessDeniedException("Not an ajax request!");
  98.         }
  99.         $columns = [ // list column in order
  100.             'id' => ['alias' => 'd'],
  101.             'name' => ['alias' => 'd''twig' => 'device_group/datatable_device.link.twig'], // type link, badge or circular status twig
  102.             'macAddress' => ['alias' => 'd'],
  103.             'serialNumber' => ['alias' => 'd'],
  104.             'class' => ['alias' => 'd'],
  105.             'firmwareVersion' => ['alias' => 'd'],
  106.             'f1' => ['alias' => 'd'],
  107.             'f2' => ['alias' => 'd'],
  108.             'f3' => ['alias' => 'd'],
  109.             'f4' => ['alias' => 'd'],
  110.             'f5' => ['alias' => 'd'],
  111.             'f6' => ['alias' => 'd'],
  112.             'f7' => ['alias' => 'd'],
  113.             'f8' => ['alias' => 'd'],
  114.             'f9' => ['alias' => 'd'],
  115.             'f10' => ['alias' => 'd'],
  116.             'created' => ['alias' => 'd''twig' => 'components/datatable.datetime.twig']
  117.         ];
  118.         if (intval($_ENV['ALLOW_LORA_A']) === or intval($_ENV['ALLOW_LORA_C']) === 1) {
  119.             $columns['trustStatus'] = ['alias' => 'd''twig' => 'components/datatable.trust_status.twig'];
  120.         }
  121.         $datatables $datatable
  122.             ->withColumnType($columns)
  123.             ->withOptions(['deviceGroup' => $deviceGroup'nonce' => $nonce])
  124.             ->renderActionView('device_group/datatable_device.action.twig')  // provide custom twig to render action column
  125.             ->withQueryBuilder($deviceGroupRepository->getDevices($deviceGroup))
  126.             ->isDeviceGroupShow(true)
  127.             ->withRequestParams($request->request->all());
  128.         return new JsonResponse($datatables->getResponse());
  129.     }
  130.     /**
  131.      * @Route("groups/new/{nonce}", name="device_group_new", methods={"GET","POST"})
  132.      * @IsGranted("DEVICE_GROUP_CREATE")
  133.      * @param Request $request
  134.      * @param $nonce
  135.      * @return Response
  136.      * @throws Exception
  137.      */
  138.     public function new(Request $request$nonce): Response
  139.     {
  140.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  141.             throw $this->createAccessDeniedException("Not an ajax request!");
  142.         }
  143.         $deviceGroup = new DeviceGroup();
  144.         /** @var User $user */
  145.         $user $this->getUser();
  146.         $deviceGroup->setWorkspace($user->getWorkspace());
  147.         $deviceGroup->setMaintainer($user);
  148.         $form $this->createForm(
  149.             DeviceGroupType::class,
  150.             $deviceGroup,
  151.             [
  152.                 'action' => $this->generateUrl(
  153.                     'device_group_new',
  154.                     [
  155.                         'nonce' => $nonce
  156.                     ]
  157.                 ),
  158.                 'method' => 'POST',
  159.                 'workspace' => $user->getWorkspace()
  160.             ]
  161.         );
  162.         $form->handleRequest($request);
  163.         if ($form->isSubmitted() && $form->isValid()) {
  164.             $em $this->getDoctrine()->getManager();
  165.             $em->persist($deviceGroup);
  166.             $em->flush();
  167.             return $this->redirectToRoute('device_group_index');
  168.         }
  169.         return $this->render(
  170.             'device_group/new.html.twig',
  171.             [
  172.                 'nonce' => urldecode(str_replace('?2F?''%2F'$nonce)),
  173.                 'device_group' => $deviceGroup,
  174.                 'form' => $form->createView(),
  175.             ]
  176.         );
  177.     }
  178.     /**
  179.      * @Route("groups/show/{id}", name="device_group_show", methods={"GET"})
  180.      * @IsGranted("DEVICE_GROUP_SHOW", subject="deviceGroup")
  181.      * @param DeviceGroup $deviceGroup
  182.      * @return Response
  183.      */
  184.     public function show(DeviceGroup $deviceGroup): Response
  185.     {
  186.         return $this->render(
  187.             'device_group/show.html.twig',
  188.             [
  189.                 'device_group' => $deviceGroup,
  190.             ]
  191.         );
  192.     }
  193.     /**
  194.      * @Route("groups/edit/{id}/{nonce}", name="device_group_edit", methods={"GET","POST"})
  195.      * @IsGranted("DEVICE_GROUP_EDIT", subject="deviceGroup")
  196.      * @param Request $request
  197.      * @param DeviceGroup $deviceGroup
  198.      * @param DDMService $ddmService
  199.      * @param $nonce
  200.      * @return Response
  201.      * @throws Exception
  202.      */
  203.     public function edit(Request $requestDeviceGroup $deviceGroupDDMService $ddmService$nonce): Response
  204.     {
  205.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  206.             throw $this->createAccessDeniedException("Not an ajax request!");
  207.         }
  208.         /** @var User $user */
  209.         $user $this->getUser();
  210.         $form $this->createForm(
  211.             DeviceGroupType::class,
  212.             $deviceGroup,
  213.             [
  214.                 'action' => $this->generateUrl(
  215.                     'device_group_edit',
  216.                     [
  217.                         'id' => $deviceGroup->getId(),
  218.                         'nonce' => $nonce
  219.                     ]
  220.                 ),
  221.                 'method' => 'POST',
  222.                 'workspace' => $user->getWorkspace()
  223.             ]
  224.         );
  225.         $form->handleRequest($request);
  226.         if ($form->isSubmitted() && $form->isValid()) {
  227.             $em $this->getDoctrine()->getManager();
  228.             $devices $em->getRepository(Device::class)->findBy(["workspace" => $deviceGroup->getWorkspace(), "deviceGroup" => $deviceGroup]);
  229.             foreach ($devices as $device) {
  230.                 $device->setDeviceGroup(null);
  231.                 $em->persist($device);
  232.             }
  233.             foreach ($deviceGroup->getDevices() as $device) {
  234.                 $device->setDeviceGroup($deviceGroup);
  235.                 $em->persist($device);
  236.                 $ddmService->registerDevice($device);
  237.             }
  238.             $em->flush();
  239.             return $this->redirectToRoute('device_group_index');
  240.         }
  241.         return $this->render(
  242.             'device_group/edit.html.twig',
  243.             [
  244.                 'nonce' => urldecode(str_replace('?2F?''%2F'$nonce)),
  245.                 'device_group' => $deviceGroup,
  246.                 'form' => $form->createView(),
  247.             ]
  248.         );
  249.     }
  250.     /**
  251.      * @Route("groups/map/{id}/{nonce}", name="device_group_map", methods={"GET","POST"})
  252.      * @IsGranted("VIEW_PLAN_MAPBOX")
  253.      * @param Request $request
  254.      * @param DeviceGroup $deviceGroup
  255.      * @param $nonce
  256.      * @return Response
  257.      */
  258.     public function map(Request $requestDeviceGroup $deviceGroup$nonce): Response
  259.     {
  260.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  261.             throw $this->createAccessDeniedException("Not an ajax request!");
  262.         }
  263.         $form $this->createForm(
  264.             DevicePolygonType::class,
  265.             $deviceGroup,
  266.             [
  267.                 'action' => $this->generateUrl(
  268.                     'device_group_map',
  269.                     [
  270.                         'id' => $deviceGroup->getId(),
  271.                         'nonce' => $nonce
  272.                     ]
  273.                 ),
  274.                 'method' => 'POST'
  275.             ]
  276.         );
  277.         $form->handleRequest($request);
  278.         if ($form->isSubmitted() && $form->isValid()) {
  279. //            dump($deviceGroup);
  280. //            die;
  281.             $entityManager $this->getDoctrine()->getManager();
  282.             $entityManager->persist($deviceGroup);
  283.             $entityManager->flush();
  284.             return $this->redirectToRoute('device_group_index');
  285.         }
  286.         return $this->render(
  287.             'device_group/map.html.twig',
  288.             [
  289.                 'nonce' => urldecode(str_replace('?2F?''%2F'$nonce)),
  290.                 'device_group' => $deviceGroup,
  291.                 'mapbox_token' => strval($_ENV['MAPBOX_ACCESS_TOKEN']),
  292.                 'form' => $form->createView(),
  293.             ]
  294.         );
  295.     }
  296.     /**
  297.      * @Route("groups/show/map/{device}/{nonce}", name="device_group_show_map", methods={"GET","POST"})
  298.      * @IsGranted("VIEW_PLAN_MAPBOX")
  299.      * @param Request $request
  300.      * @param Device $device
  301.      * @param $nonce
  302.      * @return Response
  303.      */
  304.     public function deviceMap(Request $requestDevice $device$nonce): Response
  305.     {
  306.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  307.             throw $this->createAccessDeniedException("Not an ajax request!");
  308.         }
  309.         return $this->render(
  310.             'device_group/device_map.html.twig',
  311.             [
  312.                 'nonce' => urldecode(str_replace('?2F?''%2F'$nonce)),
  313.                 'device' => $device,
  314.                 'mapbox_token' => strval($_ENV['MAPBOX_ACCESS_TOKEN']),
  315.             ]
  316.         );
  317.     }
  318.     /**
  319.      * @Route("groups/delete/{id}", name="device_group_delete", methods={"DELETE"})
  320.      * @IsGranted("DEVICE_GROUP_DELETE", subject="deviceGroup")
  321.      * @param Request $request
  322.      * @param DeviceGroup $deviceGroup
  323.      * @return Response
  324.      */
  325.     public function delete(Request $requestDeviceGroup $deviceGroup): Response
  326.     {
  327.         if ($this->isCsrfTokenValid(
  328.             'delete' $deviceGroup->getId(),
  329.             $request->request->get('_token')
  330.         )) {
  331.             $entityManager $this->getDoctrine()->getManager();
  332.             $entityManager->remove($deviceGroup);
  333.             $entityManager->flush();
  334.         }
  335.         return $this->redirectToRoute('device_group_index');
  336.     }
  337.     /**
  338.      * @Route("groups/delete/form/{id}", name="device_group_delete_form", methods={"GET"})
  339.      * @IsGranted("DEVICE_GROUP_DELETE", subject="deviceGroup")
  340.      * @param Request $request
  341.      * @param DeviceGroup $deviceGroup
  342.      * @return Response
  343.      */
  344.     public function deleteForm(Request $requestDeviceGroup $deviceGroup): Response
  345.     {
  346.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  347.             throw $this->createAccessDeniedException("Not an ajax request!");
  348.         }
  349.         $form $this->createFormBuilder()
  350.             ->setAction(
  351.                 $this->generateUrl(
  352.                     'device_group_delete',
  353.                     array('id' => $deviceGroup->getId())
  354.                 )
  355.             )
  356.             ->setMethod('DELETE')
  357.             ->getForm();
  358.         return $this->render(
  359.             'device_group/delete.html.twig',
  360.             [
  361.                 'device_group' => $deviceGroup,
  362.                 'form' => $form->createView(),
  363.             ]
  364.         );
  365.     }
  366.     /**
  367.      * @Route("groups/delete/groups", name="device_group_delete_groups", methods={"POST"})
  368.      * @IsGranted("DEVICE_GROUP_MULTI_DELETE", subject="deviceGroup")
  369.      * @param Request $request
  370.      * @param DeviceGroupRepository $deviceGroupRepository
  371.      * @return Response
  372.      */
  373.     public function deleteDeviceGroups(Request $requestDeviceGroupRepository $deviceGroupRepository): Response
  374.     {
  375.         if (!$request->isXmlHttpRequest()) {
  376.             throw $this->createAccessDeniedException("Not an ajax request!");
  377.         }
  378.         /** @var User $user */
  379.         $user $this->getUser();
  380.         $data explode(
  381.             ',',
  382.             $request->request->get('data_ids')
  383.         );
  384.         $em $this->getDoctrine()->getManager();
  385.         foreach ($data as $id) {
  386.             $deviceGroup $deviceGroupRepository->findOneBy(["id" => $id"workspace" => $user->getWorkspace()->getId()]);
  387.             if (is_object($deviceGroup)) {
  388.                 foreach ($deviceGroup->getDevices() as $device) {
  389.                     $device->setDeviceGroup(null);
  390.                     $em->persist($device);
  391.                     $em->flush();
  392.                 }
  393.                 $em->remove($deviceGroup);
  394.             }
  395.         }
  396.         $em->flush();
  397.         return new Response('success');
  398.     }
  399.     /**
  400.      * @Route("groups/show/{deviceGroup}/device/{device}", name="device_group_device_show", methods={"GET"})
  401.      * @IsGranted("DEVICE_SHOW", subject="device")
  402.      * @param DeviceGroup $deviceGroup
  403.      * @param Device $device
  404.      * @return Response
  405.      */
  406.     public function showDeviceInDeviceGroup(DeviceGroup $deviceGroupDevice $device): Response
  407.     {
  408.         return $this->render(
  409.             'device_group/show_device.html.twig',
  410.             [
  411.                 'device_group' => $deviceGroup,
  412.                 'device' => $device,
  413.             ]
  414.         );
  415.     }
  416.     /**
  417.      * @Route("/groups/{deviceGroup}/device/fix/{device}", name="device_bc_fix", methods={"GET"})
  418.      * @IsGranted("DEVICE_SHOW", subject="device")
  419.      * @param DeviceGroup $deviceGroup
  420.      * @param Device $device
  421.      * @param DDMService $ddmService
  422.      * @return Response
  423.      * @throws Exception
  424.      */
  425.     public function bcFix(DeviceGroup $deviceGroupDevice $deviceDDMService $ddmService): Response
  426.     {
  427.         //die("hello");
  428.         $ddmService->registerDevice($device);
  429.         return $this->redirectToRoute('device_group_device_show', ['device' => $device->getId(), 'deviceGroup' => $deviceGroup->getId()]);
  430.     }
  431. }