feat(demo): auto-create scheduled task when demo mode is enabled
When demo mode is turned on and saved, automatically creates a Joomla Scheduler task for the demo reset using the configured cron schedule. When demo mode is turned off, removes the scheduled task. No manual task creation needed — just enable demo mode and save. Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user