diff --git a/src/packages/plg_system_mokowaas/Extension/MokoWaaS.php b/src/packages/plg_system_mokowaas/Extension/MokoWaaS.php index acdcf5c..f068bd4 100644 --- a/src/packages/plg_system_mokowaas/Extension/MokoWaaS.php +++ b/src/packages/plg_system_mokowaas/Extension/MokoWaaS.php @@ -862,7 +862,7 @@ class MokoWaaS extends CMSPlugin implements BootableExtensionInterface ); } - // Demo Mode: Calculate next reset time from cron schedule + // Demo Mode: Calculate next reset time and manage scheduled task if ((int) $params->get('demo_mode_enabled', 0) === 1) { $schedule = $params->get('demo_reset_schedule', '0 0 * * *'); @@ -877,11 +877,21 @@ class MokoWaaS extends CMSPlugin implements BootableExtensionInterface $params->set('demo_next_reset', $nextReset); $changed = true; } + + // Auto-create or update the scheduled task + $baseline = $params->get('demo_active_baseline', 'default'); + $this->ensureDemoResetTask($cron, $baseline); } - elseif ($params->get('demo_next_reset', '') !== '') + else { - $params->set('demo_next_reset', ''); - $changed = true; + if ($params->get('demo_next_reset', '') !== '') + { + $params->set('demo_next_reset', ''); + $changed = true; + } + + // Remove the scheduled task when demo mode is off + $this->removeDemoResetTask(); } // Demo Mode: Take Snapshot Now @@ -1756,6 +1766,89 @@ class MokoWaaS extends CMSPlugin implements BootableExtensionInterface * * @since 02.21.00 */ + protected function ensureDemoResetTask(string $cron, string $baseline): void + { + try + { + $db = Factory::getDbo(); + + // Check if task already exists + $query = $db->getQuery(true) + ->select([$db->quoteName('id'), $db->quoteName('params')]) + ->from($db->quoteName('#__scheduler_tasks')) + ->where($db->quoteName('type') . ' = ' . $db->quote('mokowaas.demo.reset')); + + $db->setQuery($query); + $existing = $db->loadAssoc(); + + // Convert cron to Joomla scheduler execution rule + $execRule = json_encode([ + 'rule-type' => 'cron-expression', + 'cron-expression' => $cron, + ]); + + $taskParams = json_encode(['baseline' => $baseline]); + + if ($existing) + { + // Update existing task + $query = $db->getQuery(true) + ->update($db->quoteName('#__scheduler_tasks')) + ->set($db->quoteName('execution_rules') . ' = ' . $db->quote($execRule)) + ->set($db->quoteName('params') . ' = ' . $db->quote($taskParams)) + ->set($db->quoteName('state') . ' = 1') + ->where($db->quoteName('id') . ' = ' . (int) $existing['id']); + + $db->setQuery($query); + $db->execute(); + } + else + { + // Create new task + $obj = (object) [ + 'title' => 'MokoWaaS Demo Reset', + 'type' => 'mokowaas.demo.reset', + 'execution_rules' => $execRule, + 'params' => $taskParams, + 'state' => 1, + 'created' => Factory::getDate()->toSql(), + 'next_execution' => Factory::getDate()->toSql(), + ]; + + $db->insertObject('#__scheduler_tasks', $obj); + } + } + catch (\Throwable $e) + { + Log::add('Failed to create demo reset task: ' . $e->getMessage(), Log::WARNING, 'mokowaas'); + } + } + + /** + * Remove the demo reset scheduled task. + * + * @return void + * + * @since 02.28.00 + */ + protected function removeDemoResetTask(): void + { + try + { + $db = Factory::getDbo(); + $query = $db->getQuery(true) + ->delete($db->quoteName('#__scheduler_tasks')) + ->where($db->quoteName('type') . ' = ' . $db->quote('mokowaas.demo.reset')); + + $db->setQuery($query); + $db->execute(); + } + catch (\Throwable $e) + { + // Silent — table may not exist + } + } + protected function calculateNextCronRun(string $cron): ?string { $parts = preg_split('/\s+/', trim($cron));