src/Controller/V2Controller.php line 316

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Forms;
  4. use App\Entity\Inspection;
  5. use App\Repository\FormsRepository;
  6. use App\Repository\InspectionRepository;
  7. use DateTimeImmutable;
  8. use Intervention\Image\ImageManagerStatic as Image;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  16. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  17. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  18. use Symfony\Component\Serializer\Serializer;
  19. /**
  20.  * @Route("/v2")
  21.  */
  22. class V2Controller extends AbstractController
  23. {
  24.     /**
  25.      * @Route("/inspections/", name="v2_list")
  26.      */
  27.     public function index()
  28.     {
  29.         return $this->render('v2/index.html.twig', []);
  30.     }
  31.     /**
  32.      * @Route("/inspections/form", name="v2_form_new")
  33.      */
  34.     public function form_new()
  35.     {
  36.         return $this->render('v2/form.html.twig', []);
  37.     }
  38.     /**
  39.      * @Route("/inspections/form/{uuid}", name="v2_form_edit")
  40.      */
  41.     public function form_edit($uuid)
  42.     {
  43.         return $this->render('v2/form.html.twig', ['uuid'=>$uuid]);
  44.     }
  45.     /**
  46.      * @Route("/inspections/show/{uuid}", name="v2_forms_show", methods={"GET"})
  47.      */
  48.     public function show($uuidInspectionRepository $inspectionRepository): Response
  49.     {
  50.         // Get count of all forms
  51.         $form $inspectionRepository->findOneBy(['uuid'=>$uuid]);
  52.         if( $form == null ) {
  53.             return new Response('Error'404);
  54.         }
  55.         $bedroom_ids = []; $bathroom_ids = [];
  56.         foreach( $form->getData() as $r => $v ) {
  57.             if( gettype($r) == "string" ) {
  58.                 $sp explode("_"$r);
  59.                 if (count($sp) == && $sp[0] == "bedroom" && $sp[2] == "name") {
  60.                     $bedroom_ids[] = $sp[1];
  61.                 }
  62.                 if (count($sp) == && $sp[0] == "bathroom" && $sp[2] == "name") {
  63.                     $bathroom_ids[] = $sp[1];
  64.                 }
  65.             }
  66.         }
  67.         // TODO: update template
  68.         return $this->render('v2/show.html.twig', [
  69.             'f' => $form,
  70.             'bedrooms' => $bedroom_ids,
  71.             'bathrooms' => $bathroom_ids,
  72.         ]);
  73.     }
  74.     /**
  75.      * @Route("/inspections/delete/{uuid}", defaults={"uuid"=""}, name="v2_form_delete")
  76.      */
  77.     public function form_delete($uuidInspectionRepository $inspectionRepository)
  78.     {
  79.         $f $inspectionRepository->findOneBy( ['uuid'=>$uuid] );
  80.         if( ! $f ) {
  81.             $f = new Inspection();
  82.             $f->setUuid($uuid);
  83.         }
  84.         return $this->render('v2/delete.html.twig', [
  85.             "f" => $f
  86.         ]);
  87.     }
  88.     /**
  89.      * @Route("/delete/confirm", name="v2_form_delete_confirm", methods={"POST"})
  90.      */
  91.     public function form_delete_confirm(Request $requestInspectionRepository $inspectionRepository)
  92.     {
  93.         if ($this->isCsrfTokenValid('delete'$request->request->get('_token'))) {
  94.             // Remove server copy
  95.             $f $inspectionRepository->findOneBy( ['uuid'=>$request->request->get('uuid')] );
  96.             if( $f ) {
  97.                 $entityManager $this->getDoctrine()->getManager();
  98.                 // $entityManager->remove($f);
  99.                 $f->setIsDeleted(true);
  100.                 $entityManager->flush();
  101.             }
  102.         }
  103.         return $this->redirectToRoute('v2_list');
  104.     }
  105.     /**
  106.      * @Route("/inspections/bedroom", name="v2_form_bedroom")
  107.      */
  108.     public function form_bedroom(Request $request)
  109.     {
  110.         return $this->render('v2/_bedroom.html.twig', [
  111.             "id" => $request->query->get('id')
  112.         ]);
  113.     }
  114.     /**
  115.      * @Route("/inspections/bathroom", name="v2_form_bathroom")
  116.      */
  117.     public function form_bathroom(Request $request)
  118.     {
  119.         return $this->render('v2/_bathroom.html.twig', [
  120.             "id" => $request->query->get('id')
  121.         ]);
  122.     }
  123.     /**
  124.      * @Route("/api/list", name="v2_api_list")
  125.      */
  126.     public function api_list(
  127.         Request $request,
  128.         InspectionRepository $inspectionRepository,
  129.         LoggerInterface $logger
  130.     )
  131.     {
  132.         $logger->debug(
  133.             sprintf(
  134.                 "%s by %s",
  135.                 $request->attributes->get('_route'),
  136.                 $this->getUser()->getUsername()
  137.             ), $request->query->all()
  138.         );
  139.         if( $this->getUser() === null ) {
  140.             $forms $this->get('serializer')->serialize([], 'json');
  141.             $response = new Response();
  142.             $response->setContent($forms);
  143.             $response->headers->set('Content-Type''application/json');
  144.             return $response;
  145.         }
  146.         $forms $inspectionRepository->findInspections(
  147.             1,
  148.             $request->query->get('brand''THC'),
  149.             $request->query->get('filter'''),
  150.             $request->query->get('all_users') == 'true' '' $this->getUser()->getId()
  151.         );
  152.         $encoder = new JsonEncoder();
  153.         $defaultContext = [
  154.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object$format$context) {
  155.                 return $object->getUuid();
  156.             },
  157.         ];
  158.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull$defaultContext);
  159.         $serializer = new Serializer([$normalizer], [$encoder]);
  160.         $forms $serializer->serialize($forms'json');
  161.         $response = new Response();
  162.         $response->setContent($forms);
  163.         $response->headers->set('Content-Type''application/json');
  164.         return $response;
  165.     }
  166.     /**
  167.      * @Route("/api/get/{uuid}", name="v2_api_get", methods={"GET"})
  168.      */
  169.     public function api_get(
  170.         $uuid,
  171.         Request $request,
  172.         InspectionRepository $inspectionRepository,
  173.         LoggerInterface $logger
  174.     )
  175.     {
  176.         $logger->debug(
  177.             sprintf(
  178.                 "%s by %s",
  179.                 $request->attributes->get('_route'),
  180.                 $this->getUser()->getUsername()
  181.             ), [$uuid]
  182.         );
  183.         $form $inspectionRepository->findOneBy(['uuid'=>$uuid]);
  184.         if( $form == null ) {
  185.             return new JsonResponse(['error'=>'Cannot find inspection'], 404);
  186.         }
  187.         $encoder = new JsonEncoder();
  188.         $defaultContext = [
  189.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object$format$context) {
  190.                 return $object->getUuid();
  191.             },
  192.         ];
  193.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull$defaultContext);
  194.         $serializer = new Serializer([$normalizer], [$encoder]);
  195.         $form $serializer->serialize($form->getData(), 'json');
  196.         $response = new Response();
  197.         $response->setContent($form);
  198.         $response->headers->set('Content-Type''application/json');
  199.         return $response;
  200.     }
  201.     public function handleUploads$f ) {
  202.         // return $f;
  203.         // print "<pre>"; print_r( $_FILES ); print_r( $_POST );
  204.         foreach( $_FILES as $fieldname => $file ) {
  205.             $fileName $file['name'];
  206.             $fileSize $file['size'];
  207.             $fileTmpName  $file['tmp_name'];
  208.             $fileType $file['type'];
  209.             $fileExtension pathinfo($fileNamePATHINFO_EXTENSION);
  210.             $filename pathinfo($fileNamePATHINFO_FILENAME);
  211.             // $filename = $filename.'-'.uniqid().'.'.$fileExtension;
  212.             $filename $filename.'.'.$fileExtension;
  213.             $uploadPath $this->getParameter('upload_directory') . '/' $f['uuid'] . '/' $filename;
  214.             // print $uploadPath; exit;
  215.             if( !is_dir$this->getParameter('upload_directory') . '/' $f['uuid'] ) ) {
  216.                 mkdir$this->getParameter('upload_directory') . '/' $f['uuid'] );
  217.             }
  218.             if( !is_dir$this->getParameter('upload_directory') . '/' $f['uuid'] . '/_thumb/' ) ) {
  219.                 mkdir$this->getParameter('upload_directory') . '/' $f['uuid'] . '/_thumb/' );
  220.             }
  221.             if( !is_dir$this->getParameter('upload_directory') . '/' $f['uuid'] . '/_medium/' ) ) {
  222.                 mkdir$this->getParameter('upload_directory') . '/' $f['uuid'] . '/_medium/' );
  223.             }
  224.             move_uploaded_file($fileTmpName$uploadPath);
  225.             if( file_exists$uploadPath ) ) {
  226.                 $allowed = array('gif''png''jpg''jpeg');
  227.                 if (in_arraystrtolower($fileExtension), $allowed) ) {
  228.                     $img Image::make$this->getParameter('upload_directory') . '/' $f['uuid'] .'/' $filename )->orientate();
  229.                     $img->resize(800800, function ($constraint) {
  230.                         $constraint->aspectRatio();
  231.                         $constraint->upsize();
  232.                     });
  233.                     // $img->fit(200, 200);
  234.                     $img->save$this->getParameter('upload_directory') . '/' $f['uuid'] . '/_medium/' $filename );
  235.                     // $img = Image::make( $this->getParameter('upload_directory') . '/' . $f['uuid'] .'/' . $filename );
  236.                     $img->fit(7575);
  237.                     $img->save$this->getParameter('upload_directory') . '/' $f['uuid'] . '/_thumb/' $filename );
  238.                     $img->destroy();
  239.                 }
  240.                 // Add to entity
  241.                 $f[$fieldname] = $filename;
  242.             }
  243.         }
  244.         // Look for empty image fields and remove them from database
  245.         $imageFields = [
  246.             'extpic1''extpic2''extpic3''extpic4',
  247.             'bedroomspic1''bedroomspic2''bedroomspic3''bedroomspic4',
  248.             'bathroomspic1''bathroomspic2''bathroomspic3''bathroomspic4',
  249.             'kitchenpic1''kitchenpci2''kitchenpic3''kitchenpic4',
  250.             'publicpic1''publicpic2''publicpic3''publicpic4',
  251.             'safetypic1''safetypic2''safetypic3''safetypic4',
  252.             'generalpic1''generalpic2''generalpic3''generalpic4',
  253.         ];
  254.         foreach( $imageFields as $fieldname ) {
  255.             if( isset($_POST[$fieldname]) && $_POST[$fieldname] === 'null' ) {
  256.                 $f[$fieldname] = null;
  257.             }
  258.         }
  259.         return $f;
  260.     }
  261.     /**
  262.      * @Route("/api/post", name="v2_api_post", methods={"POST"})
  263.      */
  264.     public function api_post(
  265.         Request $request,
  266.         InspectionRepository $inspectionRepository,
  267.         LoggerInterface $logger
  268.     ): Response
  269.     {
  270.         $logger->debug(
  271.             sprintf(
  272.                 "%s by %s",
  273.                 $request->attributes->get('_route'),
  274.                 $this->getUser()->getUsername()
  275.             ), $_POST
  276.         );
  277.         if( count($_FILES) ) {
  278.             $logger->debug(
  279.                 sprintf(
  280.                     "%s by %s",
  281.                     $request->attributes->get('_route'),
  282.                     $this->getUser()->getUsername()
  283.                 ), $_FILES
  284.             );
  285.         }
  286.         if( !isset( $_POST['completeness'] ) ) {
  287.             $logger->error(
  288.                 sprintf(
  289.                     "%s by %s: Completeness field missing",
  290.                     $request->attributes->get('_route'),
  291.                     $this->getUser()->getUsername()
  292.                 )
  293.             );
  294.             $msg = [ "error" => "Completeness parameter not set. Probably missing some data. Don't sync."];
  295.             return new JsonResponse($msg401);
  296.         }
  297. //        $logger->debug( 'API POST', $_POST );
  298. //        $logger->debug( 'API FILES', $_FILES );
  299. //         print_r( $_FILES );
  300. //         print_r( $_POST );
  301.         $encoder = new JsonEncoder();
  302.         $defaultContext = [
  303.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object$format$context) {
  304.                 return $object->getUuid();
  305.             },
  306.         ];
  307.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull$defaultContext);
  308.         $serializer = new Serializer([$normalizer], [$encoder]);
  309.         $entityManager $this->getDoctrine()->getManager();
  310.         $all $request->request->all();
  311.         if( count($all) < 80 ) {
  312.             $logger->error(
  313.                 sprintf(
  314.                     "%s by %s: Number of fields = %d",
  315.                     $request->attributes->get('_route'),
  316.                     $this->getUser()->getUsername(),
  317.                     count($all)
  318.                 )
  319.             );
  320.             $msg = [ "error" => "Number of fields seems too low. Don't sync."];
  321.             return new JsonResponse($msg401);
  322.         }
  323.         // Upload and resize images
  324.         foreach( $_FILES as $fieldname => $file ) {
  325.             if( $file['error'] > ) {
  326.                 $logger->error(
  327.                     sprintf(
  328.                         "%s by %s: Error uploading file",
  329.                         $request->attributes->get('_route'),
  330.                         $this->getUser()->getUsername()
  331.                     ), $file
  332.                 );
  333.                 $msg = [ "error" => "Number of fields seems too low. Don't sync."];
  334.                 return new JsonResponse($msg401);
  335.             }
  336.         }
  337.         $all $this->handleUploads($all);
  338.         // TODO: handle 'completeness'
  339.         // Add inspection to database
  340.         try {
  341.             $inspection $inspectionRepository->findOneBy(['uuid' => $request->request->get('uuid')]);
  342.             if (!$inspection) {
  343.                 $inspection = new Inspection();
  344.                 $inspection->setUserId($this->getUser()->getId());
  345.             } else {
  346.                 // Check if the completeness value is less than the saved one - maybe a problem
  347.                 if( $request->request->getInt('completeness'0) < $inspection->getCompleteness() ) {
  348.                     $logger->error(
  349.                         sprintf(
  350.                             "%s by %s: Previous completeness %d, New completeness %d",
  351.                             $request->attributes->get('_route'),
  352.                             $this->getUser()->getUsername(),
  353.                             $inspection->getCompleteness(),
  354.                             $request->request->getInt('completeness'0)
  355.                         )
  356.                     );
  357.                     $msg = [ "error" => "Completeness parameter is less than currently saved. Don't sync."];
  358.                     return new JsonResponse($msg401);
  359.                 }
  360.             }
  361.             $inspection->setUuid($request->request->get('uuid'));
  362.             $inspection->setDate(DateTimeImmutable::createFromFormat('Y-m-d'$request->request->get('date')));
  363.             $inspection->setPropname($request->request->get('propname'));
  364.             $inspection->setBrand($request->request->get('brand''THC'));
  365.             $inspection->setVersion($request->request->getInt('version'1));
  366.             $inspection->setTotalScore($request->request->getInt('totalScore'0));
  367.             $inspection->setStars((float)$request->request->get('stars'0));
  368.             $inspection->setCompleteness($request->request->getInt('completeness'0));
  369.             $inspection->setData($all);
  370.             if( $inspection->getVersion() == ) {
  371.                 $inspection->setVersion(1);
  372.                 $all['version'] = 1;
  373.             }
  374. //            return new JsonResponse([], 401);
  375.             $inspection->setIsDeleted(false);
  376.             $entityManager->persist($inspection);
  377.             $entityManager->flush();
  378.             $all $serializer->serialize($all'json');
  379.             $response = new Response();
  380.             $response->setContent($all);
  381.             $response->headers->set('Content-Type''application/json');
  382.             return $response;
  383.         } catch( \Exception $e ) {
  384.             return new JsonResponse(['error'=>$e->getMessage()], 401);
  385.         }
  386.         return new JsonResponse([], 401);
  387.     }
  388. }