2023-02-09 20:34:53 +00:00
// 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.
2023-02-16 10:39:19 +00:00
console . log ( ` Initialising OwlBoard ` )
2023-04-06 22:15:57 +01:00
const mode = process . env . NODE _ENV || "development"
2023-02-16 10:39:19 +00:00
2023-02-09 20:34:53 +00:00
// External Requires
const express = require ( 'express' ) ;
const app = express ( ) ;
2023-04-05 00:58:48 +01:00
// Middleware
2023-02-09 20:34:53 +00:00
const compression = require ( 'compression' )
2023-04-06 22:01:37 +01:00
const rateLimit = require ( 'express-rate-limit' )
2023-04-05 00:58:48 +01:00
const authenticate = require ( './src/middlewares/auth.middlewares' )
2023-02-09 20:34:53 +00:00
// Internal Requires
2023-04-07 14:39:45 +01:00
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
2023-04-21 21:28:13 +01:00
const pisRtr = require ( './src/routes/pis.routes' ) ; // /pis endpoints
2023-02-09 20:34:53 +00:00
// Set Server Configurations
const srvListen = process . env . OWL _SRV _LISTEN || "0.0.0.0"
const srvPort = process . env . OWL _SRV _PORT || 8460
2023-04-06 22:01:37 +01:00
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
} )
2023-02-09 20:34:53 +00:00
// Print version number:
2023-04-06 22:15:57 +01:00
log . out ( ` app: Starting OwlBoard in ${ mode } mode ` , "init" )
2023-03-30 21:10:39 +01:00
log . out ( ` app: Starting OwlBoard - Backend Version: ${ version . app } - API versions: ${ version . api } ` , "init" ) ;
2023-02-09 20:34:53 +00:00
// 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 ;
} ) ;
2023-04-05 14:13:13 +01:00
// Global Middleware:
2023-02-09 20:34:53 +00:00
app . use ( express . json ( ) ) ; //JSON Parsing for POST Requests
2023-02-16 21:25:19 +00:00
app . use ( compression ( ) ) // Compress API Data if supported by client
2023-04-06 22:01:37 +01:00
app . use ( limiter )
2023-02-09 20:34:53 +00:00
2023-04-05 00:58:48 +01:00
// Unauthenticated Routes
2023-02-09 20:34:53 +00:00
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 ) ;
2023-04-07 14:39:45 +01:00
app . use ( '/api/v1/stats' , statRtr ) ;
app . use ( '/api/v1/register' , regRtr ) ;
2023-04-21 21:28:13 +01:00
app . use ( '/api/v1/pis' , pisRtr )
2023-02-09 20:34:53 +00:00
2023-04-05 00:58:48 +01:00
// Authented Routes
app . use ( '/api/v1/ldbs' , authenticate )
2023-04-07 17:00:15 +01:00
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.
2023-04-05 00:58:48 +01:00
2023-04-06 22:15:57 +01:00
// Number of proxies:
2023-04-07 14:39:45 +01:00
app . set ( 'trust proxy' , 4 )
2023-04-06 22:15:57 +01:00
mode === "development"
2023-04-07 14:39:45 +01:00
? app . get ( '/api/v1/ip' , ( req , res ) => res . send ( req . ip ) )
2023-04-06 22:15:57 +01:00
: null
2023-02-09 20:34:53 +00:00
// Start Express
app . listen ( srvPort , srvListen , ( error ) => {
if ( ! error ) {
2023-03-30 21:10:39 +01:00
log . out ( ` app.listen: Listening on http:// ${ srvListen } : ${ srvPort } ` , "init" ) ;
log . out ( "app.listen: State - alive" , "init" )
2023-02-09 20:34:53 +00:00
} else {
2023-03-30 21:10:39 +01:00
log . out ( ` app.listen: Error occurred, server can't start ${ error } ` , "err" ) ;
2023-02-09 20:34:53 +00:00
}
} ) ;