113 lines
4.3 KiB
TypeScript
113 lines
4.3 KiB
TypeScript
// 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');
|
|
}
|
|
}); |