Skip to content

#45 Implement store_in_database & [database|file]_level configuration… #51

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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