From e5fb88e1a4a39c64b98d1cfca7b2af4174f28bdd Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sun, 7 Jun 2026 09:50:32 -0500 Subject: [PATCH] feat: auto-create default scheduled task on install, fix AkeebaImporter constants - Create "Monthly Full Backup" scheduled task (30-day interval, profile 1, 03:00 execution) on fresh install via com_scheduler - Skips if any MokoJoomBackup task already exists - Failure notifications enabled to Super Users group by default - Replace hardcoded backup dir paths in AkeebaImporter with BackupDirectory::DEFAULT_RELATIVE constant --- .../src/Engine/AkeebaImporter.php | 5 +- source/script.php | 63 +++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/source/packages/com_mokojoombackup/src/Engine/AkeebaImporter.php b/source/packages/com_mokojoombackup/src/Engine/AkeebaImporter.php index c1fab5b..6861c78 100644 --- a/source/packages/com_mokojoombackup/src/Engine/AkeebaImporter.php +++ b/source/packages/com_mokojoombackup/src/Engine/AkeebaImporter.php @@ -30,6 +30,7 @@ namespace Joomla\Component\MokoJoomBackup\Administrator\Engine; defined('_JEXEC') or die; use Joomla\CMS\Factory; +use Joomla\Component\MokoJoomBackup\Administrator\Utility\BackupDirectory; class AkeebaImporter { @@ -484,7 +485,7 @@ class AkeebaImporter $dir = $config['akeeba.basic.output_directory'] ?? ''; if (empty($dir) || $dir === '[DEFAULT_OUTPUT]') { - return 'administrator/components/com_mokojoombackup/backups'; + return BackupDirectory::DEFAULT_RELATIVE; } // Convert absolute path to relative @@ -492,7 +493,7 @@ class AkeebaImporter $dir = ltrim(substr($dir, strlen(JPATH_ROOT)), '/\\'); } - return $dir ?: 'administrator/components/com_mokojoombackup/backups'; + return $dir ?: BackupDirectory::DEFAULT_RELATIVE; } private function mapRemoteStorage(array $config): string diff --git a/source/script.php b/source/script.php index 8c64545..a4fdb3f 100644 --- a/source/script.php +++ b/source/script.php @@ -211,6 +211,9 @@ class Pkg_MokoJoomBackupInstallerScript file_put_contents($index, ''); } } + + // Create default scheduled task — every 30 days, profile 1 + $this->createDefaultScheduledTask(); } if ($type === 'uninstall') { @@ -270,6 +273,66 @@ class Pkg_MokoJoomBackupInstallerScript } } + private function createDefaultScheduledTask(): void + { + try { + $db = Factory::getDbo(); + + // Check if a MokoJoomBackup task already exists + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->quoteName('#__scheduler_tasks')) + ->where($db->quoteName('type') . ' = ' . $db->quote('mokojoombackup.run_profile')); + $db->setQuery($query); + + if ((int) $db->loadResult() > 0) { + return; + } + + $now = date('Y-m-d H:i:s'); + + $task = (object) [ + 'title' => 'MokoJoomBackup — Monthly Full Backup', + 'type' => 'mokojoombackup.run_profile', + 'execution_rules' => json_encode([ + 'rule-type' => 'interval-days', + 'interval-days' => '30', + 'exec-day' => '1', + 'exec-time' => '03:00:00', + ]), + 'cron_rules' => json_encode([ + 'type' => 'interval', + 'exp' => 'P30D', + ]), + 'state' => 1, + 'params' => json_encode([ + 'profile_id' => 1, + 'individual_log' => true, + 'log_file' => '', + 'notifications' => [ + 'success_mail' => '0', + 'failure_mail' => '1', + 'notification_failure_groups' => ['8'], + 'fatal_failure_mail' => '1', + 'notification_fatal_groups' => ['8'], + 'orphan_mail' => '0', + ], + ]), + 'priority' => 0, + 'ordering' => 0, + 'cli_exclusive' => 0, + 'note' => '', + 'created' => $now, + 'created_by' => Factory::getApplication()->getIdentity()->id ?? 0, + 'next_execution' => date('Y-m-d 03:00:00', strtotime('+1 day')), + ]; + + $db->insertObject('#__scheduler_tasks', $task); + } catch (\Throwable $e) { + error_log('MokoJoomBackup: createDefaultScheduledTask() failed: ' . $e->getMessage()); + } + } + private function syncMenuIcons(): void { $iconMap = [