Files
Checkmate/server/src/app.js
T

85 lines
2.1 KiB
JavaScript
Raw Normal View History

2025-07-25 15:15:14 -07:00
import express from "express";
import path from "path";
2025-09-23 14:23:45 -07:00
import { responseHandler } from "./middleware/v1/responseHandler.js";
2025-07-25 15:15:14 -07:00
import cors from "cors";
import helmet from "helmet";
import compression from "compression";
2025-08-11 17:47:09 -04:00
import cookieParser from "cookie-parser";
2025-09-23 14:23:45 -07:00
import languageMiddleware from "./middleware/v1/languageMiddleware.js";
2025-07-25 15:15:14 -07:00
import swaggerUi from "swagger-ui-express";
2025-09-23 14:23:45 -07:00
import { handleErrors } from "./middleware/v1/handleErrors.js";
2025-07-25 15:15:14 -07:00
import { setupRoutes } from "./config/routes.js";
2025-09-23 14:23:45 -07:00
import { generalApiLimiter } from "./middleware/v1/rateLimiter.js";
import { sanitizeBody, sanitizeQuery } from "./middleware/v1/sanitization.js";
2025-07-28 12:00:09 -07:00
2025-07-28 14:37:18 -07:00
export const createApp = ({ services, controllers, envSettings, frontendPath, openApiSpec }) => {
const allowedOrigin = envSettings.clientHost;
2025-07-25 15:15:14 -07:00
const app = express();
2025-07-28 12:00:09 -07:00
app.use(generalApiLimiter);
2025-07-25 15:15:14 -07:00
// Static files
app.use(express.static(frontendPath));
// Response handler
app.use(responseHandler);
app.use(
cors({
origin: allowedOrigin,
methods: "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS",
allowedHeaders: "*",
credentials: true,
})
);
app.use(express.json());
2025-08-11 17:47:09 -04:00
app.use(cookieParser());
2025-08-11 17:39:08 -04:00
app.use(sanitizeBody());
app.use(sanitizeQuery());
2025-08-11 17:39:08 -04:00
2025-07-25 15:15:14 -07:00
app.use(
helmet({
hsts: false,
contentSecurityPolicy: {
useDefaults: true,
directives: {
upgradeInsecureRequests: null,
"script-src": ["'self'", "'unsafe-inline'", "'unsafe-eval'"],
"object-src": ["'none'"],
"base-uri": ["'self'"],
2025-07-25 15:15:14 -07:00
},
},
})
);
app.use(
compression({
level: 6,
threshold: 1024,
filter: (req, res) => {
if (req.headers["x-no-compression"]) {
return false;
}
return compression.filter(req, res);
},
})
);
app.use(languageMiddleware(services.stringService, services.translationService, services.settingsService));
// Swagger UI
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(openApiSpec));
app.use("/api/v1/health", (req, res) => {
res.json({
status: "OK",
});
});
// Main app routes
setupRoutes(app, controllers);
// FE routes
app.get("*", (req, res) => {
res.sendFile(path.join(frontendPath, "index.html"));
});
app.use(handleErrors);
return app;
};