65 lines
2.5 KiB
TypeScript
65 lines
2.5 KiB
TypeScript
import express, { type Request, Response, NextFunction } from "express";
|
|
import session from "express-session";
|
|
import connectPgSimple from "connect-pg-simple";
|
|
import { pool } from "./db";
|
|
import { registerRoutes } from "./routes";
|
|
import { createServer } from "http";
|
|
|
|
const app = express();
|
|
const httpServer = createServer(app);
|
|
|
|
app.use(express.json({ limit: "2mb" }));
|
|
app.use(express.urlencoded({ extended: false }));
|
|
|
|
// ── Session ────────────────────────────────────────────────────────────────────
|
|
const PgSession = connectPgSimple(session);
|
|
|
|
app.use(
|
|
session({
|
|
store: new PgSession({
|
|
pool,
|
|
tableName: "user_sessions",
|
|
createTableIfMissing: true,
|
|
}),
|
|
secret: process.env.SESSION_SECRET || "change-me-in-production",
|
|
resave: false,
|
|
saveUninitialized: false,
|
|
cookie: {
|
|
secure: process.env.NODE_ENV === "production",
|
|
httpOnly: true,
|
|
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days
|
|
},
|
|
})
|
|
);
|
|
|
|
// ── API Routes ─────────────────────────────────────────────────────────────────
|
|
registerRoutes(app);
|
|
|
|
// ── Error Handler ─────────────────────────────────────────────────────────────
|
|
app.use((err: any, _req: Request, res: Response, _next: NextFunction) => {
|
|
const status = err.status || err.statusCode || 500;
|
|
const message = err.message || "Internal Server Error";
|
|
console.error(`[error] ${status} —`, message);
|
|
res.status(status).json({ error: message });
|
|
});
|
|
|
|
// ── Dev/Prod Vite ─────────────────────────────────────────────────────────────
|
|
async function start() {
|
|
if (process.env.NODE_ENV !== "production") {
|
|
const { setupVite } = await import("./vite");
|
|
await setupVite(httpServer, app);
|
|
} else {
|
|
const { serveStatic } = await import("./vite");
|
|
serveStatic(app);
|
|
}
|
|
|
|
const port = parseInt(process.env.PORT || "5000");
|
|
httpServer.listen(port, "0.0.0.0", () => {
|
|
console.log(`[notshop] Running on port ${port} (${process.env.NODE_ENV || "development"})`);
|
|
});
|
|
}
|
|
|
|
start().catch((err) => {
|
|
console.error("[notshop] Failed to start:", err);
|
|
process.exit(1);
|
|
});
|