Files
rack-planner/server/index.ts

64 lines
1.9 KiB
TypeScript
Raw Normal View History

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'}]`);
});