Complete project scaffold with working auth, REST API, Prisma/SQLite schema, Docker config, and React frontend for both Rack Planner and Service Mapper modules. Both server and client pass TypeScript strict mode with zero errors. Initial migration applied. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
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'}]`);
|
|
});
|