Commit 4d0b82b4 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Command à la place de la route

parent 0054b59d
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
<?php


use UnicaenEvenement\Command\TraiterEvenementsCommand;
use UnicaenEvenement\Command\TraiterEvenementsCommandFactory;

return [
    'bjyauthorize' => [
        'guards' => [
        ],
    ],

    'laminas-cli' => [
        'commands' => [
            'evenement:traiter-evenements' => TraiterEvenementsCommand::class,
        ],
    ],

    'controllers' => [
        'factories' => [
        ],
    ],
    'service_manager' => [
        'factories' => [
            TraiterEvenementsCommand::class => TraiterEvenementsCommandFactory::class,
        ],
    ],

    'form_elements' => [
        'factories' => [
        ],
    ],
    'hydrators' => [
        'factories' => [
        ],
    ],
    'view_helpers' => [
        'invokables' => [
        ],
    ],
];
+2 −30
Original line number Diff line number Diff line
@@ -2,9 +2,8 @@

namespace UnicaenEvenement;

use Unicaen\Console\Router\Simple;
use UnicaenEvenement\Controller\EvenementConsoleController;
use UnicaenEvenement\Controller\EvenementConsoleControllerFactory;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;
use UnicaenEvenement\Controller\EvenementController;
use UnicaenEvenement\Controller\EvenementControllerFactory;
use UnicaenEvenement\Form\Evenement\EvenementForm;
@@ -22,8 +21,6 @@ use UnicaenEvenement\View\Helper\EvenementsViewHelper;
use UnicaenEvenement\View\Helper\EvenementViewHelper;
use UnicaenEvenement\View\Helper\JournalViewHelper;
use UnicaenPrivilege\Guard\PrivilegeController;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;

return [
    'bjyauthorize' => [
@@ -52,13 +49,6 @@ return [
                    ],
                    'privileges' => EvenementinstancePrivileges::INSTANCE_SUPPRESSION,
                ],
                [
                    'controller' => EvenementConsoleController::class,
                    'action' => [
                        'traiter-evenements'
                    ],
                    'roles' => [],
                ],
            ],
        ],
    ],
@@ -131,23 +121,6 @@ return [
        ],
    ],

    'console' => [
        'router' => [
            'routes' => [
                'traiter-evenements' => [
                    'type' => Simple::class,
                    'options' => [
                        'route' => 'traiter-evenements',
                        'defaults' => [
                            'controller' => EvenementConsoleController::class,
                            'action' => 'traiter-evenements'
                        ],
                    ],
                ],
            ],
        ],
    ],

    'service_manager' => [
        'factories' => [
            EvenementService::class => EvenementServiceFactory::class,
@@ -161,7 +134,6 @@ return [
    'controllers' => [
        'factories' => [
            EvenementController::class => EvenementControllerFactory::class,
            EvenementConsoleController::class => EvenementConsoleControllerFactory::class,
        ],
    ],

+3 −3
Original line number Diff line number Diff line
@@ -104,17 +104,17 @@ Pour récupérer la méthode ```traiter()``` qui est associé à l'événement.

---

Route console pour lancer le traitement des événements.
Commande pour lancer le traitement des événements.
===

```sh
$ docker exec preecog php public/index.php traiter-evenements
$ docker exec preecog ./vendor/bin/laminas evenement:traiter-evenements
```

Déclaration dans la crontab
```sh 
# - Traitement des évènements en attente
*/1 *   * * *   root cd /var/www/html && php public/index.php traiter-evenements 1> /dev/null 2>&1
*/1 *   * * *   root cd /var/www/html && ./vendor/bin/laminas evenement:traiter-evenements 1> /dev/null 2>&1
```

---
+60 −49
Original line number Diff line number Diff line
<?php

namespace UnicaenEvenement\Controller;
namespace UnicaenEvenement\Command;

use DateTime;
use Exception;
use RuntimeException;
use Unicaen\Console\ColorInterface;
use Unicaen\Console\Controller\AbstractConsoleController;
use Unicaen\Console\Request as ConsoleRequest;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use UnicaenEvenement\Entity\Db\Etat;
use UnicaenEvenement\Entity\Db\Journal;
use UnicaenEvenement\Service\Etat\EtatServiceAwareTrait;
@@ -15,11 +15,11 @@ use UnicaenEvenement\Service\Evenement\EvenementServiceAwareTrait;
use UnicaenEvenement\Service\EvenementGestion\EvenementGestionServiceAwareTrait;
use UnicaenEvenement\Service\Journal\JournalServiceAwareTrait;

class EvenementConsoleController extends AbstractConsoleController
class TraiterEvenementsCommand extends Command
{
    use EvenementGestionServiceAwareTrait;
    use EvenementServiceAwareTrait;
    use EtatServiceAwareTrait;
    use EvenementServiceAwareTrait;
    use EvenementGestionServiceAwareTrait;
    use JournalServiceAwareTrait;

    /**
@@ -30,65 +30,82 @@ class EvenementConsoleController extends AbstractConsoleController
     * vraleur par défaut : 300s
     * @file /etc/crontab
     */
    protected $maxExecutionTime = 300;
    protected int $maxExecutionTime = 300;

    public function getMaxExecutionTime(): int
    {
        return $this->maxExecutionTime;
    }

    public function setMaxExecutionTime(int $maxExecutionTime): void
    {
        $this->maxExecutionTime = $maxExecutionTime;
    }

    protected static $defaultName = 'evenement:traiter-evenements';

    public function traiterEvenementsAction(): void
    protected function configure(): void
    {
        $request = $this->getRequest();
        $texte = "";

        if (!$request instanceof ConsoleRequest) {
            throw new RuntimeException('Cette action doit être appelée depuis une console !');
        $this->setDescription("Traitement des événements en attente");
        //$this->addArgument('event', InputArgument::OPTIONAL, "ID de l'événement");
    }

        //Si un journal est en cours depuis trop longtemp, on le met en echec dans le journal pour cause de timeout
        //Celà évite d'être bloqué car un traitement est resté dans l'état En cours
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);
        //$event = $input->getArgument('event');

        $io->title("Traitement des événements en attente");

        $journal = $this->getJournalService()->getDernierJournal();
        if ($this->getJournalService()->isRunning()) {
            $io->error("Un traitement est déjà en cours !");
            return self::FAILURE;
        }

        if (isset($journal) && $journal->getEtat()->getCode() == Etat::EN_COURS) {
            $time = new DateTime();
            $executionTime = $time->getTimestamp() - $journal->getDate()->getTimestamp();
            if ($executionTime >= $this->maxExecutionTime) {
//            if(true) { // pour les test
                $log = $journal->getLog();
                $log .= sprintf("-----------<br/>");
                $log .= "-----------<br/>";
                $log .= sprintf("Mise en echec le %s à %s car temps d'exécution trop long <br/>",
                    $time->format('d/m/Y'), $time->format('H:i')
                );
                $log .= sprintf("-----------<br/>");
                $this->getConsole()->writeLine("\n* " . ($titre = "Mise en échec du journal #".$journal->getId()) . " *\n", ColorInterface::RED);
                $log .= "-----------<br/>";
                $io->warning("Mise en échec du journal #" . $journal->getId());
                $journal->setLog($log);
                $journal->setEtat($this->getEtatEvenementService()->findByCode(Etat::ECHEC));
                $this->getJournalService()->update($journal);
            }
        }

        if ($this->getJournalService()->isRunning()) {
            throw new \RuntimeException('Un traitement est déjà en cours !');
        }
        $texte = "";

        $journal = new Journal();
        $journal->setDate(new DateTime());
        $journal->setEtat($this->getEtatEvenementService()->findByCode(Etat::EN_COURS));
        $this->getJournalService()->create($journal);

        $start = new DateTime();
        $this->getConsole()->writeLine("\n* " . ("Traitement des événements en attente") . " *\n", ColorInterface::LIGHT_GREEN);
        $this->getConsole()->writeLine("Debut du traitement", ColorInterface::GREEN);
        $this->getConsole()->writeLine("-------------------\n", ColorInterface::GREEN);

        $texte .= "Début du traitement : " . (new DateTime())->format('d/m/Y H:i:s') . "<br/>";
        $io->success("Traitement des événements en attente");
        $io->success("Debut du traitement");
        $io->success("-------------------");

        $start = new DateTime(); $nbOp = 0;
        $texte .= "Début du traitement : " . $start->format('d/m/Y H:i:s') . "<br/>";

        $nbOp = 0;
        $evenements = $this->getEvenementService()->getEvenementsByEtat(Etat::EN_ATTENTE);
        if (empty($evenements)) {
            $io->info("Aucun événément à traiter");
            $journal->setLog("Aucun événément à traiter");
            $journal->setEtat($this->getEtatEvenementService()->findByCode(Etat::SUCCES));
            $this->getJournalService()->update($journal);

            $io->success("-------------------");
            $io->success("Fin du traitement");
            return self::SUCCESS;
        }

        foreach ($evenements as $evenement) {
            // calcul du temps d'exécution
@@ -101,38 +118,32 @@ class EvenementConsoleController extends AbstractConsoleController
            try {
                if ($evenement !== null) {
                    $this->evenementGestionService->traiterEvent($evenement);
                    $this->getConsole()->writeLine(sprintf("- traitement de l'événement #%s", $evenement->getId()));
                    $io->text("- traitement de l'événement #" . $evenement->getId());
                    $texte .= "Traitement de l'événement #" . $evenement->getId() . " <br/>";
                    $nbOp++;
                }
            } catch (Exception $e) {
                $this->getConsole()->writeLine(sprintf("- échec du traitement de l'événement #%s", $evenement->getId()), ColorInterface::RED);
                $this->getConsole()->writeLine($e->getMessage(),ColorInterface::LIGHT_RED);
                $io->error(sprintf("- échec du traitement de l'événement #%s", $evenement->getId()));
                $io->warning($e->getMessage());
                $texte .= "<strong> Échec du traitement </strong> <br/>";
            }
        }

        if ($nbOp == 0) {
            $this->getConsole()->writeLine("Aucun événement à traiter.");
        }

        $this->getConsole()->writeLine("\n-------------------", ColorInterface::GREEN);
        $this->getConsole()->writeLine("Fin du traitement", ColorInterface::GREEN);
        $end = new DateTime();
        $texte .= "Fin du traitement : " . $end->format('d/m/Y H:i:s');

        $texte .= "Fin du traitement : " . (new DateTime())->format('d/m/Y H:i:s') ;
        $io->info("Rapport");
        $io->info("-------");
        $io->info("* Nombre d'opérations : " . $nbOp);
        $io->info("* Temps estimé : " .  ($start->diff(new DateTime())->format('%Hh %Im %Ss')));

        $this->getConsole()->writeLine("\nRapport", ColorInterface::CYAN);
        $this->getConsole()->writeLine("-------", ColorInterface::CYAN);
        $this->getConsole()->writeLine(sprintf("* Nombre d'opérations : %s", $nbOp), ColorInterface::CYAN);
        $this->getConsole()->writeLine(sprintf("* Temps estimé : %s", $start->diff(new DateTime())->format('%Hh %Im %Ss')), ColorInterface::CYAN);
        $io->success("-------------------");
        $io->success("Fin du traitement");

        $journal->setLog($texte);
        $journal->setEtat($this->getEtatEvenementService()->findByCode(Etat::SUCCES));
        $this->getJournalService()->update($journal);

        try {
            $this->getJournalService()->create($journal);
        } catch (Exception $e) {
            throw new RuntimeException("Oupsy", 0, $e);
        }
        return self::SUCCESS;
    }
}
 No newline at end of file
+21 −21
Original line number Diff line number Diff line
<?php

namespace UnicaenEvenement\Controller;
namespace UnicaenEvenement\Command;

use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\Console\Command\Command;
use UnicaenEvenement\Service\Etat\EtatService;
use UnicaenEvenement\Service\Evenement\EvenementService;
use UnicaenEvenement\Service\EvenementGestion\EvenementGestionService;
use UnicaenEvenement\Service\Journal\JournalService;

class EvenementConsoleControllerFactory {

class TraiterEvenementsCommandFactory extends Command
{
    /**
     * @throws ContainerExceptionInterface
     * @throws NotFoundExceptionInterface
     */
    public function __invoke(ContainerInterface $container) : EvenementConsoleController
    public function __invoke(ContainerInterface $container): TraiterEvenementsCommand
    {
        $command = new TraiterEvenementsCommand();

        $config = $container->get('Configuration');
        if(isset($config['unicaen-evenement']['max_time_execution'])){
            $max_time_execution = $config['unicaen-evenement']['max_time_execution'];
            $command->setMaxExecutionTime(intval($max_time_execution));
        }

        /**
         * @var EtatService $etatService
         * @var EvenementService $evenementService
         * @var EvenementGestionService $evenementGestionService
         * @var EtatService $etatService
         * @var JournalService $journalService
         */
        $etatService = $container->get(EtatService::class);
        $evenementService = $container->get(EvenementService::class);
        $evenementGestionService = $container->get(EvenementGestionService::class);
        $etatService = $container->get(EtatService::class);
        $journalService = $container->get(JournalService::class);

        $controller = new EvenementConsoleController();
        $controller->setEvenementService($evenementService);
        $controller->setEvenementGestionService($evenementGestionService);
        $controller->setEtatEvenementService($etatService);
        $controller->setJournalService($journalService);

        $config = $container->get('Configuration');
        if(isset($config['unicaen-evenement']['max_time_execution'])){
            $max_time_execution = $config['unicaen-evenement']['max_time_execution'];
            $controller->setMaxExecutionTime(intval($max_time_execution));
        }

        return $controller;
        $command->setEtatEvenementService($etatService);
        $command->setEvenementService($evenementService);
        $command->setEvenementGestionService($evenementGestionService);
        $command->setJournalService($journalService);
        return $command;
    }
}