chore: add server/index.ts
This commit is contained in:
parent
2fb134f42b
commit
1f5d34aab5
1 changed files with 65 additions and 0 deletions
65
server/index.ts
Normal file
65
server/index.ts
Normal file
|
|
@ -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);
|
||||||
|
});
|
||||||
Loading…
Add table
Reference in a new issue