From 1836b3fd11eecf1478ea300bb4fa1c9d8e84d312 Mon Sep 17 00:00:00 2001 From: Steph Ponzo Date: Thu, 26 Feb 2026 14:23:26 +0100 Subject: [PATCH] feat(alerts): ajout serveur standalone micro-service port 3003 --- Wallette/server/modules/alerts/server.js | 126 +++++++++++++++++++++++ Wallette/server/package.json | 4 +- 2 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 Wallette/server/modules/alerts/server.js diff --git a/Wallette/server/modules/alerts/server.js b/Wallette/server/modules/alerts/server.js new file mode 100644 index 0000000..adb7e29 --- /dev/null +++ b/Wallette/server/modules/alerts/server.js @@ -0,0 +1,126 @@ +// ========================================================= +// ALERTS SERVICE - Serveur standalone +// ========================================================= +// Ce fichier est le point d'entrée du micro-service Alerts. + +// +// USAGE : node server.js (depuis Wallette/server/) +// PORT : process.env.ALERTS_PORT || 3003 +// ========================================================= + +import cors from 'cors'; +import dotenv from 'dotenv'; +import express from 'express'; +import { createServer } from 'http'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Charger .env depuis le dossier server/ +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +dotenv.config({ path: path.resolve(__dirname, '../../.env') }); + +// ========================================================= +// IMPORTS DU MODULE ALERTS (AUCUNE MODIFICATION) +// ========================================================= +import db from '../../config/db.js'; +import { createMySQLAdapter } from './adapters/mysql.adapter.js'; +import { createAlertsController } from './alerts.controller.js'; +import { createAlertsRepo } from './alerts.repo.js'; +import { createAlertsRouter } from './alerts.router.js'; +import { createAlertsService } from './alerts.service.js'; +import { broadcastAlert, getConnectedUsersCount, initSocketIO } from './socketManager.js'; + +// ========================================================= +// PORT DU SERVICE +// ========================================================= +const PORT = process.env.ALERTS_PORT || 3003; + +// ========================================================= +// CRÉER L'APPLICATION EXPRESS +// ========================================================= +const app = express(); + +app.use(cors()); +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); + +// ========================================================= +// SERVEUR HTTP + SOCKET.IO +// ========================================================= +const httpServer = createServer(app); + +const io = initSocketIO(httpServer, { + cors: { + origin: "*", + methods: ["GET", "POST"] + } +}); + +console.log('✅ Socket.IO initialisé (alerts-service)'); + +// ========================================================= +// HEALTH CHECK (requis par le gateway) +// ========================================================= +app.get('/health', (req, res) => { + res.json({ + ok: true, + service: 'alerts-service', + port: PORT, + socketConnections: getConnectedUsersCount() + }); +}); + +// ========================================================= +// INITIALISER LE MODULE ALERTS (INCHANGÉ) +// ========================================================= +const alertsAdapter = createMySQLAdapter(db); +const alertsRepo = createAlertsRepo(alertsAdapter); +const alertsService = createAlertsService(alertsRepo); +const alertsController = createAlertsController(alertsService, alertsRepo); +const alertsRouter = createAlertsRouter(alertsController); + +console.log('✅ Module Alerts initialisé'); + +// ========================================================= +// MONTER LES ROUTES +// ========================================================= +app.use('/api/alerts', alertsRouter); + +// ========================================================= +// ROUTE TEST BROADCAST +// ========================================================= +app.post('/test/broadcast-alert', (req, res) => { + const testAlert = req.body.alert || { + action: 'BUY', pair: 'BTC/EUR', confidence: 0.87, + reason: 'Signal de test', alertLevel: 'WARNING', price: 42150.23 + }; + const count = broadcastAlert(testAlert); + res.json({ success: true, message: `Alerte envoyée à ${count} utilisateur(s)`, alert: testAlert }); +}); + +// ========================================================= +// 404 + ERREURS GLOBALES +// ========================================================= +app.use((req, res) => { + res.status(404).json({ error: 'Route non trouvée', path: req.path }); +}); + +app.use((err, req, res, next) => { + console.error('Erreur serveur:', err); + res.status(500).json({ error: 'Erreur serveur', message: process.env.NODE_ENV === 'development' ? err.message : undefined }); +}); + +// ========================================================= +// DÉMARRAGE +// ========================================================= +httpServer.listen(PORT, () => { + console.log(` +╔══════════════════════════════════════════╗ +║ ALERTS SERVICE ║ +║ HTTP : http://localhost:${PORT} ║ +║ WS : ws://localhost:${PORT} ║ +╚══════════════════════════════════════════╝`); +}); + +export { alertsRepo, alertsService, io }; diff --git a/Wallette/server/package.json b/Wallette/server/package.json index 1c28eb2..53e6e86 100644 --- a/Wallette/server/package.json +++ b/Wallette/server/package.json @@ -8,7 +8,9 @@ "start": "node app.js", "dev": "node --watch app.js", "test": "node test-module-complet.js", - "test:server": "node test-server-socket.js" + "test:server": "node test-server-socket.js", + "alerts": "node modules/alerts/server.js", + "alerts:dev": "node --watch modules/alerts/server.js" }, "keywords": [ "crypto", -- 2.50.1