Skip to content
Snippets Groups Projects
Commit 01d60ebd authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Affichage des logs d'import/synchro en live (avec unicaen/livelog)

parent 2fff8886
Branches
Tags
No related merge requests found
Pipeline #12473 passed
Showing
with 183 additions and 63 deletions
......@@ -4,6 +4,8 @@ namespace UnicaenDbImport;
use Doctrine\ORM\Mapping\Driver\XmlDriver;
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;
use UnicaenAuth\Guard\PrivilegeController;
use UnicaenDbImport\CodeGenerator\HelperAbstractFactory;
use UnicaenDbImport\Config\Config;
......@@ -29,6 +31,8 @@ use UnicaenDbImport\Entity\Db\Service\ImportObservResult\ImportObservResultServi
use UnicaenDbImport\Entity\Db\Service\Source\SourceService;
use UnicaenDbImport\Entity\Db\Service\Source\SourceServiceFactory;
use UnicaenDbImport\Entity\Db\Source;
use UnicaenDbImport\Log\LivelogLogger;
use UnicaenDbImport\Log\LivelogLoggerFactory;
use UnicaenDbImport\ORM\Event\Listeners\SourceListener;
use UnicaenDbImport\ORM\Event\Listeners\SourceListenerFactory;
use UnicaenDbImport\Privilege\ImportPrivilege;
......@@ -45,14 +49,12 @@ use UnicaenDbImport\Service\Facade\ImportFacadeService;
use UnicaenDbImport\Service\Facade\ImportFacadeServiceFactory;
use UnicaenDbImport\Service\Facade\LogFacadeService;
use UnicaenDbImport\Service\Facade\LogFacadeServiceFactory;
use UnicaenDbImport\Service\ImportService;
use UnicaenDbImport\Service\ImportServiceFactory;
use UnicaenDbImport\Service\Facade\SynchroFacadeService;
use UnicaenDbImport\Service\Facade\SynchroFacadeServiceFactory;
use UnicaenDbImport\Service\ImportService;
use UnicaenDbImport\Service\ImportServiceFactory;
use UnicaenDbImport\Service\SynchroService;
use UnicaenDbImport\Service\SynchroServiceFactory;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;
return [
'import' => [
......@@ -568,6 +570,8 @@ return [
ImportObservResultService::class => ImportObservResultServiceFactory::class,
SourceListener::class => SourceListenerFactory::class,
LivelogLogger::class => LivelogLoggerFactory::class,
],
'abstract_factories' => [
HelperAbstractFactory::class,
......
......@@ -2,9 +2,9 @@
namespace UnicaenDbImport\Controller;
use Laminas\Log\Logger;
use Laminas\Log\PsrLoggerAdapter;
use Laminas\Log\Writer\Stream;
use Laminas\Console\Adapter\Posix;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use UnicaenDbImport\Service\ImportService;
......@@ -13,24 +13,24 @@ use UnicaenDbImport\Service\SynchroService;
class ConsoleControllerFactory
{
/**
* @param \Interop\Container\ContainerInterface $sl
* @param \Laminas\ServiceManager\ServiceManager $container
* @return \UnicaenDbImport\Controller\ConsoleController
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
function __invoke(ContainerInterface $sl): ConsoleController
function __invoke(ContainerInterface $container): ConsoleController
{
/** @var ImportService $importService */
$importService = $sl->get(ImportService::class);
$synchroService = $sl->get(SynchroService::class);
$logger = $this->createLogger();
$importService->setLogger($logger);
$synchroService->setLogger($logger);
/** @var ImportService $importService */
$importService = $container->build(ImportService::class, ['logger' => $logger]);
/** @var SynchroService $synchroService */
$synchroService = $container->build(SynchroService::class, ['logger' => $logger]);
$controller = new ConsoleController();
$controller->setImportService($importService);
$controller->setSynchroService($synchroService);
$controller->setConsole(new Posix());
return $controller;
}
......@@ -40,9 +40,6 @@ class ConsoleControllerFactory
*/
private function createLogger(): LoggerInterface
{
$logger = new Logger();
$logger->addWriter(new Stream('php://output'));
return new PsrLoggerAdapter($logger);
return new Logger('console', [new StreamHandler('php://output')]);
}
}
\ No newline at end of file
......@@ -2,7 +2,6 @@
namespace UnicaenDbImport\Controller;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
use UnicaenDbImport\Domain\ImportInterface;
......@@ -60,37 +59,50 @@ class ImportController extends AbstractActionController
/**
* Lancement d'un import.
*
* @return \Laminas\Http\Response|bool
* @throws \Exception
*/
public function lancerAction(): Response
public function lancerAction()
{
$name = $this->params('name');
$import = $this->importService->getImportByName($name);
$result = $this->importService->runImport($import);
if ($this->getRequest()->isXmlHttpRequest()) {
return false;
} else {
$this->flashMessages($import, $result);
return $this->redirect()->toRoute('unicaen-db-import/import/voir', ['name' => $import->getName()]);
}
}
/**
* @return \Laminas\Http\Response
* @return \Laminas\Http\Response|bool
* @throws \Exception
*/
public function lancerMultipleAction(): Response
public function lancerMultipleAction()
{
$names = explode(',', $this->params('names', ''));
foreach ($names as $name) {
$import = $this->importService->getImportByName($name);
$result = $this->importService->runImport($import);
if (! $this->getRequest()->isXmlHttpRequest()) {
$this->flashMessages($import, $result);
}
}
if ($this->getRequest()->isXmlHttpRequest()) {
return false;
} else {
$redirect = $this->params()->fromQuery('redirect') ?: $this->url()->fromRoute('unicaen-db-import/import');
return $this->redirect()->toUrl($redirect);
}
}
protected function flashMessages(ImportInterface $import, ImportResult $result)
{
......
......@@ -4,21 +4,27 @@ namespace UnicaenDbImport\Controller;
use Psr\Container\ContainerInterface;
use UnicaenDbImport\Entity\Db\Service\ImportLog\ImportLogService;
use UnicaenDbImport\Log\LivelogLogger;
use UnicaenDbImport\Service\ImportService;
class ImportControllerFactory
{
/**
* @param \Laminas\ServiceManager\ServiceManager $container
* @return \UnicaenDbImport\Controller\ImportController
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
function __invoke(ContainerInterface $sl): ImportController
function __invoke(ContainerInterface $container): ImportController
{
/** @var LivelogLogger $logger */
$logger = $container->get(LivelogLogger::class);
/** @var ImportService $importService */
$importService = $sl->get(ImportService::class);
$importService = $container->build(ImportService::class, ['logger' => $logger]);
/** @var ImportLogService $importLogService */
$importLogService = $sl->get(ImportLogService::class);
$importLogService = $container->get(ImportLogService::class);
$controller = new ImportController();
$controller->setImportService($importService);
......
......@@ -2,7 +2,6 @@
namespace UnicaenDbImport\Controller;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
use UnicaenDbImport\Domain\Result;
......@@ -97,15 +96,19 @@ class SynchroController extends AbstractActionController
}
/**
* @return \Laminas\Http\Response
* @return \Laminas\Http\Response|bool
* @throws \Exception
*/
public function lancerAction(): Response
public function lancerAction()
{
$name = $this->params('name');
$synchro = $this->synchroService->getSynchroByName($name);
$result = $this->synchroService->runSynchro($synchro);
if ($this->getRequest()->isXmlHttpRequest()) {
return false;
} else {
$this->flashMessages($synchro, $result);
$redirect = $this->params()->fromQuery('redirect') ?:
......@@ -113,25 +116,33 @@ class SynchroController extends AbstractActionController
return $this->redirect()->toUrl($redirect);
}
}
/**
* @return \Laminas\Http\Response
* @return \Laminas\Http\Response|bool
* @throws \Exception
*/
public function lancerMultipleAction(): Response
public function lancerMultipleAction()
{
$names = explode(',', $this->params('names', ''));
foreach ($names as $name) {
$synchro = $this->synchroService->getSynchroByName($name);
$result = $this->synchroService->runSynchro($synchro);
if (! $this->getRequest()->isXmlHttpRequest()) {
$this->flashMessages($synchro, $result);
}
}
if ($this->getRequest()->isXmlHttpRequest()) {
return false;
} else {
$redirect = $this->params()->fromQuery('redirect') ?: $this->url()->fromRoute('unicaen-db-import/synchro');
return $this->redirect()->toUrl($redirect);
}
}
protected function flashMessages(SynchroInterface $import, SynchroResult $result)
{
......
......@@ -4,21 +4,27 @@ namespace UnicaenDbImport\Controller;
use Psr\Container\ContainerInterface;
use UnicaenDbImport\Entity\Db\Service\ImportLog\ImportLogService;
use UnicaenDbImport\Log\LivelogLogger;
use UnicaenDbImport\Service\SynchroService;
class SynchroControllerFactory
{
/**
* @param \Laminas\ServiceManager\ServiceManager $container
* @return \UnicaenDbImport\Controller\SynchroController
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
function __invoke(ContainerInterface $sl): SynchroController
function __invoke(ContainerInterface $container): SynchroController
{
/** @var LivelogLogger $logger */
$logger = $container->get(LivelogLogger::class);
/** @var SynchroService $synchroService */
$synchroService = $sl->get(SynchroService::class);
$synchroService = $container->build(SynchroService::class, ['logger' => $logger]);
/** @var ImportLogService $importLogService */
$importLogService = $sl->get(ImportLogService::class);
$importLogService = $container->get(ImportLogService::class);
$controller = new SynchroController();
$controller->setSynchroService($synchroService);
......
......@@ -70,7 +70,7 @@ class Destination implements DestinationInterface
return implode(' -- ', array_filter([
$this->getTable(),
$this->getWhere() ? ' WHERE ' . $this->getWhere() : null,
$this->getIntermediateTable() ?
$this->usesIntermediateTable ?
'Via ' . $this->getIntermediateTable() . ' (auto_drop = ' . (int)$this->getIntermediateTableAutoDrop() . ')' :
null,
]));
......
<?php
namespace UnicaenDbImport\Log;
use Monolog\Logger;
class LivelogLogger extends Logger
{
}
\ No newline at end of file
<?php
namespace UnicaenDbImport\Log;
use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Psr\Container\ContainerInterface;
use UnicaenLivelog\Log\LivelogSocketLogHandler;
class LivelogLoggerFactory
{
/**
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function __invoke(ContainerInterface $container): Logger
{
/** @var LivelogSocketLogHandler $livelogSocketHandler */
$livelogSocketHandler = $container->get(LivelogSocketLogHandler::class);
$livelogSocketHandler->setFormatter(new LineFormatter(null, 'd/m/Y H:i:s'));
$logger = new Logger('livelog');
$logger->pushHandler($livelogSocketHandler);
return $logger;
}
}
\ No newline at end of file
......@@ -123,6 +123,8 @@ abstract class AbstractFacadeService
/** @var ApiConnection|DbConnection $connection */
$connection = $this->source->getConnection();
$this->logger->info("Interrogation de la source " . $this->source);
switch (true) {
case $connection instanceof ApiConnection:
if ($this->logger) {
......
......@@ -32,6 +32,8 @@ class ImportFacadeService extends AbstractFacadeService
{
$connection = $this->destination->getConnection();
$this->logger->info("Peuplement de la destination " . $this->destination);
switch (true) {
case $connection instanceof DbConnection:
$count = $this->databaseService->populateDestinationTableFromSource();
......
......@@ -3,7 +3,7 @@
namespace UnicaenDbImport\Service\Facade;
use Psr\Container\ContainerInterface;
use UnicaenDbImport\Config\Config;
use Psr\Log\NullLogger;
use UnicaenDbImport\Service\Api\ApiService;
use UnicaenDbImport\Service\Database\DatabaseService;
......@@ -17,15 +17,15 @@ class ImportFacadeServiceFactory
*/
public function __invoke(ContainerInterface $container): ImportFacadeService
{
/** @var Config $config */
$config = $container->get(Config::class);
/** @var DatabaseService $databaseService */
$databaseService = $container->get(DatabaseService::class);
/** @var \UnicaenDbImport\Service\Api\ApiService $apiService */
$apiService = $container->get(ApiService::class);
return new ImportFacadeService($databaseService, $apiService);
$facade = new ImportFacadeService($databaseService, $apiService);
$facade->setLogger(new NullLogger());
return $facade;
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@
namespace UnicaenDbImport\Service\Facade;
use Doctrine\DBAL\Connection as DbConnection;
use Psr\Log\LoggerAwareTrait;
use UnicaenDbImport\Domain\DestinationInterface;
use UnicaenDbImport\Domain\Exception\ConnectionException;
use UnicaenDbImport\Domain\ResultInterface;
......@@ -10,6 +11,8 @@ use UnicaenDbImport\Service\Database\DatabaseService;
class LogFacadeService
{
use LoggerAwareTrait;
/**
* @var \UnicaenDbImport\Service\Database\DatabaseService
*/
......@@ -69,6 +72,8 @@ class LogFacadeService
*/
public function saveResultToImportLog(ResultInterface $result)
{
$this->logger->info("Enregistrement des résultats d'import/synchro");
$connection = $this->destination->getConnection();
switch (true) {
......
......@@ -3,6 +3,7 @@
namespace UnicaenDbImport\Service\Facade;
use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use UnicaenDbImport\Service\Database\DatabaseService;
class LogFacadeServiceFactory
......@@ -18,6 +19,9 @@ class LogFacadeServiceFactory
/** @var DatabaseService $databaseService */
$databaseService = $container->get(DatabaseService::class);
return new LogFacadeService($databaseService);
$facade = new LogFacadeService($databaseService);
$facade->setLogger(new NullLogger());
return $facade;
}
}
\ No newline at end of file
......@@ -94,19 +94,26 @@ class SynchroFacadeService extends AbstractFacadeService
$intermediateTable = $this->destination->getIntermediateTable();
if ($this->destination->getIntermediateTableAutoDrop()) {
$this->logger->info("Suppression de la table intermédiaire $intermediateTable");
$this->databaseService->dropIntermediateTable($intermediateTable);
} else {
$this->databaseService->checkIntermediateTableNotExists($intermediateTable);
}
$this->logger->info("Création de la table intermédiaire $intermediateTable");
$this->databaseService->createIntermediateTable($intermediateTable);
$this->logger->info("Peuplement de la table intermédiaire $intermediateTable");
$this->databaseService->populateTableFromSource($intermediateTable, false);
}
$this->recreateDiffView();
if ($this->useImportObserv) {
$this->logger->info("Peuplement des ImportObservResult éventuels");
$this->databaseService->populateImportObservResultTable();
}
$this->logger->info("Mise à jour de la destination " . $this->destination);
$resultsByOperation = $this->databaseService->updateDestination();
$result = new SynchroResult();
......@@ -116,6 +123,7 @@ class SynchroFacadeService extends AbstractFacadeService
}
if ($this->requiresIntermediateTable) {
$this->logger->info("Suppression de la table intermédiaire");
$this->databaseService->dropIntermediateTable($intermediateTable);
}
......@@ -127,6 +135,8 @@ class SynchroFacadeService extends AbstractFacadeService
*/
protected function recreateDiffView()
{
$this->logger->info("Re/Création de la vue différentielle");
$intermediateTable = null;
if ($this->requiresIntermediateTable) {
$intermediateTable = $this->destination->getIntermediateTable();
......
......@@ -3,6 +3,7 @@
namespace UnicaenDbImport\Service\Facade;
use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use UnicaenDbImport\Config\Config;
use UnicaenDbImport\Service\Api\ApiService;
use UnicaenDbImport\Service\Database\DatabaseService;
......@@ -28,6 +29,7 @@ class SynchroFacadeServiceFactory
$facade = new SynchroFacadeService($databaseService, $apiService);
$facade->setUseImportObserv($config->getUseImportObserv());
$facade->setLogger(new NullLogger());
return $facade;
}
......
......@@ -104,9 +104,7 @@ class ImportService
*/
public function runImport(ImportInterface $import): ImportResult
{
if ($this->logger) {
$this->importFacadeService->setLogger($this->logger);
}
$this->logger->info("Lancement de l'import " . $import);
$this->importFacadeService->setImport($import);
$this->logFacadeService->setDestination($import->getDestination());
......
......@@ -3,6 +3,7 @@
namespace UnicaenDbImport\Service;
use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use UnicaenDbImport\Config\Config;
use UnicaenDbImport\Service\Facade\ImportFacadeService;
use UnicaenDbImport\Service\Facade\LogFacadeService;
......@@ -11,21 +12,31 @@ class ImportServiceFactory
{
/**
* @param \Interop\Container\ContainerInterface $container
* @param string $requestedName
* @param array|null $options
* @return \UnicaenDbImport\Service\ImportService
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function __invoke(ContainerInterface $container): ImportService
public function __invoke(ContainerInterface $container, string $requestedName, ?array $options = null): ImportService
{
/** @var \Psr\Log\LoggerInterface $logger */
$logger = $options['logger'] ?? new NullLogger();
/** @var Config $config */
$config = $container->get(Config::class);
/** @var ImportFacadeService $importFacadeService */
$importFacadeService = $container->get(ImportFacadeService::class);
$importFacadeService->setLogger($logger);
/** @var LogFacadeService $logFacadeService */
$logFacadeService = $container->get(LogFacadeService::class);
$logFacadeService->setLogger($logger);
$service = new ImportService($importFacadeService, $logFacadeService, $config);
$service->setLogger($logger);
return new ImportService($importFacadeService, $logFacadeService, $config);
return $service;
}
}
\ No newline at end of file
......@@ -105,9 +105,7 @@ class SynchroService
*/
public function runSynchro(SynchroInterface $synchro): SynchroResult
{
if ($this->logger) {
$this->synchroFacadeService->setLogger($this->logger);
}
$this->logger->info("Lancement de la synchro " . $synchro);
$this->synchroFacadeService->setSynchro($synchro);
$this->logFacadeService->setDestination($synchro->getDestination());
......@@ -132,6 +130,10 @@ class SynchroService
$this->logFacadeService->saveResultToImportLog($result);
if ($this->logger) {
$this->logger->info($result);
}
return $result;
}
......
......@@ -3,6 +3,7 @@
namespace UnicaenDbImport\Service;
use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use UnicaenDbImport\Config\Config;
use UnicaenDbImport\Service\Facade\LogFacadeService;
use UnicaenDbImport\Service\Facade\SynchroFacadeService;
......@@ -11,21 +12,31 @@ class SynchroServiceFactory
{
/**
* @param \Interop\Container\ContainerInterface $container
* @param string $requestedName
* @param array|null $options
* @return \UnicaenDbImport\Service\SynchroService
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function __invoke(ContainerInterface $container): SynchroService
public function __invoke(ContainerInterface $container, string $requestedName, ?array $options = null): SynchroService
{
/** @var \Psr\Log\LoggerInterface $logger */
$logger = $options['logger'] ?? new NullLogger();
/** @var Config $config */
$config = $container->get(Config::class);
/** @var SynchroFacadeService $synchroFacadeService */
$synchroFacadeService = $container->get(SynchroFacadeService::class);
$synchroFacadeService->setLogger($logger);
/** @var LogFacadeService $logFacadeService */
$logFacadeService = $container->get(LogFacadeService::class);
$logFacadeService->setLogger($logger);
$service = new SynchroService($synchroFacadeService, $logFacadeService, $config);
$service->setLogger($logger);
return new SynchroService($synchroFacadeService, $logFacadeService, $config);
return $service;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment