97 lines
3.2 KiB
TypeScript
97 lines
3.2 KiB
TypeScript
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 profileRoutes from "./routes/profile.routes";
|
|
import adminUsersRoutes from "./routes/admin-users.routes";
|
|
import systemRoutes from "./routes/system.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("/api/profile", profileRoutes);
|
|
app.use("/api/admin", adminUsersRoutes);
|
|
app.use("/api/system", systemRoutes);
|
|
|
|
app.use(notFoundHandler);
|
|
app.use(errorHandler);
|
|
|
|
return app;
|
|
}
|