From 1f5d34aab50c4981a45dda3b5c2b80d8ad29bafe Mon Sep 17 00:00:00 2001 From: notshop Date: Sun, 26 Apr 2026 16:36:17 +0000 Subject: [PATCH] chore: add server/index.ts --- server/index.ts | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 server/index.ts diff --git a/server/index.ts b/server/index.ts new file mode 100644 index 0000000..66f2b4e --- /dev/null +++ b/server/index.ts @@ -0,0 +1,65 @@ +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); +});