// Copyright (c) 2026 Gordon Bolton. MIT License. const express = require('express'); const router = express.Router(); const requireAuth = require('../middleware/requireAuth'); const cache = require('../utils/cache'); const { getLastPollTimings, POLLING_ENABLED } = require('../utils/poller'); const { getSonarrInstances, getRadarrInstances } = require('../utils/config'); const { getGlobalWebhookMetrics } = require('../utils/cache'); const { checkWebhookConfigured, aggregateMetrics } = require('../services/WebhookStatus'); // Admin-only status page with cache stats router.get('/status', requireAuth, async (req, res) => { try { const user = req.user; if (!user.isAdmin) { return res.status(403).json({ error: 'Admin access required' }); } const cacheStats = cache.getStats(); const uptime = process.uptime(); // Get webhook metrics const webhookMetrics = getGlobalWebhookMetrics(); // Check webhook configuration for each service const sonarrInstances = getSonarrInstances(); const radarrInstances = getRadarrInstances(); const sonarrWebhookConfigured = sonarrInstances.length > 0 ? await checkWebhookConfigured(sonarrInstances[0], 'Sonarr') : false; const radarrWebhookConfigured = radarrInstances.length > 0 ? await checkWebhookConfigured(radarrInstances[0], 'Radarr') : false; // Find Sonarr and Radarr metrics from instances const sonarrMetrics = {}; const radarrMetrics = {}; for (const [url, metrics] of Object.entries(webhookMetrics.instances || {})) { if (url.includes('sonarr')) { sonarrMetrics[url] = metrics; } else if (url.includes('radarr')) { radarrMetrics[url] = metrics; } } res.json({ server: { uptimeSeconds: Math.floor(uptime), nodeVersion: process.version, memoryUsageMB: Math.round(process.memoryUsage().rss / 1024 / 1024 * 10) / 10, heapUsedMB: Math.round(process.memoryUsage().heapUsed / 1024 / 1024 * 10) / 10, heapTotalMB: Math.round(process.memoryUsage().heapTotal / 1024 / 1024 * 10) / 10 }, polling: { enabled: POLLING_ENABLED, intervalMs: POLLING_ENABLED ? require('../utils/poller').POLL_INTERVAL : 0, lastPoll: getLastPollTimings() }, cache: cacheStats, webhooks: { sonarr: aggregateMetrics(sonarrMetrics, sonarrWebhookConfigured), radarr: aggregateMetrics(radarrMetrics, radarrWebhookConfigured) } }); } catch (err) { res.status(500).json({ error: 'Failed to get status', details: err.message }); } }); module.exports = router;