From ed422876468e1a7cfd6049d80e7b63b9faf1af6d Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Tue, 25 Feb 2025 15:05:03 +0100 Subject: [PATCH] #45 Implement store_in_database & [database|file]_level configuration. Update documentation with full configuration. --- docs/index.md | 30 ++++++-- .../CleverAgeUiProcessExtension.php | 70 +++++++------------ src/DependencyInjection/Configuration.php | 65 ++++++++++++----- .../Handler/DoctrineProcessHandler.php | 14 +++- src/Monolog/Handler/ProcessHandler.php | 3 +- 5 files changed, 110 insertions(+), 72 deletions(-) diff --git a/docs/index.md b/docs/index.md index 8f9cb8e..7130073 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,18 +19,40 @@ Remember to add the following line to `config/bundles.php` (not required if Symf CleverAge\UiProcessBundle\CleverAgeUiProcessBundle::class => ['all' => true], ``` -## Import routes +## Configuration + +### Import routes ```yaml ui-process-bundle: resource: '@CleverAgeUiProcessBundle/src/Controller' type: attribute ``` + +### Doctrine ORM Configuration + * Run doctrine migration * Create a user using `cleverage:ui-process:user-create` console. Now you can access UI Process via http://your-domain.com/process +## Full configuration + +```yaml +# config/packages/clever_age_ui_process.yaml + +clever_age_ui_process: + security: + roles: ['ROLE_ADMIN'] # Roles displayed inside user edit form + logs: + store_in_database: true # enable/disable store log in database (log_record table) + database_level: Debug (on dev env) or Info # min log level to store log record in database + file_level: Debug (on dev env) or Info # min log level to store log record in file + report_increment_level: Warning # min log level to increment process execution report + design: + logo_path: 'bundles/cleverageuiprocess/logo.jpg' # logo displayed in UI navigation toolbar +``` + ## Features ### Launch process via UI @@ -51,7 +73,6 @@ That's all, now you can launch a process via http post request ***Curl sample*** ```bash -make bash curl --location 'http://localhost/http/process/execute' \ --header 'Authorization: Bearer myBearerToken' \ --form 'input=@"/path/to/your/file.csv"' \ @@ -60,7 +81,6 @@ curl --location 'http://localhost/http/process/execute' \ ``` ```bash -make bash curl --location 'http://localhost/http/process/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer d641d254aed12733758a3a4247559868' \ @@ -154,7 +174,3 @@ On debug environment, profiling too much queries cause memory exhaustion. So, yo - Increase `memory_limit` in php.ini - Set `clever_age_ui_process.logs.store_in_database: false` or improve value of `clever_age_ui_process.logs.database_level` - Use `--no-debug` flag for `cleverage:process:execute` - -## Reference - -_TODO_ diff --git a/src/DependencyInjection/CleverAgeUiProcessExtension.php b/src/DependencyInjection/CleverAgeUiProcessExtension.php index 2b7b302..b66d51c 100644 --- a/src/DependencyInjection/CleverAgeUiProcessExtension.php +++ b/src/DependencyInjection/CleverAgeUiProcessExtension.php @@ -17,7 +17,6 @@ use CleverAge\UiProcessBundle\Controller\Admin\UserCrudController; use CleverAge\UiProcessBundle\Entity\User; use CleverAge\UiProcessBundle\Message\ProcessExecuteMessage; -use Monolog\Level; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; @@ -31,12 +30,25 @@ public function load(array $configs, ContainerBuilder $container): void { $this->findServices($container, __DIR__.'/../../config/services'); - $configuration = new Configuration(); + /** @var string $env */ + $env = $container->getParameter('kernel.environment'); + $configuration = new Configuration($env); $config = $this->processConfiguration($configuration, $configs); + $container->getDefinition(UserCrudController::class) ->setArgument('$roles', array_combine($config['security']['roles'], $config['security']['roles'])); + $container->getDefinition('cleverage_ui_process.monolog_handler.process') - ->addMethodCall('setReportIncrementLevel', [$config['logs']['report_increment_level']]); + ->setArgument('$level', $config['logs']['file_level']) + ->addMethodCall('setReportIncrementLevel', [$config['logs']['report_increment_level']]) + ; + $container->getDefinition('cleverage_ui_process.monolog_handler.doctrine_process') + ->setArgument('$level', $config['logs']['database_level']); + if (!$config['logs']['store_in_database']) { + $container->getDefinition('cleverage_ui_process.monolog_handler.doctrine_process') + ->addMethodCall('disable'); + } + $container->getDefinition(ProcessDashboardController::class) ->setArgument('$logoPath', $config['design']['logo_path']); } @@ -46,7 +58,6 @@ public function load(array $configs, ContainerBuilder $container): void */ public function prepend(ContainerBuilder $container): void { - $env = $container->getParameter('kernel.environment'); $container->loadFromExtension( 'monolog', [ @@ -59,50 +70,19 @@ public function prepend(ContainerBuilder $container): void 'type' => 'service', 'id' => 'cleverage_ui_process.monolog_handler.doctrine_process', ], + 'pb_ui_file_filter' => [ + 'type' => 'filter', + 'handler' => 'pb_ui_file', + 'channels' => ['cleverage_process', 'cleverage_process_task'], + ], + 'pb_ui_orm_filter' => [ + 'type' => 'filter', + 'handler' => 'pb_ui_orm', + 'channels' => ['cleverage_process', 'cleverage_process_task'], + ], ], ] ); - if ('dev' === $env) { - $container->loadFromExtension( - 'monolog', - [ - 'handlers' => [ - 'pb_ui_file_filter' => [ - 'type' => 'filter', - 'min_level' => Level::Debug->name, - 'handler' => 'pb_ui_file', - 'channels' => ['cleverage_process', 'cleverage_process_task'], - ], - 'pb_ui_orm_filter' => [ - 'type' => 'filter', - 'min_level' => Level::Debug->name, - 'handler' => 'pb_ui_orm', - 'channels' => ['cleverage_process', 'cleverage_process_task'], - ], - ], - ] - ); - } else { - $container->loadFromExtension( - 'monolog', - [ - 'handlers' => [ - 'pb_ui_file_filter' => [ - 'type' => 'filter', - 'min_level' => Level::Info->name, - 'handler' => 'pb_ui_file', - 'channels' => ['cleverage_process', 'cleverage_process_task'], - ], - 'pb_ui_orm_filter' => [ - 'type' => 'filter', - 'min_level' => Level::Info->name, - 'handler' => 'pb_ui_orm', - 'channels' => ['cleverage_process', 'cleverage_process_task'], - ], - ], - ] - ); - } $container->loadFromExtension( 'doctrine_migrations', [ diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 4dd50a6..526ada7 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -20,34 +20,63 @@ class Configuration implements ConfigurationInterface { + public function __construct(private readonly string $env) + { + } + public function getConfigTreeBuilder(): TreeBuilder { - $tb = new TreeBuilder('clever_age_ui_process'); + $treeBuilder = new TreeBuilder('clever_age_ui_process'); /** @var ArrayNodeDefinition $rootNode */ - $rootNode = $tb->getRootNode(); - $rootNode + $rootNode = $treeBuilder->getRootNode(); + + $this->addSecuritySection($rootNode); + $this->addLogSection($rootNode); + $this->addDesignSection($rootNode); + + return $treeBuilder; + } + + protected function addSecuritySection(ArrayNodeDefinition $node): void + { + $node ->children() - ->arrayNode('security') - ->addDefaultsIfNotSet() + ->arrayNode('security')->addDefaultsIfNotSet() ->children() - ->arrayNode('roles')->defaultValue(['ROLE_ADMIN'])->scalarPrototype()->end(); // Roles displayed inside user edit form - $rootNode + ->arrayNode('roles')->defaultValue(['ROLE_ADMIN'])->scalarPrototype()->end() // Roles displayed inside user edit form + ->end() + ->end() + ->end() + ; + } + + protected function addLogSection(ArrayNodeDefinition $node): void + { + $defaultLevel = 'dev' === $this->env ? Level::Debug->name : Level::Info->name; + $node ->children() - ->arrayNode('logs') - ->addDefaultsIfNotSet() + ->arrayNode('logs')->addDefaultsIfNotSet() ->children() ->booleanNode('store_in_database')->defaultValue(true)->end() // enable/disable store log in database (log_record table) - ->scalarNode('database_level')->defaultValue(Level::Debug->name)->end() // min log level to store log record in database + ->scalarNode('database_level')->defaultValue($defaultLevel)->end() // min log level to store log record in database + ->scalarNode('file_level')->defaultValue($defaultLevel)->end() // min log level to store log record in file ->scalarNode('report_increment_level')->defaultValue(Level::Warning->name)->end() // min log level to increment process execution report - ->end(); - $rootNode + ->end() + ->end() + ->end() + ; + } + + protected function addDesignSection(ArrayNodeDefinition $node): void + { + $node ->children() - ->arrayNode('design') - ->addDefaultsIfNotSet() - ->children() + ->arrayNode('design')->addDefaultsIfNotSet() + ->children() ->scalarNode('logo_path')->defaultValue('bundles/cleverageuiprocess/logo.jpg')->end() - ->end(); - - return $tb; + ->end() + ->end() + ->end() + ; } } diff --git a/src/Monolog/Handler/DoctrineProcessHandler.php b/src/Monolog/Handler/DoctrineProcessHandler.php index 07c4a0a..0a178b5 100644 --- a/src/Monolog/Handler/DoctrineProcessHandler.php +++ b/src/Monolog/Handler/DoctrineProcessHandler.php @@ -25,8 +25,9 @@ class DoctrineProcessHandler extends AbstractProcessingHandler { /** @var ArrayCollection */ private ArrayCollection $records; - private ?ProcessExecutionManager $processExecutionManager = null; private ?EntityManagerInterface $em = null; + private ?ProcessExecutionManager $processExecutionManager = null; + private bool $enabled = true; public function __construct(int|string|Level $level = Level::Debug, bool $bubble = true) { @@ -44,6 +45,11 @@ public function setProcessExecutionManager(ProcessExecutionManager $processExecu $this->processExecutionManager = $processExecutionManager; } + public function disable(): void + { + $this->enabled = false; + } + public function __destruct() { $this->flush(); @@ -52,6 +58,9 @@ public function __destruct() public function flush(): void { + if (!$this->enabled) { + return; + } foreach ($this->records as $record) { if (($currentProcessExecution = $this->processExecutionManager?->getCurrentProcessExecution()) instanceof ProcessExecution) { $entity = new \CleverAge\UiProcessBundle\Entity\LogRecord($record, $currentProcessExecution); @@ -67,6 +76,9 @@ public function flush(): void protected function write(LogRecord $record): void { + if (!$this->enabled) { + return; + } $this->records->add($record); if (500 === $this->records->count()) { $this->flush(); diff --git a/src/Monolog/Handler/ProcessHandler.php b/src/Monolog/Handler/ProcessHandler.php index 6b58789..b1f94da 100644 --- a/src/Monolog/Handler/ProcessHandler.php +++ b/src/Monolog/Handler/ProcessHandler.php @@ -25,8 +25,9 @@ class ProcessHandler extends StreamHandler public function __construct( private readonly string $directory, private readonly ProcessExecutionManager $processExecutionManager, + int|string|Level $level = Level::Debug, ) { - parent::__construct($this->directory); + parent::__construct($this->directory, $level); } /**