From 311f2c3afed4ff2024c2d71523b892192fd42c2c Mon Sep 17 00:00:00 2001 From: Henning <leutz@pcsg.de> Date: Thu, 27 Mar 2025 09:41:19 +0100 Subject: [PATCH] feat: add required attribute to cron.xml In this commit, we have improved the handling of cron tasks and introduced the 'required' attribute. Changes made include: - Added 'required' attribute to three cron exec in `cron.xml` to enforce their creation. - Updated `EventHandler` to only create `required` crons, and to stop creating non-required crons when the `$onlyRequired` argument is set to `true`. - Improved how crons are created with different scopes by replacing the switch statement with a `match` expression in `EventHandler`. - Added the handling of the 'required' attribute in `Manager` to ensure all cron objects are aware of if they are required or not. This attribute is set to `true` for required crons and `false` if not specified or not required. - Simplified the array replacement in `EventHandler`. This improvement in how cron tasks are managed will result in more efficient and robust operation of the system. --- cron.xml | 6 ++--- src/QUI/Cron/EventHandler.php | 45 ++++++++++++++++++----------------- src/QUI/Cron/Manager.php | 9 +++++++ 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/cron.xml b/cron.xml index b200f3a..c8429ec 100644 --- a/cron.xml +++ b/cron.xml @@ -12,7 +12,7 @@ </cron> <!-- region Cleanup Temp-Folder --> - <cron exec="\QUI\Cron\QuiqqerCrons::cleanupCronHistory"> + <cron exec="\QUI\Cron\QuiqqerCrons::cleanupCronHistory" required="1"> <title> <locale group="quiqqer/cron" var="cron.cleanup.history.title"/> </title> @@ -31,7 +31,7 @@ <!-- endregion --> <!-- region Cleanup Temp-Folder --> - <cron exec="\QUI\Cron\QuiqqerCrons::clearTempFolder"> + <cron exec="\QUI\Cron\QuiqqerCrons::clearTempFolder" required="1"> <title> <locale group="quiqqer/cron" var="cron.cleanup.temp.title"/> </title> @@ -47,7 +47,7 @@ <!-- endregion --> <!-- region Cleanup Sessions --> - <cron exec="\QUI\Cron\QuiqqerCrons::clearSessions"> + <cron exec="\QUI\Cron\QuiqqerCrons::clearSessions" required="1"> <title> <locale group="quiqqer/cron" var="cron.cleanup.sessions.title"/> </title> diff --git a/src/QUI/Cron/EventHandler.php b/src/QUI/Cron/EventHandler.php index 7c71fb2..8510674 100644 --- a/src/QUI/Cron/EventHandler.php +++ b/src/QUI/Cron/EventHandler.php @@ -33,6 +33,8 @@ class EventHandler if ($Package->getName() === 'quiqqer/cron') { self::checkCronTable(); } + + self::createAutoCreateCrons(null, true); } /** @@ -191,15 +193,27 @@ class EventHandler * Create all crons with a <autocreate> items. * * @param string|null $scope (optional) - Only create crons for given scope (see Manager::AUTOCREATE_SCOPE_*) + * @param bool $onlyRequired - Only create required crons * @return void */ - public static function createAutoCreateCrons(?string $scope = null): void - { + public static function createAutoCreateCrons( + ?string $scope = null, + bool $onlyRequired = false + ): void { $CronManager = new Manager(); foreach ($CronManager->getAvailableCrons() as $cron) { $title = $cron['title']; $exec = $cron['exec']; + $required = $cron['required']; + + if ($onlyRequired && $required === false) { + continue; + } + + if (empty($cron['autocreate'])) { + continue; + } foreach ($cron['autocreate'] as $autocreate) { // Check if cron already exists @@ -211,18 +225,11 @@ class EventHandler continue; } - switch ($autocreate['scope']) { - case Manager::AUTOCREATE_SCOPE_PROJECTS: - $createWithParams = self::getCronsToCreateForProjectsScope($params); - break; - - case Manager::AUTOCREATE_SCOPE_LANGUAGES: - $createWithParams = self::getCronsToCreateForLanguagesScope($params); - break; - - default: - $createWithParams = [$params]; - } + $createWithParams = match ($autocreate['scope']) { + Manager::AUTOCREATE_SCOPE_PROJECTS => self::getCronsToCreateForProjectsScope($params), + Manager::AUTOCREATE_SCOPE_LANGUAGES => self::getCronsToCreateForLanguagesScope($params), + default => [$params], + }; // Create crons foreach ($createWithParams as $createParams) { @@ -283,14 +290,8 @@ class EventHandler foreach ($projectCronParams as $k => $v) { $projectCronParams[$k] = str_replace( - [ - '[projectName]', - '[projectLang]' - ], - [ - $projectName, - $language - ], + ['[projectName]', '[projectLang]'], + [$projectName, $language], $v ); } diff --git a/src/QUI/Cron/Manager.php b/src/QUI/Cron/Manager.php index 2a091e6..1762921 100644 --- a/src/QUI/Cron/Manager.php +++ b/src/QUI/Cron/Manager.php @@ -798,6 +798,7 @@ class Manager $title = ''; $desc = ''; + $required = false; $params = []; /* @var $Cron DOMElement */ @@ -805,6 +806,13 @@ class Manager $Desc = $Cron->getElementsByTagName('description'); $Params = $Cron->getElementsByTagName('params'); + if ( + $Cron->getAttribute('required') + && ($Cron->getAttribute('required') === '1' || $Cron->getAttribute('required') === 'true') + ) { + $required = true; + } + if ($Title->length) { $title = QUI\Utils\DOM::getTextFromNode($Title->item(0)); } @@ -920,6 +928,7 @@ class Manager $result[] = [ 'title' => $title, 'description' => $desc, + 'required' => $required, 'exec' => $Cron->getAttribute('exec'), 'params' => $params, 'autocreate' => $autocreate -- GitLab