getIdentity(); if (!$user->authorise('core.manage', 'com_plugins')) { $this->sendJson(403, ['error' => 'Not authorized']); return; } $config = Factory::getConfig(); $db = Factory::getDbo(); // Package version $query = $db->getQuery(true) ->select($db->quoteName('manifest_cache')) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote('pkg_mokosuiteclient')) ->where($db->quoteName('type') . ' = ' . $db->quote('package')); $db->setQuery($query); $pkgCache = json_decode($db->loadResult() ?? '{}'); // Feature plugins $query = $db->getQuery(true) ->select([ $db->quoteName('extension_id'), $db->quoteName('name'), $db->quoteName('element'), $db->quoteName('folder'), $db->quoteName('enabled'), $db->quoteName('manifest_cache'), ]) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) ->where('(' . $db->quoteName('element') . ' = ' . $db->quote('mokosuiteclient') . ' OR ' . $db->quoteName('element') . ' LIKE ' . $db->quote('mokosuiteclient\\_%') . ')') ->order($db->quoteName('element') . ' ASC'); $db->setQuery($query); $pluginRows = $db->loadObjectList() ?: []; $plugins = []; foreach ($pluginRows as $row) { $manifest = json_decode($row->manifest_cache ?? '{}'); $plugins[] = [ 'extension_id' => (int) $row->extension_id, 'name' => $row->name, 'element' => $row->element, 'enabled' => (bool) $row->enabled, 'version' => $manifest->version ?? '', ]; } // Quick health checks $dbOk = true; try { $db->setQuery('SELECT 1'); $db->loadResult(); } catch (\Throwable $e) { $dbOk = false; } $freeDiskMb = null; $free = @disk_free_space(JPATH_ROOT); if ($free !== false) { $freeDiskMb = round($free / 1048576); } $this->sendJson(200, [ 'status' => 'ok', 'timestamp' => gmdate('Y-m-d\TH:i:s\Z'), 'site' => [ 'name' => $config->get('sitename', ''), 'url' => rtrim(Uri::root(), '/'), 'mokosuiteclient_version' => $pkgCache->version ?? '', 'joomla_version' => (new Version())->getShortVersion(), 'php_version' => PHP_VERSION, 'db_type' => $db->getServerType(), 'debug' => (bool) $config->get('debug'), 'offline' => (bool) $config->get('offline'), 'caching' => (int) $config->get('caching'), ], 'health' => [ 'database' => $dbOk ? 'ok' : 'error', 'free_disk_mb' => $freeDiskMb, ], 'plugins' => $plugins, ]); } private function sendJson(int $code, array $payload): void { $app = Factory::getApplication(); $app->setHeader('Content-Type', 'application/json', true); $app->setHeader('Status', (string) $code, true); echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); $app->close(); } }