a349c8e2cf
- Change route from '/status' to '/' since router is mounted at '/api/status' - Fixes HTML 404 response when client calls /api/status
72 lines
2.6 KiB
JavaScript
72 lines
2.6 KiB
JavaScript
// 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('/', 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;
|