diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c8afa94..3571901b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ - Send Heartbeat button on health token field for manual heartbeat testing - Font Awesome 7 loaded in admin backend — picks up MokoOnyx Kit code if present, falls back to bundled FA7 Free or FA6 CDN - MokoWaaS → MokoSuite database table migration in install script (create new, copy data, drop old) +- MokoWaaS → MokoSuite extension param migration — copies params from all old mokowaas plugins/modules/component, then removes old entries and filesystem remnants ### Removed - PerfectPublisher webservices plugin (no longer needed) diff --git a/source/script.php b/source/script.php index 152dd140..2f38e791 100644 --- a/source/script.php +++ b/source/script.php @@ -64,6 +64,9 @@ class Pkg_MokosuiteInstallerScript // Migrate MokoWaaS database tables to MokoSuite naming $this->migrateWaasTables(); + // Migrate params from old mokowaas extensions to mokosuite equivalents + $this->migrateWaasExtensionParams(); + // Remove legacy extensions and migrate settings before retiring $this->cleanupLegacyExtensions(); $this->migrateStandalonePlugins(); @@ -1728,4 +1731,195 @@ class Pkg_MokosuiteInstallerScript Log::add('Table migration error: ' . $e->getMessage(), Log::WARNING, 'mokosuite'); } } + + /** + * Migrate params from old mokowaas extension entries to mokosuite equivalents. + * + * Copies params where the new extension has empty/default params, then deletes + * the old extension entries and their filesystem remnants. + * + * @return void + * + * @since 02.35.00 + */ + private function migrateWaasExtensionParams(): void + { + // [old_element, old_folder, new_element, new_folder, type] + $map = [ + ['mokowaas', 'system', 'mokosuite', 'system', 'plugin'], + ['mokowaas_firewall', 'system', 'mokosuite_firewall', 'system', 'plugin'], + ['mokowaas_tenant', 'system', 'mokosuite_tenant', 'system', 'plugin'], + ['mokowaas_devtools', 'system', 'mokosuite_devtools', 'system', 'plugin'], + ['mokowaas_offline', 'system', 'mokosuite_offline', 'system', 'plugin'], + ['mokowaas_monitor', 'system', 'mokosuite_monitor', 'system', 'plugin'], + ['mokowaas', 'webservices', 'mokosuite', 'webservices', 'plugin'], + ['mokowaassync', 'task', 'mokosuitesync', 'task', 'plugin'], + ['mokowaasdemo', 'task', 'mokosuitedemo', 'task', 'plugin'], + ['mokowaas_tickets', 'task', 'mokosuite_tickets', 'task', 'plugin'], + ['com_mokowaas', '', 'com_mokosuite', '', 'component'], + ['mod_mokowaas_cpanel', '', 'mod_mokosuite_cpanel', '', 'module'], + ['mod_mokowaas_menu', '', 'mod_mokosuite_menu', '', 'module'], + ['mod_mokowaas_cache', '', 'mod_mokosuite_cache', '', 'module'], + ['mod_mokowaas_categories', '', 'mod_mokosuite_categories', '', 'module'], + ['pkg_mokowaas', '', 'pkg_mokosuite', '', 'package'], + ]; + + try + { + $db = Factory::getDbo(); + $migrated = 0; + + foreach ($map as [$oldEl, $oldFolder, $newEl, $newFolder, $type]) + { + // Find old extension + $query = $db->getQuery(true) + ->select([$db->quoteName('extension_id'), $db->quoteName('params')]) + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('element') . ' = ' . $db->quote($oldEl)) + ->where($db->quoteName('type') . ' = ' . $db->quote($type)); + + if ($type === 'plugin') + { + $query->where($db->quoteName('folder') . ' = ' . $db->quote($oldFolder)); + } + + $db->setQuery($query); + $old = $db->loadObject(); + + if (!$old) + { + continue; + } + + $oldParams = (string) ($old->params ?? '{}'); + + // Copy params to new extension only if new has empty params + if ($oldParams !== '' && $oldParams !== '{}' && $oldParams !== '[]') + { + $newQuery = $db->getQuery(true) + ->select($db->quoteName('params')) + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('element') . ' = ' . $db->quote($newEl)) + ->where($db->quoteName('type') . ' = ' . $db->quote($type)); + + if ($type === 'plugin') + { + $newQuery->where($db->quoteName('folder') . ' = ' . $db->quote($newFolder)); + } + + $db->setQuery($newQuery); + $newParams = (string) $db->loadResult(); + + if (empty($newParams) || $newParams === '{}' || $newParams === '[]') + { + $updateQuery = $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('params') . ' = ' . $db->quote($oldParams)) + ->where($db->quoteName('element') . ' = ' . $db->quote($newEl)) + ->where($db->quoteName('type') . ' = ' . $db->quote($type)); + + if ($type === 'plugin') + { + $updateQuery->where($db->quoteName('folder') . ' = ' . $db->quote($newFolder)); + } + + $db->setQuery($updateQuery)->execute(); + + Log::add( + sprintf('Migrated params from %s to %s', $oldEl, $newEl), + Log::INFO, + 'mokosuite' + ); + } + } + + // Unprotect old extension + $db->setQuery( + $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('protected') . ' = 0') + ->where($db->quoteName('extension_id') . ' = ' . (int) $old->extension_id) + )->execute(); + + // Remove old update site links + $db->setQuery( + $db->getQuery(true) + ->select($db->quoteName('update_site_id')) + ->from($db->quoteName('#__update_sites_extensions')) + ->where($db->quoteName('extension_id') . ' = ' . (int) $old->extension_id) + ); + $siteIds = $db->loadColumn(); + + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__update_sites_extensions')) + ->where($db->quoteName('extension_id') . ' = ' . (int) $old->extension_id) + )->execute(); + + if (!empty($siteIds)) + { + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__updates')) + ->where($db->quoteName('update_site_id') . ' IN (' . implode(',', array_map('intval', $siteIds)) . ')') + )->execute(); + + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__update_sites')) + ->where($db->quoteName('update_site_id') . ' IN (' . implode(',', array_map('intval', $siteIds)) . ')') + )->execute(); + } + + // Delete old extension entry + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__extensions')) + ->where($db->quoteName('extension_id') . ' = ' . (int) $old->extension_id) + )->execute(); + + // Remove old plugin/module filesystem remnants + $dir = null; + + if ($type === 'plugin') + { + $dir = JPATH_PLUGINS . '/' . $oldFolder . '/' . $oldEl; + } + elseif ($type === 'module') + { + $dir = JPATH_ADMINISTRATOR . '/modules/' . $oldEl; + } + elseif ($type === 'component') + { + // Components have admin + site dirs + foreach ([JPATH_ADMINISTRATOR . '/components/' . $oldEl, JPATH_SITE . '/components/' . $oldEl] as $cDir) + { + if (is_dir($cDir)) + { + $this->rmdirRecursive($cDir); + } + } + } + + if ($dir && is_dir($dir)) + { + $this->rmdirRecursive($dir); + } + + $migrated++; + } + + if ($migrated > 0) + { + Factory::getApplication()->enqueueMessage( + sprintf('Migrated params from %d MokoWaaS extension(s) and removed old entries.', $migrated), + 'message' + ); + } + } + catch (\Throwable $e) + { + Log::add('Extension param migration error: ' . $e->getMessage(), Log::WARNING, 'mokosuite'); + } + } }