00d44256b4
Rebrand all 17 sub-extensions from mokowaas to mokosuite naming, including component, plugins, modules, task plugins, and webservices. Updates package manifest, workflows, docs, wiki, and issue templates. Adds new plg_system_mokosuite_license extension.
140 lines
3.8 KiB
PHP
140 lines
3.8 KiB
PHP
<?php
|
|
/**
|
|
* @package MokoSuite
|
|
* @subpackage com_mokosuite
|
|
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
|
|
* @license GNU General Public License version 3 or later; see LICENSE
|
|
*/
|
|
|
|
namespace Moko\Component\MokoSuite\Api\Controller;
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\MVC\Controller\BaseController;
|
|
use Joomla\CMS\Plugin\PluginHelper;
|
|
use Joomla\CMS\Uri\Uri;
|
|
use Joomla\Registry\Registry;
|
|
|
|
/**
|
|
* Health check API controller.
|
|
*
|
|
* GET /api/index.php/v1/mokosuite/health
|
|
*
|
|
* Returns full health diagnostics from the MokoSuite system plugin.
|
|
* Requires a Joomla API token with core.manage permissions.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
class HealthController extends BaseController
|
|
{
|
|
/**
|
|
* Return full health check data.
|
|
*
|
|
* @return void
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
public function displayList(): void
|
|
{
|
|
$app = Factory::getApplication();
|
|
$user = $app->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();
|
|
}
|
|
}
|