From 2cdd8b062c4a05cce28eef6dc7d6916f044ba1ce Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Mon, 20 Jul 2026 10:42:36 +0200 Subject: [PATCH] #68 Add dependabot.yml + fix quality --- .github/dependabot.yml | 8 ++++ .php-cs-fixer.dist.php | 3 ++ src/CleverAgeUiProcessBundle.php | 1 + .../Admin/LogRecordCrudController.php | 8 +++- src/Controller/Admin/Process/LaunchAction.php | 24 ++++++----- src/Controller/Admin/Process/ListAction.php | 10 +++-- .../Admin/Process/UploadAndExecuteAction.php | 14 ++++--- .../Admin/ProcessDashboardController.php | 4 ++ .../Admin/ProcessExecutionCrudController.php | 14 ++++--- .../Admin/ProcessScheduleCrudController.php | 16 +++++--- .../Admin/Security/LogoutController.php | 8 +++- src/Controller/Admin/UserCrudController.php | 27 +++++++----- src/Controller/ProcessExecuteController.php | 41 ++++++++++--------- src/Entity/LogRecord.php | 2 +- src/Form/Type/LaunchType.php | 5 ++- src/Form/Type/ProcessUploadFileType.php | 1 + src/Manager/ProcessConfigurationsManager.php | 12 +++--- src/Message/CronProcessMessageHandler.php | 2 +- src/Migrations/Version20231006111525.php | 2 + src/Migrations/Version20240729151928.php | 2 + src/Migrations/Version20240730090403.php | 2 + src/Migrations/Version20241007134542.php | 2 + src/Migrations/Version20241007152613.php | 2 + src/Migrations/Version20241009075733.php | 2 + .../Handler/DoctrineProcessHandler.php | 1 + src/Monolog/Handler/ProcessHandler.php | 2 + src/Twig/Components/BootstrapModal.php | 2 + src/Twig/Extension/LogLevelExtension.php | 1 + src/Twig/Extension/MD5Extension.php | 1 + .../Extension/ProcessExecutionExtension.php | 1 + src/Twig/Extension/ProcessExtension.php | 1 + src/Twig/Runtime/ProcessExtensionRuntime.php | 2 + 32 files changed, 147 insertions(+), 76 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f5fcaf5 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +# This keeps updated the GitHub actions used in .github/workflows/*.yaml +# See https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" \ No newline at end of file diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index ed5c8c5..631db26 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -1,5 +1,7 @@ ['header' => $fileHeaderComment], 'modernize_strpos' => true, 'get_class_to_class_keyword' => true, + 'declare_strict_types' => true, ]) ->setRiskyAllowed(true) ->setFinder( diff --git a/src/CleverAgeUiProcessBundle.php b/src/CleverAgeUiProcessBundle.php index 8acf1d7..c2035d2 100644 --- a/src/CleverAgeUiProcessBundle.php +++ b/src/CleverAgeUiProcessBundle.php @@ -17,6 +17,7 @@ class CleverAgeUiProcessBundle extends Bundle { + #[\Override] public function getPath(): string { return \dirname(__DIR__); diff --git a/src/Controller/Admin/LogRecordCrudController.php b/src/Controller/Admin/LogRecordCrudController.php index 40ea6cb..78dbac4 100644 --- a/src/Controller/Admin/LogRecordCrudController.php +++ b/src/Controller/Admin/LogRecordCrudController.php @@ -51,6 +51,7 @@ public static function getEntityFqcn(): string return LogRecord::class; } + #[\Override] public function configureFields(string $pageName): iterable { return [ @@ -65,11 +66,13 @@ public function configureFields(string $pageName): iterable ]; } + #[\Override] public function configureCrud(Crud $crud): Crud { return $crud->showEntityActionsInlined()->setPaginatorPageSize(250); } + #[\Override] public function configureActions(Actions $actions): Actions { return Actions::new() @@ -85,11 +88,12 @@ public function configureActions(Actions $actions): Actions ->add(Crud::PAGE_DETAIL, 'index'); } + #[\Override] public function configureFilters(Filters $filters): Filters { $id = $this->requestStack->getMainRequest()?->query->all('filters')['process']['value'] ?? null; $processList = $this->processConfigurationsManager->getPublicProcesses(); - $processList = array_map(fn (ProcessConfiguration $cfg) => $cfg->getCode(), $processList); + $processList = array_map(static fn (ProcessConfiguration $cfg) => $cfg->getCode(), $processList); return $filters->add( LogProcessFilter::new('Process', $processList, $id) @@ -97,7 +101,7 @@ public function configureFilters(Filters $filters): Filters ChoiceFilter::new('level') ->setTranslatableChoices(array_combine( Level::VALUES, - array_map(fn ($value) => 'enum.log_level.'.strtolower((string) $value), Level::NAMES) + array_map(static fn ($value) => 'enum.log_level.'.strtolower((string) $value), Level::NAMES) )) ->setFormTypeOption('translation_domain', 'enums'), )->add('message')->add('context')->add('createdAt'); diff --git a/src/Controller/Admin/Process/LaunchAction.php b/src/Controller/Admin/Process/LaunchAction.php index 8f6bed5..b8e2fbd 100644 --- a/src/Controller/Admin/Process/LaunchAction.php +++ b/src/Controller/Admin/Process/LaunchAction.php @@ -19,7 +19,7 @@ use CleverAge\UiProcessBundle\Manager\ProcessConfigurationsManager; use CleverAge\UiProcessBundle\Message\ProcessExecuteMessage; use EasyCorp\Bundle\EasyAdminBundle\Config\Asset; -use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; +use EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Form\Extension\Core\Type\TextType; @@ -40,21 +40,22 @@ #[IsGranted('ROLE_USER')] class LaunchAction extends AbstractController { - public function __construct(private readonly MessageBusInterface $messageBus) - { + public function __construct( + private readonly MessageBusInterface $messageBus, + private readonly RequestStack $requestStack, + private readonly ProcessConfigurationsManager $processConfigurationsManager, + private readonly AdminContextProvider $adminContextProvider, + ) { } public function __invoke( - RequestStack $requestStack, string $uploadDirectory, - ProcessConfigurationsManager $processConfigurationsManager, - AdminContext $context, ): Response { - $processCode = $requestStack->getMainRequest()?->get('process'); - if (null === $processCode) { + $processCode = (string) $this->requestStack->getMainRequest()?->query->get('process'); + if ('' === $processCode) { throw new MissingProcessException(); } - $uiOptions = $processConfigurationsManager->getUiOptions($processCode); + $uiOptions = $this->processConfigurationsManager->getUiOptions($processCode); if (null === $uiOptions) { throw new \InvalidArgumentException('Missing UI Options'); } @@ -84,7 +85,7 @@ public function __invoke( } $form->setData($default); } - $form->handleRequest($requestStack->getMainRequest()); + $form->handleRequest($this->requestStack->getMainRequest()); if ($form->isSubmitted() && $form->isValid()) { $input = $form->get('input')->getData(); if ($input instanceof UploadedFile) { @@ -104,7 +105,7 @@ public function __invoke( return $this->redirectToRoute('process', ['routeName' => 'process_list']); } - $context->getAssets()->addJsAsset(Asset::fromEasyAdminAssetPackage('field-collection.js')->getAsDto()); + $this->adminContextProvider->getContext()?->getAssets()->addJsAsset(Asset::fromEasyAdminAssetPackage('field-collection.js')->getAsDto()); return $this->render( '@CleverAgeUiProcess/admin/process/launch.html.twig', @@ -130,6 +131,7 @@ protected function dispatch(string $processCode, mixed $input = null, array $con $this->messageBus->dispatch($message); } + #[\Override] protected function getUser(): ?User { /** @var User $user */ diff --git a/src/Controller/Admin/Process/ListAction.php b/src/Controller/Admin/Process/ListAction.php index 4857c75..78880ff 100644 --- a/src/Controller/Admin/Process/ListAction.php +++ b/src/Controller/Admin/Process/ListAction.php @@ -24,16 +24,18 @@ #[IsGranted('ROLE_USER')] class ListAction extends AbstractController { - public function __construct(private readonly IntlFormatterInterface $intlFormatter) - { + public function __construct( + private readonly IntlFormatterInterface $intlFormatter, + private readonly ProcessConfigurationsManager $processConfigurationsManager, + ) { } - public function __invoke(ProcessConfigurationsManager $processConfigurationsManager): Response + public function __invoke(): Response { return $this->render( '@CleverAgeUiProcess/admin/process/list.html.twig', [ - 'processes' => $processConfigurationsManager->getPublicProcesses(), + 'processes' => $this->processConfigurationsManager->getPublicProcesses(), 'IntlFormatterService' => $this->intlFormatter, ] ); diff --git a/src/Controller/Admin/Process/UploadAndExecuteAction.php b/src/Controller/Admin/Process/UploadAndExecuteAction.php index 8392263..573b136 100644 --- a/src/Controller/Admin/Process/UploadAndExecuteAction.php +++ b/src/Controller/Admin/Process/UploadAndExecuteAction.php @@ -37,9 +37,13 @@ #[IsGranted('ROLE_USER')] class UploadAndExecuteAction extends AbstractController { + public function __construct( + private readonly RequestStack $requestStack, + private readonly MessageBusInterface $messageBus, + ) { + } + public function __invoke( - RequestStack $requestStack, - MessageBusInterface $messageBus, string $uploadDirectory, #[ValueResolver('process')] ProcessConfiguration $processConfiguration, ): Response { @@ -49,15 +53,15 @@ public function __invoke( $form = $this->createForm( ProcessUploadFileType::class, null, - ['process_code' => $requestStack->getMainRequest()?->get('process')] + ['process_code' => $this->requestStack->getMainRequest()?->get('process')] ); - $form->handleRequest($requestStack->getMainRequest()); + $form->handleRequest($this->requestStack->getMainRequest()); if ($form->isSubmitted() && $form->isValid()) { /** @var UploadedFile $file */ $file = $form->getData(); $savedFilepath = \sprintf('%s/%s.%s', $uploadDirectory, Uuid::v4(), $file->getClientOriginalExtension()); (new Filesystem())->dumpFile($savedFilepath, $file->getContent()); - $messageBus->dispatch( + $this->messageBus->dispatch( new ProcessExecuteMessage( $form->getConfig()->getOption('process_code'), $savedFilepath diff --git a/src/Controller/Admin/ProcessDashboardController.php b/src/Controller/Admin/ProcessDashboardController.php index 9ec0908..203d0a8 100644 --- a/src/Controller/Admin/ProcessDashboardController.php +++ b/src/Controller/Admin/ProcessDashboardController.php @@ -37,6 +37,7 @@ public function __construct( } #[Route('/process', name: 'process')] + #[\Override] public function index(): Response { $adminUrlGenerator = $this->container->get(AdminUrlGenerator::class); @@ -44,6 +45,7 @@ public function index(): Response return $this->redirect($adminUrlGenerator->setController(ProcessExecutionCrudController::class)->generateUrl()); } + #[\Override] public function configureDashboard(): Dashboard { return Dashboard::new() @@ -51,6 +53,7 @@ public function configureDashboard(): Dashboard ->setTitle(''); } + #[\Override] public function configureMenuItems(): iterable { yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); @@ -71,6 +74,7 @@ public function configureMenuItems(): iterable } } + #[\Override] public function configureCrud(): Crud { /** @var ?User $user */ diff --git a/src/Controller/Admin/ProcessExecutionCrudController.php b/src/Controller/Admin/ProcessExecutionCrudController.php index 1fa21b2..16a2c70 100644 --- a/src/Controller/Admin/ProcessExecutionCrudController.php +++ b/src/Controller/Admin/ProcessExecutionCrudController.php @@ -22,7 +22,6 @@ use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; -use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField; @@ -54,6 +53,7 @@ public static function getEntityFqcn(): string return ProcessExecution::class; } + #[\Override] public function configureFields(string $pageName): iterable { return [ @@ -71,6 +71,7 @@ public function configureFields(string $pageName): iterable ]; } + #[\Override] public function configureCrud(Crud $crud): Crud { $crud->showEntityActionsInlined(); @@ -79,6 +80,7 @@ public function configureCrud(Crud $crud): Crud return $crud; } + #[\Override] public function configureActions(Actions $actions): Actions { return Actions::new() @@ -109,7 +111,7 @@ public function configureActions(Actions $actions): Actions ); } - public function showLogs(AdminContext $adminContext): RedirectResponse + public function showLogs(): RedirectResponse { /** @var AdminUrlGenerator $adminUrlGenerator */ $adminUrlGenerator = $this->container->get(AdminUrlGenerator::class); @@ -133,11 +135,10 @@ public function showLogs(AdminContext $adminContext): RedirectResponse return $this->redirect($url); } - public function downloadLogFile( - AdminContext $context, - ): Response { + public function downloadLogFile(): Response + { /** @var ProcessExecution $processExecution */ - $processExecution = $context->getEntity()->getInstance(); + $processExecution = $this->getContext()?->getEntity()->getInstance(); $filepath = $this->getLogFilePath($processExecution); $basename = basename($filepath); $content = file_get_contents($filepath); @@ -151,6 +152,7 @@ public function downloadLogFile( return $response; } + #[\Override] public function configureFilters(Filters $filters): Filters { return $filters diff --git a/src/Controller/Admin/ProcessScheduleCrudController.php b/src/Controller/Admin/ProcessScheduleCrudController.php index 5501aff..218cfb9 100644 --- a/src/Controller/Admin/ProcessScheduleCrudController.php +++ b/src/Controller/Admin/ProcessScheduleCrudController.php @@ -47,6 +47,7 @@ public function __construct(private readonly ProcessConfigurationsManager $proce { } + #[\Override] public function configureCrud(Crud $crud): Crud { return parent::configureCrud($crud) @@ -54,16 +55,17 @@ public function configureCrud(Crud $crud): Crud ->showEntityActionsInlined(); } + #[\Override] public function configureActions(Actions $actions): Actions { return $actions - ->update(Crud::PAGE_INDEX, Action::NEW, fn (Action $action) => $action->setIcon('fa fa-plus') + ->update(Crud::PAGE_INDEX, Action::NEW, static fn (Action $action) => $action->setIcon('fa fa-plus') ->setLabel(false) - ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::EDIT, fn (Action $action) => $action->setIcon('fa fa-edit') + ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::EDIT, static fn (Action $action) => $action->setIcon('fa fa-edit') ->setLabel(false) - ->addCssClass('text-warning'))->update(Crud::PAGE_INDEX, Action::DELETE, fn (Action $action) => $action->setIcon('fa fa-trash-o') + ->addCssClass('text-warning'))->update(Crud::PAGE_INDEX, Action::DELETE, static fn (Action $action) => $action->setIcon('fa fa-trash-o') ->setLabel(false) - ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::BATCH_DELETE, fn (Action $action) => $action->setLabel('Delete') + ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::BATCH_DELETE, static fn (Action $action) => $action->setLabel('Delete') ->addCssClass('')); } @@ -72,9 +74,10 @@ public static function getEntityFqcn(): string return ProcessSchedule::class; } + #[\Override] public function configureFields(string $pageName): iterable { - $choices = array_map(fn (ProcessConfiguration $configuration) => [$configuration->getCode()], $this->processConfigurationsManager->getPublicProcesses()); + $choices = array_map(static fn (ProcessConfiguration $configuration) => [$configuration->getCode()], $this->processConfigurationsManager->getPublicProcesses()); return [ FormField::addTab('General'), @@ -90,7 +93,7 @@ public function configureFields(string $pageName): iterable ->setVirtual(true) ->hideOnForm() ->hideOnDetail() - ->formatValue(fn ($value, ProcessSchedule $entity) => ProcessScheduleType::CRON === $entity->getType() + ->formatValue(static fn ($value, ProcessSchedule $entity) => ProcessScheduleType::CRON === $entity->getType() ? CronExpressionTrigger::fromSpec($entity->getExpression() ?? '') ->getNextRunDate(new \DateTimeImmutable()) ?->format('c') @@ -107,6 +110,7 @@ public function configureFields(string $pageName): iterable ]; } + #[\Override] public function index(AdminContext $context): KeyValueStore|RedirectResponse|Response { if (false === $this->schedulerIsRunning()) { diff --git a/src/Controller/Admin/Security/LogoutController.php b/src/Controller/Admin/Security/LogoutController.php index 9ddd963..ecfd5ce 100644 --- a/src/Controller/Admin/Security/LogoutController.php +++ b/src/Controller/Admin/Security/LogoutController.php @@ -20,10 +20,14 @@ class LogoutController extends AbstractController { + public function __construct(private readonly Security $security) + { + } + #[Route('/process/logout', name: 'process_logout')] - public function __invoke(Security $security): Response + public function __invoke(): Response { - $security->logout(); + $this->security->logout(); return $this->redirectToRoute('process_login'); } diff --git a/src/Controller/Admin/UserCrudController.php b/src/Controller/Admin/UserCrudController.php index 02ccdd3..bb6ef24 100644 --- a/src/Controller/Admin/UserCrudController.php +++ b/src/Controller/Admin/UserCrudController.php @@ -17,7 +17,6 @@ use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; -use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField; @@ -41,10 +40,13 @@ class UserCrudController extends AbstractCrudController { /** @param array $roles */ - public function __construct(private readonly array $roles) - { + public function __construct( + private readonly array $roles, + private readonly AdminUrlGenerator $adminUrlGenerator, + ) { } + #[\Override] public function configureCrud(Crud $crud): Crud { $crud->showEntityActionsInlined(); @@ -58,6 +60,7 @@ public static function getEntityFqcn(): string return User::class; } + #[\Override] public function configureFields(string $pageName): iterable { yield FormField::addTab('Credentials')->setIcon('fa fa-key'); @@ -90,33 +93,35 @@ public function configureFields(string $pageName): iterable yield LocaleField::new('locale'); } + #[\Override] public function configureActions(Actions $actions): Actions { return $actions - ->update(Crud::PAGE_INDEX, Action::NEW, fn (Action $action) => $action->setIcon('fa fa-plus') + ->update(Crud::PAGE_INDEX, Action::NEW, static fn (Action $action) => $action->setIcon('fa fa-plus') ->setLabel(false) - ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::EDIT, fn (Action $action) => $action->setIcon('fa fa-edit') + ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::EDIT, static fn (Action $action) => $action->setIcon('fa fa-edit') ->setLabel(false) - ->addCssClass('text-warning'))->update(Crud::PAGE_INDEX, Action::DELETE, fn (Action $action) => $action->setIcon('fa fa-trash-o') + ->addCssClass('text-warning'))->update(Crud::PAGE_INDEX, Action::DELETE, static fn (Action $action) => $action->setIcon('fa fa-trash-o') ->setLabel(false) - ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::BATCH_DELETE, fn (Action $action) => $action->setLabel('Delete') + ->addCssClass(''))->update(Crud::PAGE_INDEX, Action::BATCH_DELETE, static fn (Action $action) => $action->setLabel('Delete') ->addCssClass(''))->add(Crud::PAGE_EDIT, Action::new('generateToken')->linkToCrudAction('generateToken')); } - public function generateToken(AdminContext $adminContext, AdminUrlGenerator $adminUrlGenerator): Response + public function generateToken(): Response { + $adminContext = $this->getContext(); /** @var User $user */ - $user = $adminContext->getEntity()->getInstance(); + $user = $adminContext?->getEntity()->getInstance(); $token = md5(uniqid(date('YmdHis'))); $user->setToken((new Pbkdf2PasswordHasher())->hash($token)); $this->persistEntity( - $this->container->get('doctrine')->getManagerForClass($adminContext->getEntity()->getFqcn()), + $this->container->get('doctrine')->getManagerForClass($adminContext?->getEntity()->getFqcn()), $user ); $this->addFlash('success', 'New token generated '.$token.' (keep it in secured area. This token will never be displayed anymore)'); return $this->redirect( - $adminUrlGenerator + $this->adminUrlGenerator ->setController(self::class) ->setAction(Action::EDIT) ->setEntityId($user->getId()) diff --git a/src/Controller/ProcessExecuteController.php b/src/Controller/ProcessExecuteController.php index dc36f94..3b04cbe 100644 --- a/src/Controller/ProcessExecuteController.php +++ b/src/Controller/ProcessExecuteController.php @@ -28,13 +28,17 @@ #[Route(path: '/http/process/execute', name: 'http_process_execute', methods: ['POST'])] class ProcessExecuteController extends AbstractController { + public function __construct( + private readonly ValidatorInterface $validator, + private readonly MessageBusInterface $bus, + private readonly ProcessManager $processManager, + ) { + } + public function __invoke( #[ValueResolver('http_process_execution')] HttpProcessExecution $httpProcessExecution, - ValidatorInterface $validator, - MessageBusInterface $bus, - ProcessManager $processManager, ): JsonResponse { - $violations = $validator->validate($httpProcessExecution); + $violations = $this->validator->validate($httpProcessExecution); if ($violations->count() > 0) { $violationsMessages = []; foreach ($violations as $violation) { @@ -43,7 +47,7 @@ public function __invoke( throw new UnprocessableEntityHttpException(implode('. ', $violationsMessages)); } if ($httpProcessExecution->queue) { - $bus->dispatch( + $this->bus->dispatch( new ProcessExecuteMessage( $httpProcessExecution->code ?? '', $httpProcessExecution->input, @@ -54,20 +58,19 @@ public function __invoke( ); return new JsonResponse('Process has been added to queue. It will start as soon as possible.'); - } else { - try { - $processManager->execute( - $httpProcessExecution->code ?? '', - $httpProcessExecution->input, - \is_string($httpProcessExecution->context) - ? json_decode($httpProcessExecution->context, true) - : $httpProcessExecution->context - ); - } catch (\Throwable $e) { - return new JsonResponse($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); - } - - return new JsonResponse('Process has been proceed well.'); } + try { + $this->processManager->execute( + $httpProcessExecution->code ?? '', + $httpProcessExecution->input, + \is_string($httpProcessExecution->context) + ? json_decode($httpProcessExecution->context, true) + : $httpProcessExecution->context + ); + } catch (\Throwable $e) { + return new JsonResponse($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + + return new JsonResponse('Process has been proceed well.'); } } diff --git a/src/Entity/LogRecord.php b/src/Entity/LogRecord.php index 2a9c25f..808ce1f 100644 --- a/src/Entity/LogRecord.php +++ b/src/Entity/LogRecord.php @@ -51,7 +51,7 @@ public function getId(): ?int public function __construct( \Monolog\LogRecord $record, #[ORM\ManyToOne(targetEntity: ProcessExecution::class, cascade: ['all'])] - #[ORM\JoinColumn(name: 'process_execution_id', referencedColumnName: 'id', onDelete: 'CASCADE', nullable: false)] + #[ORM\JoinColumn(name: 'process_execution_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')] private readonly ProcessExecution $processExecution, ) { $this->channel = (string) (new UnicodeString($record->channel))->truncate(64); diff --git a/src/Form/Type/LaunchType.php b/src/Form/Type/LaunchType.php index 3c876bc..5018b06 100644 --- a/src/Form/Type/LaunchType.php +++ b/src/Form/Type/LaunchType.php @@ -59,8 +59,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ] ); $builder->get('context')->addModelTransformer(new CallbackTransformer( - fn ($data) => $data ?? [], - fn ($data) => array_column($data ?? [], 'value', 'key'), + static fn ($data) => $data ?? [], + static fn ($data) => array_column($data ?? [], 'value', 'key'), )); } @@ -69,6 +69,7 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setRequired('process_code'); } + #[\Override] public function getParent(): string { return FormType::class; diff --git a/src/Form/Type/ProcessUploadFileType.php b/src/Form/Type/ProcessUploadFileType.php index 57619ff..94beef2 100644 --- a/src/Form/Type/ProcessUploadFileType.php +++ b/src/Form/Type/ProcessUploadFileType.php @@ -25,6 +25,7 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setRequired('process_code'); } + #[\Override] public function getParent(): string { return FileType::class; diff --git a/src/Manager/ProcessConfigurationsManager.php b/src/Manager/ProcessConfigurationsManager.php index 00ad111..8075a37 100644 --- a/src/Manager/ProcessConfigurationsManager.php +++ b/src/Manager/ProcessConfigurationsManager.php @@ -44,13 +44,13 @@ public function __construct(private readonly ProcessConfigurationRegistry $regis /** @return ProcessConfiguration[] */ public function getPublicProcesses(): array { - return array_filter($this->getConfigurations(), fn (ProcessConfiguration $cfg) => $cfg->isPublic()); + return array_filter($this->getConfigurations(), static fn (ProcessConfiguration $cfg) => $cfg->isPublic()); } /** @return ProcessConfiguration[] */ public function getPrivateProcesses(): array { - return array_filter($this->getConfigurations(), fn (ProcessConfiguration $cfg) => !$cfg->isPublic()); + return array_filter($this->getConfigurations(), static fn (ProcessConfiguration $cfg) => !$cfg->isPublic()); } /** @@ -75,7 +75,7 @@ public function getUiOptions(string $processCode): ?array private function resolveUiOptions(array $options): array { $resolver = new OptionsResolver(); - $resolver->setDefault('ui', function (OptionsResolver $uiResolver): void { + $resolver->setDefault('ui', static function (OptionsResolver $uiResolver): void { $uiResolver->setDefaults( [ 'source' => null, @@ -84,9 +84,9 @@ private function resolveUiOptions(array $options): array 'ui_launch_mode' => 'modal', 'constraints' => [], 'run' => null, - 'default' => function (OptionsResolver $defaultResolver) { + 'default' => static function (OptionsResolver $defaultResolver) { $defaultResolver->setDefault('input', null); - $defaultResolver->setDefault('context', function (OptionsResolver $contextResolver) { + $defaultResolver->setDefault('context', static function (OptionsResolver $contextResolver) { $contextResolver->setPrototype(true); $contextResolver->setRequired(['key', 'value']); }); @@ -100,7 +100,7 @@ private function resolveUiOptions(array $options): array 'run ui option is deprecated. Use public option instead to hide a process from UI' ); $uiResolver->setAllowedValues('entrypoint_type', ['text', 'file']); - $uiResolver->setNormalizer('constraints', fn (Options $options, array $values): array => (new ConstraintLoader())->buildConstraints($values)); + $uiResolver->setNormalizer('constraints', static fn (Options $options, array $values): array => (new ConstraintLoader())->buildConstraints($values)); $uiResolver->setAllowedValues('ui_launch_mode', ['modal', null, 'form']); }); /** diff --git a/src/Message/CronProcessMessageHandler.php b/src/Message/CronProcessMessageHandler.php index 285742a..3f27a0a 100644 --- a/src/Message/CronProcessMessageHandler.php +++ b/src/Message/CronProcessMessageHandler.php @@ -29,7 +29,7 @@ public function __construct(private readonly MessageBusInterface $bus) public function __invoke(CronProcessMessage $message): void { $schedule = $message->processSchedule; - $context = array_merge(...array_map(fn ($ctx) => [$ctx['key'] => $ctx['value']], $schedule->getContext())); + $context = array_merge(...array_map(static fn ($ctx) => [$ctx['key'] => $ctx['value']], $schedule->getContext())); $this->bus->dispatch( new ProcessExecuteMessage($schedule->getProcess() ?? '', $schedule->getInput(), $context) ); diff --git a/src/Migrations/Version20231006111525.php b/src/Migrations/Version20231006111525.php index 5d8619f..3d0a294 100644 --- a/src/Migrations/Version20231006111525.php +++ b/src/Migrations/Version20231006111525.php @@ -21,6 +21,7 @@ final class Version20231006111525 extends AbstractMigration { + #[\Override] public function getDescription(): string { return 'Create tables log_record, process_execution and process_user'; @@ -70,6 +71,7 @@ public function up(Schema $schema): void } } + #[\Override] public function down(Schema $schema): void { $this->addSql('ALTER TABLE log_record DROP CONSTRAINT FK_8ECECC333DAC0075'); diff --git a/src/Migrations/Version20240729151928.php b/src/Migrations/Version20240729151928.php index d1635b8..be39996 100644 --- a/src/Migrations/Version20240729151928.php +++ b/src/Migrations/Version20240729151928.php @@ -24,6 +24,7 @@ */ final class Version20240729151928 extends AbstractMigration { + #[\Override] public function getDescription(): string { return 'Create table process_schedule'; @@ -41,6 +42,7 @@ public function up(Schema $schema): void } } + #[\Override] public function down(Schema $schema): void { $this->addSql('DROP TABLE process_schedule'); diff --git a/src/Migrations/Version20240730090403.php b/src/Migrations/Version20240730090403.php index 101395a..29ab1a9 100644 --- a/src/Migrations/Version20240730090403.php +++ b/src/Migrations/Version20240730090403.php @@ -21,6 +21,7 @@ */ final class Version20240730090403 extends AbstractMigration { + #[\Override] public function getDescription(): string { return 'Add process_user.token'; @@ -31,6 +32,7 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE process_user ADD token VARCHAR(255) DEFAULT NULL'); } + #[\Override] public function down(Schema $schema): void { $this->addSql('ALTER TABLE process_user DROP token'); diff --git a/src/Migrations/Version20241007134542.php b/src/Migrations/Version20241007134542.php index 1599e1b..40b4866 100644 --- a/src/Migrations/Version20241007134542.php +++ b/src/Migrations/Version20241007134542.php @@ -21,6 +21,7 @@ */ final class Version20241007134542 extends AbstractMigration { + #[\Override] public function getDescription(): string { return 'Add process_user.timezone'; @@ -33,6 +34,7 @@ public function up(Schema $schema): void } } + #[\Override] public function down(Schema $schema): void { if ($schema->hasTable('process_user') && $schema->getTable('process_user')->hasColumn('timezone')) { diff --git a/src/Migrations/Version20241007152613.php b/src/Migrations/Version20241007152613.php index 5b8cf45..3992e70 100644 --- a/src/Migrations/Version20241007152613.php +++ b/src/Migrations/Version20241007152613.php @@ -21,6 +21,7 @@ */ final class Version20241007152613 extends AbstractMigration { + #[\Override] public function getDescription(): string { return 'Add process_execution.context'; @@ -33,6 +34,7 @@ public function up(Schema $schema): void } } + #[\Override] public function down(Schema $schema): void { if ($schema->hasTable('process_execution') && $schema->getTable('process_execution')->hasColumn('context')) { diff --git a/src/Migrations/Version20241009075733.php b/src/Migrations/Version20241009075733.php index b66faee..cfecff0 100644 --- a/src/Migrations/Version20241009075733.php +++ b/src/Migrations/Version20241009075733.php @@ -18,6 +18,7 @@ final class Version20241009075733 extends AbstractMigration { + #[\Override] public function getDescription(): string { return 'Add process_user.locale'; @@ -30,6 +31,7 @@ public function up(Schema $schema): void } } + #[\Override] public function down(Schema $schema): void { if ($schema->hasTable('process_user') && $schema->getTable('process_user')->hasColumn('locale')) { diff --git a/src/Monolog/Handler/DoctrineProcessHandler.php b/src/Monolog/Handler/DoctrineProcessHandler.php index 0a178b5..3c47678 100644 --- a/src/Monolog/Handler/DoctrineProcessHandler.php +++ b/src/Monolog/Handler/DoctrineProcessHandler.php @@ -50,6 +50,7 @@ public function disable(): void $this->enabled = false; } + #[\Override] public function __destruct() { $this->flush(); diff --git a/src/Monolog/Handler/ProcessHandler.php b/src/Monolog/Handler/ProcessHandler.php index b1f94da..a57eab0 100644 --- a/src/Monolog/Handler/ProcessHandler.php +++ b/src/Monolog/Handler/ProcessHandler.php @@ -48,6 +48,7 @@ public function setFilename(string $filename): void $this->url = \sprintf('%s/%s', $this->directory, $filename); } + #[\Override] public function close(): void { $this->url = $this->directory; @@ -59,6 +60,7 @@ public function getFilename(): ?string return $this->url; } + #[\Override] public function write(LogRecord $record): void { parent::write($record); diff --git a/src/Twig/Components/BootstrapModal.php b/src/Twig/Components/BootstrapModal.php index 1e8c362..1149b7c 100644 --- a/src/Twig/Components/BootstrapModal.php +++ b/src/Twig/Components/BootstrapModal.php @@ -1,5 +1,7 @@