// OwlBoard - © Fred Boniface 2022-2023 - Licensed under GPLv3 (or later) // Please see the included LICENSE file const mode = process.env.NODE_ENV || "development"; // Logging const logger = require("./src/utils/logger.utils"); logger.logger.info("Logger Initialised"); // External Requires const express = require("express"); const app = express(); // Middleware const compression = require("compression"); const rateLimit = require("express-rate-limit"); const cors = require("cors"); const authenticate = require("./src/middlewares/auth.middlewares"); // Internal Requires const version = require("./src/configs/version.configs"); const listRtr = require("./src/routes/list.routes"); const ldbRtr = require("./src/routes/ldb.routes"); const ldbsRtr = require("./src/routes/ldbs.routes"); const kubeRtr = require("./src/routes/kube.routes"); const findRtr = require("./src/routes/find.routes"); const issueRtr = require("./src/routes/issue.routes"); const statRtr = require("./src/routes/stats.routes"); const regRtr = require("./src/routes/registration.routes"); const pisRtr = require("./src/routes/pis.routes"); const trainRtr = require("./src/routes/train.routes"); const pis2Rtr = require("./src/routes/pis2.routes"); // API Version 2 Routes const ref2Rtr = require("./src/routes/ref2.routes"); // API Version 2 Routes const live2Rtr = require("./src/routes/live2.routes"); // API Version 2 Routes const tt2Rtr = require("./src/routes/timetable2.routes"); // API Version 2 const user2Rtr = require("./src/routes/user2.routes"); // API Version 2 Routes const miscRtr = require("./src/routes/misc.routes"); // Non-Public API Routes // Set Server Configurations const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0"; const srvPort = process.env.OWL_SRV_PORT || 8460; const limiter = rateLimit({ windowMs: 15 * (60 * 1000), // 15 minutes max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers }); // Print version number: logger.logger.info(`Starting version ${version.app} in ${mode} mode`); // Remove X-Powered-By header: app.disable("x-powered-by"); // Express Error Handling: app.use((err, req, res, next) => { const statusCode = err.statuscode || 500; logger.logger.error(err, "Express Error"); res.status(statusCode).json({ message: err.message }); return; }); // Global Middleware: app.use( cors({ origin: "*", //[/\.owlboard\.info$/, 'localhost:5173', 'localhost:4173'] }) ); app.use(express.json()); //JSON Parsing for POST Requests app.use(compression()); // Compress API Data if supported by client app.use(limiter); app.use(authenticate); // 2023 Rationalisation Routes (/api/v2, /misc) app.use("/api/v2/pis", pis2Rtr); // API Version 2 app.use("/api/v2/live", live2Rtr); // API Version 2 app.use("/api/v2/ref", ref2Rtr); // API Version 2 app.use("/api/v2/timetable", tt2Rtr); // API Version 2 app.use("/api/v2/user", user2Rtr); // API Version 2 app.use("/misc", miscRtr); // Non public-api endpoints (Stats, Issue, etc.) // Unauthenticated Routes //app.use("/api/v1/list", listRtr); - Remove v1 List API - list.routes //app.use("/api/v1/ldb", ldbRtr); - Remove v1 LDB API //app.use("/api/v1/kube", kubeRtr); - Remove v1 Kube API //app.use("/api/v1/find", findRtr); - Remove v1 Find API //app.use("/api/v1/issue", issueRtr); - Remove v1 Issue API //app.use("/api/v1/stats", statRtr); - Remove v1 Stats API //app.use("/api/v1/register", regRtr); - Remove v1 Register API // Authented Routes //app.use("/api/v1/ldbs", authenticate, ldbsRtr); - Remove v1 LDBS API //app.use("/api/v1/pis", authenticate, pisRtr); - Remove v1 PIS API app.use("/api/v1/auth/test", authenticate, (req, res) => res.status(200).json({ status: "ok", message: "Authentication successful", }) ); // Returns 401 if auth failed, 200 if successful. app.use("/api/v1/train", authenticate, trainRtr); // Number of proxies: app.set("trust proxy", 4); mode === "development" ? app.get("/api/v1/ip", (req, res) => res.send(req.ip)) : null; // Start Express app.listen(srvPort, srvListen, (error) => { if (!error) { logger.logger.info(`Listening on http://${srvListen}:${srvPort}`); } else { logger.logger.error(error, `Error starting server`); } });