Skip to content

Commit

Permalink
Merge pull request #51 from cleverage/45
Browse files Browse the repository at this point in the history
#45 Implement store_in_database & [database|file]_level configuration…
  • Loading branch information
njoubert-cleverage authored Feb 27, 2025
2 parents 501b2cd + ed42287 commit e57e165
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 72 deletions.
30 changes: 23 additions & 7 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"' \
Expand All @@ -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' \
Expand Down Expand Up @@ -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_
70 changes: 25 additions & 45 deletions src/DependencyInjection/CleverAgeUiProcessExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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']);
}
Expand All @@ -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',
[
Expand All @@ -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',
[
Expand Down
65 changes: 47 additions & 18 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
;
}
}
14 changes: 13 additions & 1 deletion src/Monolog/Handler/DoctrineProcessHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ class DoctrineProcessHandler extends AbstractProcessingHandler
{
/** @var ArrayCollection<int, LogRecord> */
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)
{
Expand All @@ -44,6 +45,11 @@ public function setProcessExecutionManager(ProcessExecutionManager $processExecu
$this->processExecutionManager = $processExecutionManager;
}

public function disable(): void
{
$this->enabled = false;
}

public function __destruct()
{
$this->flush();
Expand All @@ -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);
Expand All @@ -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();
Expand Down
3 changes: 2 additions & 1 deletion src/Monolog/Handler/ProcessHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand Down

0 comments on commit e57e165

Please sign in to comment.