getArgument('check');
$requiredOnly = $input->hasOption('required');
$verbose = $input->hasOption('verbose');
$json = $input->hasOption('json');
if ($checkName) {
return $this->runSingleCheck($checkName, $output, $verbose, $json);
}
if ($requiredOnly) {
return $this->runRequiredChecks($output, $verbose, $json);
}
return $this->runAllChecks($output, $verbose, $json);
}
#[ConsoleCommand(
name: 'health:list',
description: 'List available health checks'
)]
public function listChecks(ConsoleInput $input, ConsoleOutput $output): ExitCode
{
$checks = $this->healthService->getAvailableChecks();
$responsiveOutput = ResponsiveOutput::create($output);
$output->writeLine("Available Health Checks:\n");
// Prepare table data
$headers = ['Name', 'Required', 'Description'];
$rows = [];
foreach ($checks as $check) {
$rows[] = [
$check['name'],
$check['required'] ? 'Yes' : 'No',
$check['description'],
];
}
$responsiveOutput->writeTable($headers, $rows);
$output->writeLine('');
$responsiveOutput->writeList([
'health:check' => 'Run all checks',
'health:check --required' => 'Run only required checks',
'health:check "Check Name"' => 'Run specific check',
'health:check --json' => 'Output as JSON',
], 'Usage:');
return ExitCode::SUCCESS;
}
private function runSingleCheck(string $checkName, ConsoleOutput $output, bool $verbose, bool $json): ExitCode
{
$result = $this->healthService->runCheck($checkName);
if ($result === null) {
$output->writeLine("Health check '{$checkName}' not found.");
return ExitCode::NOT_FOUND;
}
if ($json) {
$output->writeLine(json_encode($result->toArray(), JSON_PRETTY_PRINT));
return ExitCode::SUCCESS;
}
$this->displaySingleResult($checkName, $result, $output, $verbose);
return $result->isUnhealthy() ? ExitCode::GENERAL_ERROR : ExitCode::SUCCESS;
}
private function runRequiredChecks(ConsoleOutput $output, bool $verbose, bool $json): ExitCode
{
$report = $this->healthService->runRequiredChecks();
if ($json) {
$output->writeLine(json_encode($report->toArray(), JSON_PRETTY_PRINT));
return ExitCode::SUCCESS;
}
$this->displayReport($report, $output, $verbose, 'Required Health Checks');
return $report->isUnhealthy() ? ExitCode::GENERAL_ERROR : ExitCode::SUCCESS;
}
private function runAllChecks(ConsoleOutput $output, bool $verbose, bool $json): ExitCode
{
$report = $this->healthService->runAllChecks();
if ($json) {
$output->writeLine(json_encode($report->toArray(), JSON_PRETTY_PRINT));
return ExitCode::SUCCESS;
}
$this->displayReport($report, $output, $verbose, 'Console System Health Check');
return $report->isUnhealthy() ? ExitCode::GENERAL_ERROR : ExitCode::SUCCESS;
}
private function displayReport($report, ConsoleOutput $output, bool $verbose, string $title): void
{
$statusColor = $report->overallStatus->getColor();
$statusSymbol = $report->overallStatus->getSymbol();
$output->writeLine("<{$statusColor}>{$title}>");
$output->writeLine("<{$statusColor}>{$statusSymbol} Overall Status: {$report->overallStatus->value}>");
$output->writeLine('');
$output->writeLine("Summary:");
$output->writeLine(" Total Checks: {$report->getCheckCount()}");
$output->writeLine(" Healthy: {$report->getHealthyCount()}");
$output->writeLine(" Warnings: {$report->getWarningCount()}");
$output->writeLine(" Unhealthy: {$report->getUnhealthyCount()}");
$output->writeLine('');
// Show unhealthy checks first
$unhealthyChecks = $report->getUnhealthyChecks();
if (! empty($unhealthyChecks)) {
$output->writeLine('Failed Checks:');
foreach ($unhealthyChecks as $name => $result) {
$this->displaySingleResult($name, $result, $output, $verbose);
}
$output->writeLine('');
}
// Show warning checks
$warningChecks = $report->getWarningChecks();
if (! empty($warningChecks)) {
$output->writeLine('Warning Checks:');
foreach ($warningChecks as $name => $result) {
$this->displaySingleResult($name, $result, $output, $verbose);
}
$output->writeLine('');
}
// Show healthy checks only in verbose mode
if ($verbose) {
$healthyChecks = $report->getHealthyChecks();
if (! empty($healthyChecks)) {
$output->writeLine('Healthy Checks:');
foreach ($healthyChecks as $name => $result) {
$this->displaySingleResult($name, $result, $output, $verbose);
}
}
}
}
private function displaySingleResult(string $name, $result, ConsoleOutput $output, bool $verbose): void
{
$color = $result->status->getColor();
$symbol = $result->status->getSymbol();
$output->writeLine("<{$color}>{$symbol} {$name}: {$result->message}>");
if ($verbose && ! empty($result->details)) {
foreach ($result->details as $key => $value) {
$displayValue = is_array($value) ? implode(', ', $value) : $value;
$output->writeLine(" {$key}: {$displayValue}");
}
}
if ($result->recommendation) {
$output->writeLine(" 💡 Recommendation: {$result->recommendation}");
}
if ($verbose || $result->status !== HealthStatus::HEALTHY) {
$output->writeLine('');
}
}
}