getIdentity(); if (!$user->authorise('core.manage', 'com_plugins')) { $this->sendJson(403, ['error' => 'Not authorized']); return; } $plugin = PluginHelper::getPlugin('system', 'mokosuite'); if (!$plugin) { $this->sendJson(503, ['error' => 'MokoSuite system plugin not enabled']); return; } $params = new Registry($plugin->params); $config = Factory::getConfig(); $db = Factory::getDbo(); // Collect basic health data $payload = [ 'status' => 'ok', 'timestamp' => gmdate('Y-m-d\TH:i:s\Z'), 'site' => [ 'name' => $config->get('sitename', ''), 'url' => rtrim(Uri::root(), '/'), 'joomla_version' => JVERSION, 'php_version' => PHP_VERSION, 'db_type' => $db->getName(), 'offline' => (bool) $config->get('offline', 0), 'debug' => (bool) $config->get('debug', 0), 'sef' => (bool) $config->get('sef', 0), 'caching' => (bool) $config->get('caching', 0), ], 'plugin' => [ 'brand' => $params->get('brand_name', 'MokoSuite'), 'company' => $params->get('company_name', 'Moko Consulting'), ], ]; // Database check try { $db->setQuery('SELECT 1'); $db->loadResult(); $payload['checks']['database'] = ['status' => 'ok']; } catch (\Throwable $e) { $payload['status'] = 'error'; $payload['checks']['database'] = ['status' => 'error', 'message' => $e->getMessage()]; } // Disk space $free = @disk_free_space(JPATH_ROOT); $total = @disk_total_space(JPATH_ROOT); if ($free !== false && $total !== false) { $freeMb = round($free / 1048576); $payload['checks']['filesystem'] = [ 'status' => $freeMb < 100 ? 'degraded' : 'ok', 'free_disk_mb' => $freeMb, 'total_disk_mb' => round($total / 1048576), ]; } // Content counts $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__content'))); $payload['counts']['articles'] = (int) $db->loadResult(); $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__users'))); $payload['counts']['users'] = (int) $db->loadResult(); $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__extensions'))->where($db->quoteName('enabled') . ' = 1')); $payload['counts']['extensions'] = (int) $db->loadResult(); $this->sendJson(200, $payload); } /** * Send a JSON response and close. * * @param int $code HTTP status code * @param array $payload Response data * * @return void * * @since 1.0.0 */ 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(); } }