chore: initialize repository with deployment baseline
This commit is contained in:
90
backend/src/app.ts
Normal file
90
backend/src/app.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import express from "express";
|
||||
import cors from "cors";
|
||||
import helmet from "helmet";
|
||||
import compression from "compression";
|
||||
import morgan from "morgan";
|
||||
import { env } from "./config/env";
|
||||
import authRoutes from "./routes/auth.routes";
|
||||
import healthRoutes from "./routes/health.routes";
|
||||
import dashboardRoutes from "./routes/dashboard.routes";
|
||||
import resourceRoutes from "./routes/resources.routes";
|
||||
import billingRoutes from "./routes/billing.routes";
|
||||
import paymentRoutes from "./routes/payment.routes";
|
||||
import proxmoxRoutes from "./routes/proxmox.routes";
|
||||
import settingsRoutes from "./routes/settings.routes";
|
||||
import operationsRoutes from "./routes/operations.routes";
|
||||
import provisioningRoutes from "./routes/provisioning.routes";
|
||||
import backupRoutes from "./routes/backup.routes";
|
||||
import networkRoutes from "./routes/network.routes";
|
||||
import monitoringRoutes from "./routes/monitoring.routes";
|
||||
import clientRoutes from "./routes/client.routes";
|
||||
import { errorHandler, notFoundHandler } from "./middleware/error-handler";
|
||||
import { createRateLimit } from "./middleware/rate-limit";
|
||||
|
||||
export function createApp() {
|
||||
const app = express();
|
||||
app.set("trust proxy", 1);
|
||||
|
||||
const globalRateLimit = createRateLimit({
|
||||
windowMs: env.RATE_LIMIT_WINDOW_MS,
|
||||
max: env.RATE_LIMIT_MAX
|
||||
});
|
||||
const authRateLimit = createRateLimit({
|
||||
windowMs: env.AUTH_RATE_LIMIT_WINDOW_MS,
|
||||
max: env.AUTH_RATE_LIMIT_MAX,
|
||||
keyGenerator: (req) => {
|
||||
const email = typeof req.body?.email === "string" ? req.body.email.toLowerCase().trim() : "";
|
||||
return `${req.ip}:${email}`;
|
||||
}
|
||||
});
|
||||
|
||||
app.use(
|
||||
cors({
|
||||
origin: env.CORS_ORIGIN === "*" ? true : env.CORS_ORIGIN.split(",").map((item) => item.trim()),
|
||||
credentials: true
|
||||
})
|
||||
);
|
||||
app.use(helmet());
|
||||
app.use(compression());
|
||||
app.use(
|
||||
express.json({
|
||||
limit: "2mb",
|
||||
verify: (req, _res, buffer) => {
|
||||
const request = req as express.Request;
|
||||
request.rawBody = buffer.toString("utf8");
|
||||
}
|
||||
})
|
||||
);
|
||||
app.use(morgan("dev"));
|
||||
app.use("/api", globalRateLimit);
|
||||
app.use("/api/auth/login", authRateLimit);
|
||||
app.use("/api/auth/refresh", authRateLimit);
|
||||
|
||||
app.get("/", (_req, res) => {
|
||||
res.json({
|
||||
name: "ProxPanel API",
|
||||
version: "1.0.0",
|
||||
docs: "/api/health"
|
||||
});
|
||||
});
|
||||
|
||||
app.use("/api/health", healthRoutes);
|
||||
app.use("/api/auth", authRoutes);
|
||||
app.use("/api/dashboard", dashboardRoutes);
|
||||
app.use("/api/resources", resourceRoutes);
|
||||
app.use("/api/billing", billingRoutes);
|
||||
app.use("/api/payments", paymentRoutes);
|
||||
app.use("/api/proxmox", proxmoxRoutes);
|
||||
app.use("/api/settings", settingsRoutes);
|
||||
app.use("/api/operations", operationsRoutes);
|
||||
app.use("/api/provisioning", provisioningRoutes);
|
||||
app.use("/api/backups", backupRoutes);
|
||||
app.use("/api/network", networkRoutes);
|
||||
app.use("/api/monitoring", monitoringRoutes);
|
||||
app.use("/api/client", clientRoutes);
|
||||
|
||||
app.use(notFoundHandler);
|
||||
app.use(errorHandler);
|
||||
|
||||
return app;
|
||||
}
|
||||
Reference in New Issue
Block a user