import 'dotenv/config'; import express from 'express'; import cookieParser from 'cookie-parser'; import cors from 'cors'; import path from 'path'; import { authRouter } from './routes/auth'; import { racksRouter } from './routes/racks'; import { modulesRouter } from './routes/modules'; import { portsRouter } from './routes/ports'; import { vlansRouter } from './routes/vlans'; import { serviceMapRouter } from './routes/serviceMap'; import { nodesRouter } from './routes/nodes'; import { edgesRouter } from './routes/edges'; import { authMiddleware } from './middleware/authMiddleware'; import { errorHandler } from './middleware/errorHandler'; const app = express(); const PORT = process.env.PORT ?? 3001; // ---- Core middleware ---- app.use(express.json()); app.use(cookieParser()); // CORS only needed in local dev (Vite :5173 → Node :3001) if (process.env.NODE_ENV !== 'production') { app.use( cors({ origin: 'http://localhost:5173', credentials: true, }) ); } // ---- Auth routes (no JWT required) ---- app.use('/api/auth', authRouter); // ---- Protected API routes ---- app.use('/api', authMiddleware); app.use('/api/racks', racksRouter); app.use('/api/modules', modulesRouter); app.use('/api/ports', portsRouter); app.use('/api/vlans', vlansRouter); app.use('/api/maps', serviceMapRouter); app.use('/api/nodes', nodesRouter); app.use('/api/edges', edgesRouter); // ---- Serve Vite build in production ---- if (process.env.NODE_ENV === 'production') { const clientDist = path.join(process.cwd(), 'client', 'dist'); app.use(express.static(clientDist)); // SPA fallback — always serve index.html for non-API routes app.get(/^(?!\/api).*/, (_req, res) => { res.sendFile(path.join(clientDist, 'index.html')); }); } // ---- Error handler (must be last) ---- app.use(errorHandler); app.listen(PORT, () => { console.log(`RackMapper running on port ${PORT} [${process.env.NODE_ENV ?? 'development'}]`); });