From a296c1f7ff372ae141cedddbca53912d7a5a4ebe Mon Sep 17 00:00:00 2001 From: hey-Zayn Date: Sun, 29 Mar 2026 05:41:54 +0500 Subject: [PATCH] refactor: production architecture hardening and song fetch reliability --- backend/src/controllers/stats.controller.js | 2 +- backend/src/index.js | 37 ++++++++++++++++++--- backend/src/lib/redis.js | 9 ++++- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/backend/src/controllers/stats.controller.js b/backend/src/controllers/stats.controller.js index 81283d1..d6bb4ee 100644 --- a/backend/src/controllers/stats.controller.js +++ b/backend/src/controllers/stats.controller.js @@ -44,7 +44,7 @@ const getStats = async (req, res, next) => { res.status(200).json(stats); } catch (error) { - + next(error); } } diff --git a/backend/src/index.js b/backend/src/index.js index ba7cb9b..3820a64 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -58,6 +58,27 @@ app.use('/api/albums', require('./routes/album.route')); app.use('/api/playlists', require('./routes/playlist.route')); app.use('/api/stats', require('./routes/stats.route')); +// 5. Health Check & Root +app.get('/api/health', async (req, res) => { + const mongoose = require('mongoose'); + const Song = require('./models/song.model'); + const Redis = require('./lib/redis'); + + const health = { + status: 'UP', + timestamp: new Date(), + database: { + status: mongoose.connection.readyState === 1 ? 'CONNECTED' : 'DISCONNECTED', + songCount: await Song.countDocuments().catch(() => 0), + }, + redis: { + status: Redis.isOpen ? 'CONNECTED' : 'DISCONNECTED' + }, + environment: process.env.NODE_ENV + }; + res.status(200).json(health); +}); + app.get('/', (req, res) => res.send('API is running...')); // 5. Sentry Error Handler AFTER routes @@ -90,10 +111,18 @@ app.use((err, req, res, next) => { // 7. Database & Server start const port = process.env.PORT || 5000; -connectDB(); -httpServer.listen(port, () => { - Logger.info(`Server is running on port ${port}`); -}); +const startServer = async () => { + try { + await connectDB(); + httpServer.listen(port, () => { + Logger.info(`Server is running on port ${port}`); + }); + } catch (err) { + Logger.error(`Server failed to start: ${err.message}`); + } +}; + +startServer(); module.exports = app; \ No newline at end of file diff --git a/backend/src/lib/redis.js b/backend/src/lib/redis.js index 757faec..d0e809a 100644 --- a/backend/src/lib/redis.js +++ b/backend/src/lib/redis.js @@ -1,7 +1,14 @@ const { createClient } = require('redis'); const redisClient = createClient({ - url: process.env.REDIS_URL + url: process.env.REDIS_URL, + socket: { + connectTimeout: 5000, + reconnectStrategy: (retries) => { + if (retries > 3) return new Error('Retry limit exceeded'); + return Math.min(retries * 50, 500); + } + } }); redisClient.on('error', (err) => console.log('Redis Client Error', err));