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); });