// 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. /* global process */ 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 authenticate= require('./src/middlewares/auth.middlewares') // Internal Requires const log = require('./src/utils/log.utils') // Log Helper const version = require('./src/configs/version.configs') // Version Strings const listRtr = require('./src/routes/list.routes') // /list endpoints const ldbRtr = require('./src/routes/ldb.routes') // /ldb endpoints const kubeRtr = require('./src/routes/kube.routes') // /kube endpoints const findRtr = require('./src/routes/find.routes') // /find endpoints const issueRtr = require('./src/routes/issue.routes') // /issue endpoints const statRtr = require('./src/routes/stats.routes') // /stat endpoints const regRtr = require('./src/routes/registration.routes') // /registration endpoints const pisRtr = require('./src/routes/pis.routes') // /pis endpoints // 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') // Test for required vars: // const varTest = require('./src/utils/varTest.utils'); // var startTest = await varTest.varTest(); //console.log("Required Vars Missing:", startTest.missing_required); //console.log("Desired Vars Missing:", startTest.missing_desired); // if startTest.pass == false // console.log("Unable to start, missing required vars") // exit app // Express Error Handling: app.use((err, req, 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(express.json()) //JSON Parsing for POST Requests app.use(compression()) // Compress API Data if supported by client app.use(limiter) // 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, (req, res) => res.status(501).json({status: 'Not Implemented', message: 'This feature is not yet implemented due to upstream issues'})) 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. // 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) { 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}`, 'err') } })