70 lines
3.0 KiB
PHP
70 lines
3.0 KiB
PHP
<?php
|
|
/**
|
|
* C-Relay-PG Admin — JSON status endpoint for dashboard polling.
|
|
*
|
|
* Returns all dashboard stats in a single JSON object.
|
|
* Called by index.php's JavaScript every 10 seconds.
|
|
*/
|
|
require_once __DIR__ . '/../lib/helpers.php';
|
|
|
|
$pdo = db();
|
|
|
|
// Service state
|
|
$state = $pdo->query("SELECT * FROM caching_service_state WHERE id = 1")->fetch();
|
|
|
|
// Active backfill target (table may not exist yet on fresh start)
|
|
$active = ['active_pubkey' => '', 'active_relay' => ''];
|
|
try {
|
|
$active = $pdo->query("SELECT active_pubkey, active_relay FROM caching_backfill_active WHERE id = 1")->fetch() ?: $active;
|
|
} catch (PDOException $e) { /* table doesn't exist yet */ }
|
|
|
|
// Error relay summary (consecutive_errors column may not exist yet on fresh start)
|
|
$error_stats = ['auto_completed' => 0, 'error_count' => 0, 'timeout_count' => 0];
|
|
try {
|
|
$error_stats = $pdo->query("
|
|
SELECT
|
|
COUNT(*) FILTER (WHERE consecutive_errors >= 3) AS auto_completed,
|
|
COUNT(*) FILTER (WHERE last_status LIKE 'error%') AS error_count,
|
|
COUNT(*) FILTER (WHERE last_status = 'timeout') AS timeout_count
|
|
FROM caching_backfill_relay_progress
|
|
")->fetch() ?: $error_stats;
|
|
} catch (PDOException $e) { /* column/table doesn't exist yet */ }
|
|
|
|
// Inbox stats
|
|
$inbox = $pdo->query("
|
|
SELECT
|
|
COUNT(*) AS pending,
|
|
COUNT(*) FILTER (WHERE source_class = 'live') AS live,
|
|
COUNT(*) FILTER (WHERE source_class = 'backfill') AS backfill
|
|
FROM caching_event_inbox
|
|
")->fetch();
|
|
|
|
// Event count
|
|
$events = $pdo->query("SELECT COUNT(*) AS total FROM events")->fetch();
|
|
|
|
// Heartbeat age
|
|
$hb_age = intval($state['heartbeat_at'] ?? 0);
|
|
$hb_ago = $hb_age > 0 ? time() - $hb_age : 0;
|
|
|
|
json_response([
|
|
'service_state' => $state['service_state'] ?? 'unknown',
|
|
'heartbeat_ago' => $hb_ago > 0 ? $hb_ago . 's ago' : 'never',
|
|
'config_generation' => intval($state['config_generation'] ?? 0),
|
|
'followed_count' => intval($state['followed_author_count'] ?? 0),
|
|
'selected_relays' => intval($state['selected_relay_count'] ?? 0),
|
|
'connected_relays' => intval($state['connected_relay_count'] ?? 0),
|
|
'bf_complete' => intval($state['backfill_authors_complete'] ?? 0),
|
|
'bf_total' => intval($state['backfill_authors_total'] ?? 0),
|
|
'events_fetched' => intval($state['events_fetched'] ?? 0),
|
|
'inbox_inserts' => intval($state['inbox_inserts'] ?? 0),
|
|
'db_events' => intval($events['total'] ?? 0),
|
|
'inbox_pending' => intval($inbox['pending'] ?? 0),
|
|
'inbox_live' => intval($inbox['live'] ?? 0),
|
|
'inbox_backfill' => intval($inbox['backfill'] ?? 0),
|
|
'error_count' => intval($error_stats['error_count'] ?? 0),
|
|
'timeout_count' => intval($error_stats['timeout_count'] ?? 0),
|
|
'auto_completed' => intval($error_stats['auto_completed'] ?? 0),
|
|
'active_pubkey' => $active['active_pubkey'] ?? '',
|
|
'active_relay' => $active['active_relay'] ?? '',
|
|
]);
|