| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import express from 'express'; |
| import cors from 'cors'; |
| import helmet from 'helmet'; |
| import rateLimit from 'express-rate-limit'; |
| import { config } from './config.js'; |
| import { ok } from './utils/apiResponse.js'; |
| import authRoutes from './auth/auth.routes.js'; |
| import marketsRoutes from './markets/markets.routes.js'; |
| import signalsRoutes from './signals/signals.routes.js'; |
| import positionsRoutes from './positions/positions.routes.js'; |
| import watchlistRoutes from './watchlist/watchlist.routes.js'; |
| import alertsRoutes from './alerts/alerts.routes.js'; |
| import statsRoutes from './stats/stats.routes.js'; |
| import { notFound } from './middlewares/notFound.js'; |
| import { errorHandler } from './middlewares/errorHandler.js'; |
|
|
| const app = express(); |
|
|
| app.use(helmet()); |
| app.use(cors({ origin: config.CORS_ORIGIN, credentials: true })); |
|
|
| |
| const rateLimitMax = config.NODE_ENV === 'production' ? 200 : 5000; |
| app.use( |
| rateLimit({ |
| windowMs: 15 * 60 * 1000, |
| max: rateLimitMax, |
| standardHeaders: true, |
| legacyHeaders: false, |
| message: { ok: false, error: { code: 'TOO_MANY_REQUESTS', message: 'Rate limit exceeded' } }, |
| }), |
| ); |
| app.use(express.json({ limit: '1mb' })); |
|
|
| app.get('/api/v1/health', (_req, res) => ok(res, { status: 'up' })); |
| app.use('/api/v1/auth', authRoutes); |
| app.use('/api/v1/markets', marketsRoutes); |
| app.use('/api/v1/markets', signalsRoutes); |
| app.use('/api/v1/positions', positionsRoutes); |
| app.use('/api/v1/watchlist', watchlistRoutes); |
| app.use('/api/v1/alerts', alertsRoutes); |
| app.use('/api/v1/stats', statsRoutes); |
|
|
| |
| if (config.NODE_ENV === 'production') { |
| app.use(express.static('../frontend/dist')); |
| app.get('*', (_req, res) => { |
| res.sendFile('index.html', { root: '../frontend/dist' }); |
| }); |
| } |
|
|
| app.use(notFound); |
| app.use(errorHandler); |
|
|
| export default app; |
|
|