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:
Jonathan Miller
2026-05-30 20:37:41 -05:00
parent 15820542a6
commit 5800164ea4
@@ -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));