diff --git a/src/packages/plg_system_mokowaas/Service/DemoResetService.php b/src/packages/plg_system_mokowaas/Service/DemoResetService.php index 14411db0..ccc55581 100644 --- a/src/packages/plg_system_mokowaas/Service/DemoResetService.php +++ b/src/packages/plg_system_mokowaas/Service/DemoResetService.php @@ -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))