const express = require('express'); const router = express.Router(); const http = require('http'); /** * Data Retention Metrics Proxy * Proxies requests to the data retention microservice */ const DATA_RETENTION_HOST = process.env.DATA_RETENTION_HOST || 'data-retention'; const DATA_RETENTION_PORT = process.env.DATA_RETENTION_PORT || 3001; /** * Make HTTP request to data retention service */ function makeRequest(path) { return new Promise((resolve, reject) => { const options = { hostname: DATA_RETENTION_HOST, port: DATA_RETENTION_PORT, path: path, method: 'GET', timeout: 5000 }; const req = http.request(options, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { const result = JSON.parse(data); resolve({ status: res.statusCode, data: result }); } catch (error) { reject(new Error(`Failed to parse response: ${error.message}`)); } }); }); req.on('error', (error) => { reject(new Error(`Request failed: ${error.message}`)); }); req.on('timeout', () => { req.destroy(); reject(new Error('Request timeout')); }); req.end(); }); } /** * GET /api/data-retention/metrics * Get detailed metrics from data retention service */ router.get('/metrics', async (req, res) => { try { const response = await makeRequest('/metrics'); if (response.status === 200) { res.json({ success: true, data: response.data, timestamp: new Date().toISOString() }); } else { res.status(response.status).json({ success: false, error: 'Failed to fetch metrics from data retention service' }); } } catch (error) { console.error('Data retention metrics error:', error); res.status(503).json({ success: false, error: 'Data retention service unavailable', details: error.message }); } }); /** * GET /api/data-retention/health * Get health status from data retention service */ router.get('/health', async (req, res) => { try { const response = await makeRequest('/health'); if (response.status === 200) { res.json({ success: true, data: response.data, timestamp: new Date().toISOString() }); } else { res.status(response.status).json({ success: false, error: 'Failed to fetch health from data retention service' }); } } catch (error) { console.error('Data retention health error:', error); res.status(503).json({ success: false, error: 'Data retention service unavailable', details: error.message }); } }); /** * GET /api/data-retention/stats * Get basic statistics from data retention service */ router.get('/stats', async (req, res) => { try { const response = await makeRequest('/stats'); if (response.status === 200) { res.json({ success: true, data: response.data, timestamp: new Date().toISOString() }); } else { res.status(response.status).json({ success: false, error: 'Failed to fetch stats from data retention service' }); } } catch (error) { console.error('Data retention stats error:', error); res.status(503).json({ success: false, error: 'Data retention service unavailable', details: error.message }); } }); /** * GET /api/data-retention/status * Get combined status including service connectivity */ router.get('/status', async (req, res) => { try { const [healthResponse, metricsResponse] = await Promise.allSettled([ makeRequest('/health'), makeRequest('/metrics') ]); const result = { success: true, service: { name: 'data-retention-service', connected: false, error: null }, health: null, metrics: null, timestamp: new Date().toISOString() }; if (healthResponse.status === 'fulfilled' && healthResponse.value.status === 200) { result.service.connected = true; result.health = healthResponse.value.data; } else { result.service.error = healthResponse.reason?.message || 'Health check failed'; } if (metricsResponse.status === 'fulfilled' && metricsResponse.value.status === 200) { result.metrics = metricsResponse.value.data; } res.json(result); } catch (error) { console.error('Data retention status error:', error); res.status(503).json({ success: false, error: 'Failed to get data retention service status', details: error.message }); } }); module.exports = router;