// OwlBoard - © Fred Boniface 2022 - Licensed under GPLv3 (or later) // Please see the included LICENSE file. Statically served fonts are // licensed separately, each folder contains a license file where a // different license applies. console.log('Initialising OwlBoard'); const mode = process.env.NODE_ENV || 'development'; // 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 log = require('./src/utils/log.utils'); 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: true, // Disable the `X-RateLimit-*` headers }); // Print version number: log.out(`app: Starting OwlBoard in ${mode} mode`, 'init'); log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - ` + `API versions: ${version.api}`, 'init'); // Express Error Handling: app.use((err: Error, req: Request, res, next) => { const statusCode = err.statuscode || 500; console.error(err.message, err.stack); 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); app.use('/api/v1/ldb', ldbRtr); app.use('/api/v1/kube', kubeRtr); app.use('/api/v1/find', findRtr); app.use('/api/v1/issue', issueRtr); app.use('/api/v1/stats', statRtr); app.use('/api/v1/register', regRtr); // Authented Routes app.use('/api/v1/ldbs', authenticate, ldbsRtr); app.use('/api/v1/pis', authenticate, pisRtr); 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: Error) =>{ if(!error) { log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, 'init'); log.out('app.listen: State - alive', 'init'); } else { log.out(`app.listen: Error occurred, server can't start ${error.message}`, 'err'); } });