src/Controller/Scheduler/SchedulerController.php line 294

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Scheduler;
  3. use App\Service\SycoreService;
  4. use Psr\Log\LoggerInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  10. class SchedulerController  extends AbstractController
  11. {
  12.     public function __construct(SycoreService $sycoreService) {
  13.         $this->sycoreService = $sycoreService;
  14.     }
  15.     // ------------------------------------------------------------------------
  16.     // 
  17.     // ------------------------------------------------------------------------
  18.     private function getWorkflowParameters(int $workflowId): array {
  19.         $em = $this->getDoctrine()->getManager();
  20.         $sql = <<<SQL
  21.             SELECT param_name, param_value, param_type, flag_file 
  22.               FROM sybot.chklst_template_parameters 
  23.              WHERE chklst_id = :workflowId
  24.         SQL;
  25.         $query = $em->getConnection()->executeQuery($sql, ['workflowId' => $workflowId]);
  26.         $result = $query->fetchAllAssociative();
  27.         // Attenzione: valuelist ABUSA del campo "param_value" per contenere
  28.         // la lista delle opzioni. Per aggirare questo gravissimo errore
  29.         // logico (la lista delle opzioni è il DOMINIO, non il valore!)
  30.         // dobbiamo creare un nuovo campo "param_options" e spostare lì
  31.         // il contenuto di "param_value". Il campo "param_value" va azzerato.
  32.         foreach ($result as &$p) {
  33.             if ($p['param_type'] === 'valuelist') {
  34.                 $p['param_options'] = $p['param_value'];
  35.                 $p['param_value'] = null;
  36.             }
  37.         }
  38.         return $result;
  39.     }
  40.     // ------------------------------------------------------------------------
  41.     // QUERY
  42.     // ------------------------------------------------------------------------
  43.     public function queryAction(Request $request, LoggerInterface $logger, ParameterBagInterface $params) {
  44.         $em = $this->getDoctrine()->getManager();
  45.         try 
  46.         {
  47.         
  48.             $workflowId = $request->query->get("workflowId");
  49.             
  50.             $sql = <<<SQL
  51.                 SELECT *
  52.                 FROM sybot.wfl_schedule
  53.                 WHERE workflow_id = :workflowId
  54.                 ORDER BY created ASC
  55.             SQL;
  56.             $query = $em->getConnection()->executeQuery($sql, ['workflowId' => $workflowId]);
  57.             $result = $query->fetchAllAssociative();
  58.             // Attenzione! la lista dei parametri del workflow potrebbe essere
  59.             // stato modificata dopo la creazione della schedulazione, quindi
  60.             // la lista dei parametri salvati (nella schedulazione) potrebbe
  61.             // essere disallineata! 
  62.             // I parametri che *devono* esserci sono quelli attuali del workflow,
  63.             // inizializzati con i valori salvati nella schedulazione (se presenti)
  64.             // (tutti gli altri vanno eliminati)
  65.             
  66.             $parameters = $this->getWorkflowParameters($workflowId);
  67.             foreach ($result as $index => $row) {
  68.                 // Lista dei parametri correntemente associati alla schedulazione
  69.                 $savedParametersList = json_decode($row['parameters'], true);
  70.                 $savedParametersMap = [];
  71.                 foreach ($savedParametersList as $p) {
  72.                     $savedParametersMap[$p['param_name']] = $p;
  73.                 }
  74.                 
  75.                 // Attraversiamo la lista completa dei parametri del workflow
  76.                 // recuperata prima e costruiamo una nuova lista di parametri
  77.                 // per la schedulazione corrente, sovrascrivendo i valori con
  78.                 // quelli salvati (se presenti)
  79.                 $parametersOfSchedule = [];
  80.                 foreach ($parameters as &$p) {
  81.                     $paramName = $p['param_name'];
  82.                     if (array_key_exists($paramName, $savedParametersMap)) {
  83.                         $p['param_value'] = $savedParametersMap[$paramName]['param_value'];
  84.                         $p['param_options'] = $savedParametersMap[$paramName]['param_options'] ?? null;
  85.                     }
  86.                     $parametersOfSchedule[] = $p;
  87.                 }
  88.                 $result[$index]['parameters'] = $parametersOfSchedule;                
  89.             }
  90.             return new JsonResponse($result);
  91.         } catch (\Exception $e) {
  92.             $logger->error("Errore durante il recupero delle schedulazioni: " . $e->getMessage());
  93.             return new JsonResponse(['error' => 'Impossibile recuperare le schedulazioni'], 500);
  94.         }
  95.     }
  96.     // ------------------------------------------------------------------------
  97.     // POST
  98.     // ------------------------------------------------------------------------
  99.     public function postAction(int $workflowId, Request $request, LoggerInterface $logger) {
  100.         
  101.         $em = $this->getDoctrine()->getManager();
  102.         $payload = json_decode($request->getContent(),true);
  103.         $csrftoken=$payload['csrftoken'];
  104.         if (!$this->isCsrfTokenValid('scheduler_route', $csrftoken)) {
  105.           throw new \Exception('Csrf token not valid');
  106.         }
  107.         $parameters = $this->getWorkflowParameters($workflowId);
  108.         $sql = <<<SQL
  109.             SELECT * FROM sybot.chklst_template_parameters WHERE workflow_id = :workflowId
  110.         SQL;
  111.         $user = $this->getUser();
  112.         $userId = $user->getID();        
  113.         $now = new \DateTime();        
  114.         $nowString = $now->format('Y-m-d H:i:s');
  115.         $sycore_info = $this->sycoreService->getSycoreInfo();
  116.         $sycore_instance_uuid = $sycore_info ? $sycore_info->instance_uuid : null;
  117.         
  118.         $defaults = [
  119.             'workflow_id' => $workflowId,
  120.             'from_date'  => $nowString,
  121.             'to_date'    => null,
  122.             'enabled'    => 'false',
  123.             'parameters' => json_encode($parameters),
  124.             'label'      => "Nuova schedulazione",
  125.             'cron'       => '* * * * *',            
  126.             'created'    => $nowString,     
  127.             'created_by' => $userId,
  128.             'modified'   => $nowString,
  129.             'modified_by' => $userId,
  130.             'sycore_instance_uuid' => $sycore_instance_uuid
  131.         ];
  132.         $sql = <<<SQL
  133.             INSERT INTO sybot.wfl_schedule (
  134.                 workflow_id, from_date, to_date, enabled, parameters, label, cron, created, created_by, modified, modified_by, sycore_instance_uuid
  135.             ) VALUES (
  136.                 :workflow_id, :from_date, :to_date, :enabled, :parameters, :label, :cron, :created, :created_by, :modified, :modified_by, :sycore_instance_uuid
  137.             )
  138.         SQL;
  139.         try {
  140.             $em->getConnection()->executeQuery($sql, $defaults);
  141.             $newId = $em->getConnection()->lastInsertId();
  142.             $logger->info("Creato nuovo schedule con ID: $newId");
  143.             return new JsonResponse([
  144.                 'status' => 'success',
  145.                 'id'     => $newId
  146.             ], Response::HTTP_CREATED);
  147.         } catch (\Exception $e) {
  148.             $logger->error("Error: " . $e->getMessage());
  149.             return new JsonResponse(['error' => 'Impossibile creare una nuova schedulazione'], 500);
  150.         }
  151.     }
  152.     
  153.     // ------------------------------------------------------------------------
  154.     // PUT
  155.     // ------------------------------------------------------------------------
  156.     public function putAction(int $scheduleId, Request $request, LoggerInterface $logger) {
  157.         
  158.         $em = $this->getDoctrine()->getManager();
  159.         
  160.         $payload = json_decode($request->getContent(),true);
  161.         $schedule=$payload['schedule'];
  162.         $csrftoken=$payload['csrftoken'];
  163.         if (!$this->isCsrfTokenValid('scheduler_route', $csrftoken)) {
  164.           throw new \Exception('Csrf token not valid');
  165.         }
  166.         if (!$schedule) {
  167.             return new JsonResponse(['error' => 'JSON malformato'], Response::HTTP_BAD_REQUEST);
  168.         }
  169.         $sql = <<<SQL
  170.             UPDATE sybot.wfl_schedule
  171.             SET from_date   = :from_date,
  172.                 to_date     = :to_date,
  173.                 enabled     = :enabled,
  174.                 parameters  = :parameters,
  175.                 label       = :label,
  176.                 cron        = :cron,
  177.                 modified    = :modified,
  178.                 modified_by = :modified_by
  179.             WHERE schedule_id = :schedule_id
  180.         SQL;
  181.         
  182.         $user = $this->getUser();
  183.         $userId = $user->getID();       
  184.         $modifiedAt = (new \DateTime())->format('Y-m-d H:i:s');
  185.         
  186.         try {
  187.             $em->getConnection()->executeQuery($sql, [
  188.                 'schedule_id' => $scheduleId,
  189.                 'from_date'   => $schedule['from_date'],
  190.                 'to_date'     => $schedule['to_date'],
  191.                 'enabled'     => $schedule['enabled'] ? 'true' : 'false', 
  192.                 'parameters'  => json_encode($schedule['parameters']),
  193.                 'label'       => $schedule['label'],
  194.                 'cron'        => $schedule['cron'],                
  195.                 'modified'    => $modifiedAt,
  196.                 'modified_by' => $userId
  197.             ]);
  198.             return new JsonResponse([
  199.                 'status'   => 'success',
  200.                 'modified' => $modifiedAt
  201.             ], Response::HTTP_OK);
  202.         } catch (\Exception $e) {
  203.             $logger->error("Errore " . $e->getMessage());
  204.             return new JsonResponse(['error' => $e->getMessage()], 500);
  205.         }
  206.     }
  207.     // ------------------------------------------------------------------------
  208.     // DELETE
  209.     // ------------------------------------------------------------------------
  210.     public function deleteAction(int $scheduleId, Request $request, LoggerInterface $logger) {
  211.         $em = $this->getDoctrine()->getManager();
  212.         $payload = json_decode($request->getContent(),true);
  213.         $csrftoken=$payload['csrftoken'];
  214.         if (!$this->isCsrfTokenValid('scheduler_route', $csrftoken)) {
  215.           throw new \Exception('Csrf token not valid');
  216.         }
  217.         
  218.         try {
  219.             $sql = <<< SQL
  220.                 DELETE FROM sybot.wfl_schedule WHERE schedule_id = :scheduleId
  221.             SQL;
  222.             $query = $em->getConnection()->executeQuery($sql, ['scheduleId' => $scheduleId]);
  223.             return new JsonResponse([
  224.                 "status" => "success"
  225.             ], Response::HTTP_OK);
  226.         } catch (\Exception $e) {
  227.             $logger->error("Errore" . $e->getMessage());
  228.             return new JsonResponse(['error' => $e->getMessage()], 500);
  229.         }
  230.  
  231.     }
  232.     // ------------------------------------------------------------------------
  233.     // runAction
  234.     // ------------------------------------------------------------------------
  235.     public function runAction(int $scheduleId, Request $request, LoggerInterface $logger, ParameterBagInterface $params)
  236.     {
  237.         $em = $this->getDoctrine()->getManager();
  238.         $logger->debug("Chiamata runAction per schedulazione ID: $scheduleId");
  239.         try {
  240.             $sql = <<<SQL
  241.                 SELECT * FROM sybot.wfl_schedule WHERE schedule_id = :scheduleId
  242.             SQL;
  243.             $query = $em->getConnection()->executeQuery($sql, ['scheduleId' => $scheduleId]);
  244.             $queryResult = $query->fetchAssociative();
  245.             $workflowId = $queryResult['workflow_id'];
  246.             $request->request->set('template_id', $workflowId );
  247.             $request->request->set('remote_api', 'SCHEDULER' );
  248.             $request->request->set('params', $queryResult['parameters'] );
  249.             $logger->debug("Invoco ChecklistController:runChecklistAction...");
  250.             $logger->debug("Request");
  251.             $logger->debug(print_r($request->request->all(), true));
  252.             
  253.             $response = $this->forward('App\Controller\ChecklistController:runChecklistAction',
  254.                 array(
  255.                     "request" => $request,
  256.                     "logger"  => $logger, 
  257.                     "params"  => $params, 
  258.                     "method"  => "internal" // <-- ??????
  259.                 )
  260.             );
  261.             $logger->debug("ChecklistController:runChecklistAction eseguito con risposta: " . $response->getContent());
  262.             // $res = json_decode($response->getContent(), true);
  263.         
  264.         } catch (\Exception $e) {
  265.             $logger->error("Errore durante l'esecuzione della schedulazione ID: $scheduleId - " . $e->getMessage());
  266.             return new JsonResponse(['error' => 'Impossibile eseguire la schedulazione'], 500);
  267.         }
  268.         return new JsonResponse(['status' => 'success'], Response::HTTP_OK);
  269.     }
  270. }
  271. ?>