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