fix: re-register MokoWaaS extensions and task after full DB restore

Full database restore overwrites #__extensions and #__scheduler_tasks
with snapshot data, losing the current plugin registrations. After
restore, re-enables all MokoWaaS extensions, re-registers the task
plugin if missing, and re-enables the update server.

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 21:13:40 -05:00
parent a0092773c7
commit a26578fea3
@@ -299,6 +299,10 @@ class DemoResetService
}
}
// After full DB restore, re-ensure the task plugin and scheduled task
// exist — the restore overwrote #__extensions and #__scheduler_tasks
$this->reRegisterAfterRestore();
Log::add(
sprintf('Demo site reset to baseline "%s" (full DB, media=%s)', $name, $mediaRestored ? 'yes' : 'no'),
Log::WARNING,
@@ -537,6 +541,95 @@ class DemoResetService
*
* @since 02.21.00
*/
private function reRegisterAfterRestore(): void
{
try
{
$db = Factory::getDbo();
$prefix = $db->getPrefix();
// Re-enable all MokoWaaS extensions (may have been overwritten by old snapshot)
$elements = [
$db->quote('pkg_mokowaas'),
$db->quote('mokowaas'),
$db->quote('com_mokowaas'),
$db->quote('mokowaasdemo'),
$db->quote('perfectpublisher'),
];
$db->setQuery(
$db->getQuery(true)
->update($db->quoteName('#__extensions'))
->set($db->quoteName('enabled') . ' = 1')
->set($db->quoteName('protected') . ' = 1')
->set($db->quoteName('locked') . ' = 0')
->where($db->quoteName('element') . ' IN (' . implode(',', $elements) . ')')
);
$db->execute();
// If the task plugin isn't registered, add it
$db->setQuery(
$db->getQuery(true)
->select('COUNT(*)')
->from($db->quoteName('#__extensions'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokowaasdemo'))
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
);
if ((int) $db->loadResult() === 0)
{
$obj = (object) [
'name' => 'Task - MokoWaaS Demo Reset',
'type' => 'plugin',
'element' => 'mokowaasdemo',
'folder' => 'task',
'client_id' => 0,
'enabled' => 1,
'protected' => 1,
'locked' => 0,
'access' => 1,
'params' => '{}',
];
$db->insertObject('#__extensions', $obj);
}
// Ensure the scheduled task exists and is enabled
$db->setQuery(
$db->getQuery(true)
->select($db->quoteName('id'))
->from($db->quoteName('#__scheduler_tasks'))
->where($db->quoteName('type') . ' = ' . $db->quote('mokowaas.demo.reset'))
);
$taskId = (int) $db->loadResult();
if ($taskId > 0)
{
// Re-enable and update next_execution to now so it stays active
$db->setQuery(
$db->getQuery(true)
->update($db->quoteName('#__scheduler_tasks'))
->set($db->quoteName('state') . ' = 1')
->where($db->quoteName('id') . ' = ' . $taskId)
);
$db->execute();
}
// Re-enable the update server
$db->setQuery(
$db->getQuery(true)
->update($db->quoteName('#__update_sites'))
->set($db->quoteName('enabled') . ' = 1')
->where('(' . $db->quoteName('name') . ' LIKE ' . $db->quote('%MokoWaaS%')
. ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoWaaS%') . ')')
);
$db->execute();
}
catch (\Throwable $e)
{
// Best effort — don't let registration failure break the restore
}
}
private function ensureSnapshotDir(): void
{
if (!is_dir($this->snapshotDir))