pis #12

Merged
fred.boniface merged 95 commits from pis into main 2023-05-06 21:54:51 +01:00
42 changed files with 512 additions and 530 deletions
Showing only changes of commit 7c76d2aa5f - Show all commits

View File

@ -25,7 +25,7 @@ module.exports = {
], ],
'semi': [ 'semi': [
'error', 'error',
'never' 'always'
] ]
} }
} };

92
app.js
View File

@ -6,44 +6,44 @@
/* global process */ /* global process */
console.log('Initialising OwlBoard') console.log('Initialising OwlBoard');
const mode = process.env.NODE_ENV || 'development' const mode = process.env.NODE_ENV || 'development';
// External Requires // External Requires
const express = require('express') const express = require('express');
const app = express() const app = express();
// Middleware // Middleware
const compression = require('compression') const compression = require('compression');
const rateLimit = require('express-rate-limit') const rateLimit = require('express-rate-limit');
const authenticate= require('./src/middlewares/auth.middlewares') const authenticate= require('./src/middlewares/auth.middlewares');
// Internal Requires // Internal Requires
const log = require('./src/utils/log.utils') // Log Helper const log = require('./src/utils/log.utils'); // Log Helper
const version = require('./src/configs/version.configs') // Version Strings const version = require('./src/configs/version.configs'); // Version Strings
const listRtr = require('./src/routes/list.routes') // /list endpoints const listRtr = require('./src/routes/list.routes'); // /list endpoints
const ldbRtr = require('./src/routes/ldb.routes') // /ldb endpoints const ldbRtr = require('./src/routes/ldb.routes'); // /ldb endpoints
const kubeRtr = require('./src/routes/kube.routes') // /kube endpoints const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints
const findRtr = require('./src/routes/find.routes') // /find endpoints const findRtr = require('./src/routes/find.routes'); // /find endpoints
const issueRtr = require('./src/routes/issue.routes') // /issue endpoints const issueRtr = require('./src/routes/issue.routes'); // /issue endpoints
const statRtr = require('./src/routes/stats.routes') // /stat endpoints const statRtr = require('./src/routes/stats.routes'); // /stat endpoints
const regRtr = require('./src/routes/registration.routes') // /registration endpoints const regRtr = require('./src/routes/registration.routes'); // /registration endpoints
const pisRtr = require('./src/routes/pis.routes') // /pis endpoints const pisRtr = require('./src/routes/pis.routes'); // /pis endpoints
// Set Server Configurations // Set Server Configurations
const srvListen = process.env.OWL_SRV_LISTEN || '0.0.0.0' const srvListen = process.env.OWL_SRV_LISTEN || '0.0.0.0';
const srvPort = process.env.OWL_SRV_PORT || 8460 const srvPort = process.env.OWL_SRV_PORT || 8460;
const limiter = rateLimit({ const limiter = rateLimit({
windowMs: 15 * (60 * 1000), // 15 minutes windowMs: 15 * (60 * 1000), // 15 minutes
max: 100, // Limit each IP to 100 requests per `window` (here, per 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 standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
legacyHeaders: true, // Disable the `X-RateLimit-*` headers legacyHeaders: true, // Disable the `X-RateLimit-*` headers
}) });
// Print version number: // Print version number:
log.out(`app: Starting OwlBoard in ${mode} mode`, 'init') log.out(`app: Starting OwlBoard in ${mode} mode`, 'init');
log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, 'init') log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, 'init');
// Test for required vars: // Test for required vars:
// const varTest = require('./src/utils/varTest.utils'); // const varTest = require('./src/utils/varTest.utils');
@ -56,43 +56,43 @@ log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions
// Express Error Handling: // Express Error Handling:
app.use((err, req, res, next) => { app.use((err, req, res, next) => {
const statusCode = err.statuscode || 500 const statusCode = err.statuscode || 500;
console.error(err.message, err.stack) console.error(err.message, err.stack);
res.status(statusCode).json({'message': err.message}) res.status(statusCode).json({'message': err.message});
return return;
}) });
// Global Middleware: // Global Middleware:
app.use(express.json()) //JSON Parsing for POST Requests app.use(express.json()); //JSON Parsing for POST Requests
app.use(compression()) // Compress API Data if supported by client app.use(compression()); // Compress API Data if supported by client
app.use(limiter) app.use(limiter);
// Unauthenticated Routes // Unauthenticated Routes
app.use('/api/v1/list', listRtr) app.use('/api/v1/list', listRtr);
app.use('/api/v1/ldb', ldbRtr) app.use('/api/v1/ldb', ldbRtr);
app.use('/api/v1/kube', kubeRtr) app.use('/api/v1/kube', kubeRtr);
app.use('/api/v1/find', findRtr) app.use('/api/v1/find', findRtr);
app.use('/api/v1/issue', issueRtr) app.use('/api/v1/issue', issueRtr);
app.use('/api/v1/stats', statRtr) app.use('/api/v1/stats', statRtr);
app.use('/api/v1/register', regRtr) app.use('/api/v1/register', regRtr);
// Authented Routes // 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/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/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/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: // Number of proxies:
app.set('trust proxy', 4) app.set('trust proxy', 4);
mode === 'development' mode === 'development'
? app.get('/api/v1/ip', (req, res) => res.send(req.ip)) ? app.get('/api/v1/ip', (req, res) => res.send(req.ip))
: null : null;
// Start Express // Start Express
app.listen(srvPort, srvListen, (error) =>{ app.listen(srvPort, srvListen, (error) =>{
if(!error) { if(!error) {
log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, 'init') log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, 'init');
log.out('app.listen: State - alive', 'init') log.out('app.listen: State - alive', 'init');
} else { } else {
log.out(`app.listen: Error occurred, server can't start ${error}`, 'err') log.out(`app.listen: Error occurred, server can't start ${error}`, 'err');
} }
}) });

View File

@ -1,4 +1,4 @@
module.exports = valid module.exports = valid;
const valid = [ const valid = [
'owlboard.info', 'owlboard.info',
@ -33,4 +33,4 @@ const valid = [
'tpeexpress.co.uk', 'tpeexpress.co.uk',
'tfwrail.wales', 'tfwrail.wales',
'wmtrains.co.uk', 'wmtrains.co.uk',
] ];

View File

@ -1,4 +1,4 @@
module.exports = statusCodes module.exports = statusCodes;
const statusCodes = { const statusCodes = {
700: 'no authentication attempt', 700: 'no authentication attempt',
@ -9,4 +9,4 @@ const statusCodes = {
801: 'unable to fetch location data', 801: 'unable to fetch location data',
900: 'invalid request format', 900: 'invalid request format',
950: 'upstream server error', 950: 'upstream server error',
} };

View File

@ -1,6 +1,6 @@
const version = { const version = {
api: ['/api/v1/',], api: ['/api/v1/',],
app: '2.0.0' app: '2.0.0'
} };
module.exports = version module.exports = version;

View File

@ -1,52 +1,52 @@
const find = require('../services/find.services') const find = require('../services/find.services');
async function findName(req, res, next){ async function findName(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await find.name(id)) res.json(await find.name(id));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
async function findCrs(req, res, next){ async function findCrs(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await find.crs(id)) res.json(await find.crs(id));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
async function findNlc(req, res, next){ async function findNlc(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await find.nlc(id)) res.json(await find.nlc(id));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
async function findTiploc(req, res, next){ async function findTiploc(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await find.tiploc(id)) res.json(await find.tiploc(id));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
async function findStanox(req, res, next){ async function findStanox(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await find.stanox(id)) res.json(await find.stanox(id));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
module.exports = { module.exports = {
@ -55,4 +55,4 @@ module.exports = {
findNlc, findNlc,
findTiploc, findTiploc,
findStanox findStanox
} };

View File

@ -1,14 +1,14 @@
const issue = require('../services/issue.services') const issue = require('../services/issue.services');
async function post(req, res, next){ async function post(req, res, next){
try { try {
res.json(await issue.processor(req.body)) res.json(await issue.processor(req.body));
} catch (err) { } catch (err) {
console.error('Controller Error', err.message) console.error('Controller Error', err.message);
next(err) next(err);
} }
} }
module.exports = { module.exports = {
post post
} };

View File

@ -1,30 +1,30 @@
const kube = require('../services/kube.services') const kube = require('../services/kube.services');
async function getAlive(req, res, next){ async function getAlive(req, res, next){
try { try {
var state = kube.getAlive() var state = kube.getAlive();
res.status((await state).code).send((await state).state) res.status((await state).code).send((await state).state);
} catch (err) { } catch (err) {
res.status('503').send({state: 'error'}) res.status('503').send({state: 'error'});
} }
} }
async function getReady(req, res, next){ async function getReady(req, res, next){
try { try {
res.json(await kube.getReady(req.body)) res.json(await kube.getReady(req.body));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
async function getTime(req, res, next){ async function getTime(req, res, next){
try { try {
res.json(await kube.getTime(req.body)) res.json(await kube.getTime(req.body));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
err.status = 503 err.status = 503;
next(err) next(err);
} }
} }
@ -32,4 +32,4 @@ module.exports = {
getAlive, getAlive,
getReady, getReady,
getTime getTime
} };

View File

@ -1,16 +1,16 @@
const ldb = require('../services/ldb.services') const ldb = require('../services/ldb.services');
async function get(req, res, next){ async function get(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await ldb.get(id)) res.json(await ldb.get(id));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
err.status = 500 err.status = 500;
next(err) next(err);
} }
} }
module.exports = { module.exports = {
get get
} };

View File

@ -1,16 +1,16 @@
const ldb = require('../services/ldb.services') const ldb = require('../services/ldb.services');
async function get(req, res, next){ async function get(req, res, next){
try { try {
var id = req.params.id var id = req.params.id;
res.json(await ldb.get(id, true)) res.json(await ldb.get(id, true));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
err.status = 500 err.status = 500;
next(err) next(err);
} }
} }
module.exports = { module.exports = {
get get
} };

View File

@ -1,32 +1,32 @@
const list = require('../services/list.services') const list = require('../services/list.services');
async function getStations(req, res, next){ async function getStations(req, res, next){
try { try {
res.json(await list.getStations(req.body)) res.json(await list.getStations(req.body));
} catch (err) { } catch (err) {
console.error('Controller Error', err.message) console.error('Controller Error', err.message);
err.status = 500 err.status = 500;
next(err) next(err);
} }
} }
async function getCorpus(req, res, next){ async function getCorpus(req, res, next){
try { try {
res.json(await list.getCorpus(req.body)) res.json(await list.getCorpus(req.body));
} catch (err) { } catch (err) {
console.error('Controller Error', err.message) console.error('Controller Error', err.message);
err.status = 500 err.status = 500;
next(err) next(err);
} }
} }
async function hits(req, res, next) { async function hits(req, res, next) {
try { try {
res.json(await list.hits()) res.json(await list.hits());
} catch (err) { } catch (err) {
console.error('Controller Error', err) console.error('Controller Error', err);
err.status = 500 err.status = 500;
next(err) next(err);
} }
} }
@ -34,4 +34,4 @@ module.exports = {
getStations, getStations,
getCorpus, getCorpus,
hits hits
} };

View File

@ -1,17 +1,17 @@
const pis = require('../services/pis.services') const pis = require('../services/pis.services');
async function byOrigDest(req, res, next){ async function byOrigDest(req, res, next){
try { try {
let start = req.params.start let start = req.params.start;
let end = req.params.end let end = req.params.end;
res.json(await pis.findPisByOrigDest(start,end)) res.json(await pis.findPisByOrigDest(start,end));
} catch (err) { } catch (err) {
console.error('Unknown Error', err.message) console.error('Unknown Error', err.message);
next(err) next(err);
} }
} }
module.exports = { module.exports = {
byOrigDest byOrigDest
} };

View File

@ -1,26 +1,26 @@
const reg = require('../services/registration.services') const reg = require('../services/registration.services');
async function register(req, res, next) { async function register(req, res, next) {
try { try {
let response = await reg.regUser(req.body) let response = await reg.regUser(req.body);
res.status(response.status).json(response) res.status(response.status).json(response);
} catch (err) { } catch (err) {
console.error('Controller Error', err.message) console.error('Controller Error', err.message);
next(err) next(err);
} }
} }
async function request(req, res, next) { async function request(req, res, next) {
try { try {
let response = await reg.createRegKey(req.body) let response = await reg.createRegKey(req.body);
res.status(response.status).json(response) res.status(response.status).json(response);
} catch (err) { } catch (err) {
console.error(err) console.error(err);
next(err) next(err);
} }
} }
module.exports = { module.exports = {
register, register,
request request
} };

View File

@ -1,15 +1,15 @@
const stat = require('../services/stats.services') const stat = require('../services/stats.services');
async function get(req, res, next) { async function get(req, res, next) {
try { try {
res.json(await stat.hits()) res.json(await stat.hits());
} catch (err) { } catch (err) {
console.error('Controller Error', err) console.error('Controller Error', err);
err.status = 500 err.status = 500;
next(err) next(err);
} }
} }
module.exports = { module.exports = {
get get
} };

View File

@ -1,27 +1,27 @@
const utils = require('../utils/auth.utils') const utils = require('../utils/auth.utils');
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
module.exports = async function authCheck(req, res, next) { module.exports = async function authCheck(req, res, next) {
log.out('authMiddlewares: Checking authentication', 'dbug') log.out('authMiddlewares: Checking authentication', 'dbug');
try { try {
var uuid = req.headers.uuid var uuid = req.headers.uuid;
} catch(err) { } catch(err) {
log.out('authMiddlewares: No authentication attempted', 'dbug') log.out('authMiddlewares: No authentication attempted', 'dbug');
err.status = 401 err.status = 401;
return next(err) return next(err);
} }
try { try {
var result = await utils.isAuthed(uuid) || false var result = await utils.isAuthed(uuid) || false;
if (!result) { if (!result) {
const err = new Error('Unauthorised') const err = new Error('Unauthorised');
err.status = 401 err.status = 401;
log.out('authMiddlewares: Authentication attempted with incorrect key', 'warn') log.out('authMiddlewares: Authentication attempted with incorrect key', 'warn');
return next(err) return next(err);
} else { } else {
log.out('authMiddlewares: User authenticated', 'dbug') log.out('authMiddlewares: User authenticated', 'dbug');
return next() return next();
} }
} catch(err) { } catch(err) {
return next(err) return next(err);
} }
} };

View File

@ -1,12 +1,12 @@
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
module.exports = async function requireJson(req, res, next) { module.exports = async function requireJson(req, res, next) {
if (req.headers['content-type'] !== 'application/json') { if (req.headers['content-type'] !== 'application/json') {
log.out('requireJson.middlewares: Bad Request: Not in JSON format') log.out('requireJson.middlewares: Bad Request: Not in JSON format');
res.status(400).send({status: 400, message: 'Server requires JSON'}) res.status(400).send({status: 400, message: 'Server requires JSON'});
} else { } else {
next() next();
} }
} };
// Possibly want to check the req type? // Possibly want to check the req type?

View File

@ -1,6 +1,6 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const findController = require('../controllers/find.controllers') const findController = require('../controllers/find.controllers');
/* GET programming languages. */ /* GET programming languages. */
//router.get('/', programmingLanguagesController.get); //router.get('/', programmingLanguagesController.get);
@ -14,10 +14,10 @@ const findController = require('../controllers/find.controllers')
/* DELETE programming language */ /* DELETE programming language */
//router.delete('/:id', programmingLanguagesController.remove); //router.delete('/:id', programmingLanguagesController.remove);
router.get('/name/:id', findController.findName) router.get('/name/:id', findController.findName);
router.get('/crs/:id', findController.findCrs) router.get('/crs/:id', findController.findCrs);
router.get('/nlc/:id', findController.findNlc) router.get('/nlc/:id', findController.findNlc);
router.get('/tiploc/:id', findController.findTiploc) router.get('/tiploc/:id', findController.findTiploc);
router.get('/stanox/:id', findController.findStanox) router.get('/stanox/:id', findController.findStanox);
module.exports = router module.exports = router;

View File

@ -1,7 +1,7 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const issueController = require('../controllers/issue.controllers') const issueController = require('../controllers/issue.controllers');
router.post('/', issueController.post) router.post('/', issueController.post);
module.exports = router module.exports = router;

View File

@ -1,9 +1,9 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const kubeController = require('../controllers/kube.controllers') const kubeController = require('../controllers/kube.controllers');
router.get('/alive', kubeController.getAlive) router.get('/alive', kubeController.getAlive);
router.get('/ready', kubeController.getReady) router.get('/ready', kubeController.getReady);
router.get('/time', kubeController.getTime) router.get('/time', kubeController.getTime);
module.exports = router module.exports = router;

View File

@ -1,6 +1,6 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const ldbController = require('../controllers/ldb.controllers') const ldbController = require('../controllers/ldb.controllers');
/* GET programming languages. */ /* GET programming languages. */
//router.get('/', programmingLanguagesController.get); //router.get('/', programmingLanguagesController.get);
@ -14,6 +14,6 @@ const ldbController = require('../controllers/ldb.controllers')
/* DELETE programming language */ /* DELETE programming language */
//router.delete('/:id', programmingLanguagesController.remove); //router.delete('/:id', programmingLanguagesController.remove);
router.get('/:id', ldbController.get) router.get('/:id', ldbController.get);
module.exports = router module.exports = router;

View File

@ -1,6 +1,6 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const ldbsController = require('../controllers/ldbs.controllers') const ldbsController = require('../controllers/ldbs.controllers');
/* GET programming languages. */ /* GET programming languages. */
//router.get('/', programmingLanguagesController.get); //router.get('/', programmingLanguagesController.get);
@ -14,6 +14,6 @@ const ldbsController = require('../controllers/ldbs.controllers')
/* DELETE programming language */ /* DELETE programming language */
//router.delete('/:id', programmingLanguagesController.remove); //router.delete('/:id', programmingLanguagesController.remove);
router.get('/:id', ldbsController.get) router.get('/:id', ldbsController.get);
module.exports = router module.exports = router;

View File

@ -1,6 +1,6 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const listController = require('../controllers/list.controllers') const listController = require('../controllers/list.controllers');
/* GET programming languages. */ /* GET programming languages. */
//router.get('/', programmingLanguagesController.get); //router.get('/', programmingLanguagesController.get);
@ -14,7 +14,7 @@ const listController = require('../controllers/list.controllers')
/* DELETE programming language */ /* DELETE programming language */
//router.delete('/:id', programmingLanguagesController.remove); //router.delete('/:id', programmingLanguagesController.remove);
router.get('/stations', listController.getStations) router.get('/stations', listController.getStations);
router.get('/corpus', listController.getCorpus) router.get('/corpus', listController.getCorpus);
module.exports = router module.exports = router;

View File

@ -1,7 +1,7 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const pisController = require('../controllers/pis.controllers') const pisController = require('../controllers/pis.controllers');
router.get('/origdest/:start/:end', pisController.byOrigDest) router.get('/origdest/:start/:end', pisController.byOrigDest);
module.exports = router module.exports = router;

View File

@ -1,8 +1,8 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const regController = require('../controllers/registration.controllers') const regController = require('../controllers/registration.controllers');
router.post('/request', regController.request) router.post('/request', regController.request);
router.post('/register', regController.register) router.post('/register', regController.register);
module.exports = router module.exports = router;

View File

@ -1,8 +1,8 @@
const express = require('express') const express = require('express');
const router = express.Router() const router = express.Router();
const statsController = require('../controllers/stats.controllers') const statsController = require('../controllers/stats.controllers');
router.get('/', statsController.get) router.get('/', statsController.get);
module.exports = router module.exports = router;

View File

@ -1,76 +1,76 @@
/* global process */ /* global process */
const log = require('../utils/log.utils') // Log Helper const log = require('../utils/log.utils'); // Log Helper
const dbUser = process.env.OWL_DB_USER || 'owl' const dbUser = process.env.OWL_DB_USER || 'owl';
const dbPass = process.env.OWL_DB_PASS || 'twittwoo' const dbPass = process.env.OWL_DB_PASS || 'twittwoo';
const dbName = process.env.OWL_DB_NAME || 'owlboard' const dbName = process.env.OWL_DB_NAME || 'owlboard';
const dbPort = process.env.OWL_DB_PORT || 27017 const dbPort = process.env.OWL_DB_PORT || 27017;
const dbHost = process.env.OWL_DB_HOST || 'localhost' const dbHost = process.env.OWL_DB_HOST || 'localhost';
const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}` const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}`;
const { MongoClient } = require('mongodb') const { MongoClient } = require('mongodb');
const client = new MongoClient(uri) const client = new MongoClient(uri);
const db = client.db(dbName) const db = client.db(dbName);
async function query(collection, query){ async function query(collection, query){
await client.connect() await client.connect();
log.out(`dbAccess.query: Connecting to collection: '${collection}'`, 'info') log.out(`dbAccess.query: Connecting to collection: '${collection}'`, 'info');
var qcoll = db.collection(collection) var qcoll = db.collection(collection);
var qcursor = qcoll.find(query) var qcursor = qcoll.find(query);
qcursor.project({_id: 0}) qcursor.project({_id: 0});
log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}`, 'info') log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}`, 'info');
increment(collection) increment(collection);
return (await qcursor.toArray()) return (await qcursor.toArray());
} }
async function increment(target) { async function increment(target) {
log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info') log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info');
await client.connect() await client.connect();
let col = db.collection('meta') let col = db.collection('meta');
let update = {} let update = {};
update[target] = 1 update[target] = 1;
col.updateOne({target: 'counters'}, {$inc:update}) col.updateOne({target: 'counters'}, {$inc:update});
} }
async function addUser(uuid, domain) { // Needs testing async function addUser(uuid, domain) { // Needs testing
log.out('dbAccess.addUser: Adding user to database') log.out('dbAccess.addUser: Adding user to database');
let doc = {uuid: uuid, domain: domain, atime: new Date} let doc = {uuid: uuid, domain: domain, atime: new Date};
await client.connect() await client.connect();
let col = db.collection('users') let col = db.collection('users');
let res = await col.insertOne(doc) let res = await col.insertOne(doc);
if (res.insertedId) { if (res.insertedId) {
return true return true;
} }
return false return false;
} }
async function addRegReq(uuid, domain) { // Needs testing async function addRegReq(uuid, domain) { // Needs testing
log.out('dbAccess.addRegReq: Adding registration request') log.out('dbAccess.addRegReq: Adding registration request');
let doc = {uuid: uuid, time: new Date, domain: domain} let doc = {uuid: uuid, time: new Date, domain: domain};
await client.connect() await client.connect();
let col = db.collection('registrations') let col = db.collection('registrations');
let res = col.insertOne(doc) let res = col.insertOne(doc);
return res return res;
} }
async function userAtime(uuid) { // Needs testing async function userAtime(uuid) { // Needs testing
log.out('dbAccess.userAtime: Updating access time for user') log.out('dbAccess.userAtime: Updating access time for user');
let q = {uuid: uuid} let q = {uuid: uuid};
let n = {$set: {uuid: uuid, atime: new Date}} let n = {$set: {uuid: uuid, atime: new Date}};
await client.connect() await client.connect();
let col = db.collection('users') let col = db.collection('users');
let res = col.updateOne(q, n, {upsert: true}) let res = col.updateOne(q, n, {upsert: true});
return res return res;
} }
// Deletes one single registration request entry from the DB // Deletes one single registration request entry from the DB
async function delRegReq(uuid) { async function delRegReq(uuid) {
log.out('dbAccess.delRegReq: Deleting a Registration Request') log.out('dbAccess.delRegReq: Deleting a Registration Request');
let collection = 'registrations' let collection = 'registrations';
await client.connect() await client.connect();
let col = db.collection(collection) let col = db.collection(collection);
col.deleteOne({uuid: uuid}) col.deleteOne({uuid: uuid});
} }
module.exports = { module.exports = {
@ -80,4 +80,4 @@ module.exports = {
userAtime, userAtime,
addRegReq, addRegReq,
delRegReq delRegReq
} };

View File

@ -1,53 +1,53 @@
// Parse and return a find request // Parse and return a find request
const log = require('../utils/log.utils') // Log Helper const log = require('../utils/log.utils'); // Log Helper
const db = require('../services/dbAccess.services') const db = require('../services/dbAccess.services');
const san = require('../utils/sanitizer.utils') const san = require('../utils/sanitizer.utils');
// DB Query: query(collection, query) // DB Query: query(collection, query)
// Define collection as all queries are for the "corpus" collection. // Define collection as all queries are for the "corpus" collection.
const col = 'corpus' const col = 'corpus';
async function name(id){ async function name(id){
log.out(`findServices.name: Finding station name: ${id}`, 'info') log.out(`findServices.name: Finding station name: ${id}`, 'info');
var name = san.cleanApiEndpointTxt(id.toUpperCase()) var name = san.cleanApiEndpointTxt(id.toUpperCase());
let query = {NLCDESC: name} let query = {NLCDESC: name};
//var data = await db.query(col,query) //var data = await db.query(col,query)
return await db.query(col,query) return await db.query(col,query);
} }
async function crs(id){ async function crs(id){
log.out(`findServices.crs: Finding crs: ${id}`, 'info') log.out(`findServices.crs: Finding crs: ${id}`, 'info');
var crs = san.cleanApiEndpointTxt(id.toUpperCase()) var crs = san.cleanApiEndpointTxt(id.toUpperCase());
let query = {'3ALPHA': crs} let query = {'3ALPHA': crs};
//var data = await db.query(col,query) //var data = await db.query(col,query)
return await db.query(col,query) return await db.query(col,query);
} }
async function nlc(id){ async function nlc(id){
log.out(`findServices.nlc: Finding nlc: ${id}`, 'info') log.out(`findServices.nlc: Finding nlc: ${id}`, 'info');
var nlc = san.cleanApiEndpointNum(id) var nlc = san.cleanApiEndpointNum(id);
let query = {NLC: parseInt(nlc)} let query = {NLC: parseInt(nlc)};
log.out(`findServices.nlc: NLC Converted to int: ${query}`, 'info') log.out(`findServices.nlc: NLC Converted to int: ${query}`, 'info');
//var data = await db.query(col,query) //var data = await db.query(col,query)
return await db.query(col,query) return await db.query(col,query);
} }
async function tiploc(id){ async function tiploc(id){
log.out(`findServices.tiploc: Finding tiploc: ${id}`, 'info') log.out(`findServices.tiploc: Finding tiploc: ${id}`, 'info');
var tiploc = san.cleanApiEndpointTxt(id.toUpperCase()) var tiploc = san.cleanApiEndpointTxt(id.toUpperCase());
let query = {TIPLOC: tiploc} let query = {TIPLOC: tiploc};
//var data = await db.query(col,query) //var data = await db.query(col,query)
return await db.query(col,query) return await db.query(col,query);
} }
async function stanox(id){ async function stanox(id){
log.out(`findServices.stanox: Finding stanox: ${id}`, 'info') log.out(`findServices.stanox: Finding stanox: ${id}`, 'info');
var stanox = san.cleanApiEndpointNum(id) var stanox = san.cleanApiEndpointNum(id);
let query = {STANOX: String(stanox)} let query = {STANOX: String(stanox)};
//var data = await db.query(col,query) //var data = await db.query(col,query)
return await db.query(col,query) return await db.query(col,query);
} }
module.exports = { module.exports = {
@ -56,4 +56,4 @@ module.exports = {
nlc, nlc,
tiploc, tiploc,
stanox stanox
} };

View File

@ -1,35 +1,35 @@
/* eslint-disable no-useless-escape */ /* eslint-disable no-useless-escape */
/* global process */ /* global process */
const axios = require('axios') const axios = require('axios');
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
async function processor(data) { async function processor(data) {
log.out('issueService.processor: Issue received', 'info') log.out('issueService.processor: Issue received', 'info');
let out = {} let out = {};
out.title = data.subject.replace(/<[^>]+>|[\*\$]/g, '') out.title = data.subject.replace(/<[^>]+>|[\*\$]/g, '');
out.body = data.msg.replace(/<[^>]+>|[\*\$]/g, '') out.body = data.msg.replace(/<[^>]+>|[\*\$]/g, '');
return await sendToGitea(out) return await sendToGitea(out);
} }
async function sendToGitea(body) { async function sendToGitea(body) {
let key = process.env.OWL_GIT_ISSUEBOT let key = process.env.OWL_GIT_ISSUEBOT;
let url = process.env.OWL_GIT_APIENDPOINT let url = process.env.OWL_GIT_APIENDPOINT;
let opts = { let opts = {
headers: { headers: {
Authorization: key Authorization: key
} }
} };
var res = await axios.post(url, body, opts) var res = await axios.post(url, body, opts);
// Need to read the output from the POST and pass the result upwards to the client. // Need to read the output from the POST and pass the result upwards to the client.
if (res.status == 201) { if (res.status == 201) {
log.out('issueService.sendToGitea: Issue sent to Gitea', 'info') log.out('issueService.sendToGitea: Issue sent to Gitea', 'info');
return {status: res.status,message:'issue created'} return {status: res.status,message:'issue created'};
} else { } else {
log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, 'err') log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, 'err');
return {status: res.status,message:'issue not created'} return {status: res.status,message:'issue not created'};
} }
} }
module.exports = { module.exports = {
processor processor
} };

View File

@ -1,28 +1,28 @@
const testing = require('../services/mail.services') const testing = require('../services/mail.services');
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
async function getAlive(){ async function getAlive(){
log.out('kubeServices.getAlive: alive hook checked', 'info') log.out('kubeServices.getAlive: alive hook checked', 'info');
return {code: 200, state: {state: 'alive',noise: 'twit-twoo'}} return {code: 200, state: {state: 'alive',noise: 'twit-twoo'}};
} }
async function getReady(){ async function getReady(){
log.out('kubeServices.getReady: ready hook checked', 'info') log.out('kubeServices.getReady: ready hook checked', 'info');
testing.send({ testing.send({
to: 'fred@fjla.uk', to: 'fred@fjla.uk',
subject: 'OwlBoard Test', subject: 'OwlBoard Test',
txt: 'This is a test message from OwlBoard (testing)' txt: 'This is a test message from OwlBoard (testing)'
}) });
return 'not_implemented' return 'not_implemented';
} }
async function getTime(){ async function getTime(){
var now = new Date() var now = new Date();
return {responseGenerated: now} return {responseGenerated: now};
} }
module.exports = { module.exports = {
getAlive, getAlive,
getReady, getReady,
getTime getTime
} };

View File

@ -1,67 +1,67 @@
/* global process */ /* global process */
// Parse and return an LDB Request // Parse and return an LDB Request
const log = require('../utils/log.utils') // Log Helper const log = require('../utils/log.utils'); // Log Helper
const ldb = require('ldbs-json') const ldb = require('ldbs-json');
const util = require('../utils/ldb.utils') const util = require('../utils/ldb.utils');
const san = require('../utils/sanitizer.utils') const san = require('../utils/sanitizer.utils');
const db = require('../services/dbAccess.services') const db = require('../services/dbAccess.services');
const ldbKey = process.env.OWL_LDB_KEY const ldbKey = process.env.OWL_LDB_KEY;
const ldbsvKey = process.env.OWL_LDB_SVKEY const ldbsvKey = process.env.OWL_LDB_SVKEY;
async function get(id, staff=false){ async function get(id, staff=false){
const cleanId = san.cleanApiEndpointTxt(id) const cleanId = san.cleanApiEndpointTxt(id);
const obj = await util.checkCrs(cleanId) const obj = await util.checkCrs(cleanId);
try { try {
const crs = obj[0]['3ALPHA'] const crs = obj[0]['3ALPHA'];
log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, 'info') log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, 'info');
if (staff) { if (staff) {
const data = arrDepBoardStaff(crs) const data = arrDepBoardStaff(crs);
db.increment('ldbsvws') db.increment('ldbsvws');
return await data return await data;
} else { } else {
const data = arrDepBoard(crs) const data = arrDepBoard(crs);
db.increment('ldbws') db.increment('ldbws');
return await data return await data;
} }
} catch (err) { } catch (err) {
log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, 'info') log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, 'info');
return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'} return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'};
} }
} }
async function arrDepBoard(CRS){ async function arrDepBoard(CRS){
log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, 'info') log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, 'info');
try { try {
const options = { const options = {
numRows: 10, numRows: 10,
crs: CRS.toUpperCase() crs: CRS.toUpperCase()
} };
const api = new ldb(ldbKey,false) const api = new ldb(ldbKey,false);
return await api.call('GetArrDepBoardWithDetails', options, false, false) return await api.call('GetArrDepBoardWithDetails', options, false, false);
} catch (err) { } catch (err) {
log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, 'warn') log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, 'warn');
return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'} return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'};
} }
} }
async function arrDepBoardStaff(CRS) { async function arrDepBoardStaff(CRS) {
log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, 'dbug') log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, 'dbug');
try { try {
const options = { const options = {
numRows: 25, numRows: 25,
crs: CRS.toUpperCase(), crs: CRS.toUpperCase(),
getNonPassengerServices: true getNonPassengerServices: true
} };
const api = new ldb(ldbsvKey,true) const api = new ldb(ldbsvKey,true);
return await api.call('GetArrDepBoardWithDetails', options, false, false) return await api.call('GetArrDepBoardWithDetails', options, false, false);
} catch (err) { } catch (err) {
log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`) log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`);
return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'} return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'};
} }
} }
module.exports = { module.exports = {
get get
} };

View File

@ -1,19 +1,19 @@
const log = require('../utils/log.utils') // Log Helper const log = require('../utils/log.utils'); // Log Helper
const db = require('../services/dbAccess.services') const db = require('../services/dbAccess.services');
async function getStations(){ async function getStations(){
var out = db.query('stations') var out = db.query('stations');
log.out('listServices.getStations: Fetching stations list', 'info') log.out('listServices.getStations: Fetching stations list', 'info');
return await out return await out;
} }
async function getCorpus(){ async function getCorpus(){
var out = db.query('corpus') var out = db.query('corpus');
log.out('listServices.getCorpus: Fetching CORPUS list', 'info') log.out('listServices.getCorpus: Fetching CORPUS list', 'info');
return await out return await out;
} }
module.exports = { module.exports = {
getStations, getStations,
getCorpus getCorpus
} };

View File

@ -1,12 +1,12 @@
/* global process */ /* global process */
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
const mail = require('nodemailer') //>> Probs wrong const mail = require('nodemailer'); //>> Probs wrong
const fromAddr = process.env.OWL_EML_FROM const fromAddr = process.env.OWL_EML_FROM;
const smtpUser = process.env.OWL_EML_USER const smtpUser = process.env.OWL_EML_USER;
const smtpPass = process.env.OWL_EML_PASS const smtpPass = process.env.OWL_EML_PASS;
const smtpHost = process.env.OWL_EML_HOST const smtpHost = process.env.OWL_EML_HOST;
const smtpPort = process.env.OWL_EML_PORT const smtpPort = process.env.OWL_EML_PORT;
let transporter = mail.createTransport({ let transporter = mail.createTransport({
host: smtpHost, host: smtpHost,
@ -16,21 +16,21 @@ let transporter = mail.createTransport({
user: smtpUser, user: smtpUser,
pass: smtpPass pass: smtpPass
} }
}) });
async function send(message){ // message is an object containing strings for: *to, cc, bcc, *subject, *txt, html (* denotes required) async function send(message){ // message is an object containing strings for: *to, cc, bcc, *subject, *txt, html (* denotes required)
log.out('mailServices.send: Message send request received', 'info') log.out('mailServices.send: Message send request received', 'info');
message.from = fromAddr message.from = fromAddr;
try { try {
var res = await transporter.sendMail(message) var res = await transporter.sendMail(message);
} catch(err) { } catch(err) {
log.out(`mailServices.send: Message send failed: ${err}`, 'err') log.out(`mailServices.send: Message send failed: ${err}`, 'err');
return false return false;
} }
log.out(`mailServices.send: SMTP Response: ${res.response}`) log.out(`mailServices.send: SMTP Response: ${res.response}`);
return true return true;
} }
module.exports = { module.exports = {
send send
} };

View File

@ -1,13 +1,13 @@
// Finds PIS Codes using DB Lookups // Finds PIS Codes using DB Lookups
const db = require('../services/dbAccess.services') const db = require('../services/dbAccess.services');
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
const clean = require('../utils/sanitizer.utils') const clean = require('../utils/sanitizer.utils');
async function findPisByOrigDest(start,end) { async function findPisByOrigDest(start,end) {
log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug') log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug');
const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase());
const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase());
const query = { const query = {
stops: { stops: {
$all: [ $all: [
@ -21,14 +21,14 @@ async function findPisByOrigDest(start,end) {
{ $eq: [{ $arrayElemAt: [ '$stops', 0 ] }, firstCrs] } { $eq: [{ $arrayElemAt: [ '$stops', 0 ] }, firstCrs] }
] ]
} }
} };
//const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]}
const search = db.query('pis', query) const search = db.query('pis', query);
return search return search;
} }
// Hopefully at some point, I will also be able to implement a find PIS code by headcode option. // Hopefully at some point, I will also be able to implement a find PIS code by headcode option.
module.exports = { module.exports = {
findPisByOrigDest findPisByOrigDest
} };

View File

@ -1,51 +1,51 @@
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
const auth = require('../utils/auth.utils') const auth = require('../utils/auth.utils');
const db = require('./dbAccess.services') const db = require('./dbAccess.services');
const mail = require('./mail.services') const mail = require('./mail.services');
const clean = require('../utils/sanitizer.utils') const clean = require('../utils/sanitizer.utils');
const domains = require('../configs/domains.configs') const domains = require('../configs/domains.configs');
const errors = require('../configs/errorCodes.configs') const errors = require('../configs/errorCodes.configs');
async function createRegKey(body) { async function createRegKey(body) {
log.out('registerServices.createRegKey: Incoming request', 'INFO') log.out('registerServices.createRegKey: Incoming request', 'INFO');
const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email const domain = await clean.getDomainFromEmail(body.email); // The function should validate the email
log.out(`registerServices: New registration request from domain: ${domain}`, 'info') log.out(`registerServices: New registration request from domain: ${domain}`, 'info');
if (domains.includes(domain)) { if (domains.includes(domain)) {
log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`) log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`);
const uuid = await auth.generateKey() const uuid = await auth.generateKey();
db.addRegReq(uuid, domain) db.addRegReq(uuid, domain);
const message = await auth.generateConfirmationEmail(body.email, uuid) const message = await auth.generateConfirmationEmail(body.email, uuid);
if (!message) { if (!message) {
const err = new Error('Message generation error') const err = new Error('Message generation error');
log.out('registerServices.createRegKey: Error generating registration email', 'err') log.out('registerServices.createRegKey: Error generating registration email', 'err');
log.out(err, 'err') log.out(err, 'err');
return 500 return 500;
} }
if (await mail.send(message) == true) { if (await mail.send(message) == true) {
return {status: 201, message: 'email sent'} return {status: 201, message: 'email sent'};
} }
return {status: 500, errorCode: 950, errorMsg: errors[950]} return {status: 500, errorCode: 950, errorMsg: errors[950]};
} }
return {status: 403, errorCode: 702, errorMsg: errors[702]} return {status: 403, errorCode: 702, errorMsg: errors[702]};
} }
async function regUser(req) { // Add input validation async function regUser(req) { // Add input validation
log.out(`Read UUID: ${req.uuid}`, 'dbug') log.out(`Read UUID: ${req.uuid}`, 'dbug');
log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, 'info') log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, 'info');
const res = await auth.checkRequest(req.uuid) const res = await auth.checkRequest(req.uuid);
log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, 'info') log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, 'info');
if (res.result) { if (res.result) {
const uuid = await auth.generateKey() const uuid = await auth.generateKey();
const apiKey = await db.addUser(uuid, res.domain) const apiKey = await db.addUser(uuid, res.domain);
if (apiKey) { if (apiKey) {
db.delRegReq(req.uuid) db.delRegReq(req.uuid);
return {status: 201, message: 'User added', api_key: uuid} return {status: 201, message: 'User added', api_key: uuid};
} }
} }
return {status: 401, errorCode: 703, errorMsg: errors[703]} return {status: 401, errorCode: 703, errorMsg: errors[703]};
} }
module.exports = { module.exports = {
regUser, regUser,
createRegKey createRegKey
} };

View File

@ -1,25 +1,25 @@
const log = require('../utils/log.utils') // Log Helper const log = require('../utils/log.utils'); // Log Helper
const db = require('../services/dbAccess.services') const db = require('../services/dbAccess.services');
const os = require('os') const os = require('os');
const vers = require('../configs/version.configs') const vers = require('../configs/version.configs');
async function hits(){ async function hits(){
log.out('statsServices.hits: Statistics Requested', 'info') log.out('statsServices.hits: Statistics Requested', 'info');
var dat = db.query('meta', {target: 'counters'}) var dat = db.query('meta', {target: 'counters'});
var ver = db.query('meta', {target: 'versions'}) var ver = db.query('meta', {target: 'versions'});
log.out('statsServices.hits: fetched server meta', 'info') log.out('statsServices.hits: fetched server meta', 'info');
let out = {} let out = {};
out.host = os.hostname() out.host = os.hostname();
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
out.mode = process.env.NODE_ENV out.mode = process.env.NODE_ENV;
out.verBkend = vers.app out.verBkend = vers.app;
out.verApi = vers.api out.verApi = vers.api;
out.dat = await dat out.dat = await dat;
out.ver = await ver out.ver = await ver;
log.out(`statsServices.hits: Sending Data: ${JSON.stringify(out)}`, 'info') log.out(`statsServices.hits: Sending Data: ${JSON.stringify(out)}`, 'info');
return out return out;
} }
module.exports = { module.exports = {
hits hits
} };

View File

@ -1,51 +1,51 @@
const log = require('../utils/log.utils') const log = require('../utils/log.utils');
const crypto = require('crypto') const crypto = require('crypto');
const db = require('../services/dbAccess.services') const db = require('../services/dbAccess.services');
const fs = require('fs/promises') const fs = require('fs/promises');
const minify = require('../utils/minify.utils') const minify = require('../utils/minify.utils');
// Checks users registration key against issued keys // Checks users registration key against issued keys
async function isAuthed(uuid) { // Needs testing async function isAuthed(uuid) { // Needs testing
const q = {uuid: uuid} const q = {uuid: uuid};
const res = await db.query('users', q) const res = await db.query('users', q);
log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, 'dbug') log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, 'dbug');
const authorized = res && res[0] && res[0].domain const authorized = res && res[0] && res[0].domain;
if (authorized) db.userAtime(uuid) if (authorized) db.userAtime(uuid);
return authorized return authorized;
} }
// Checks whether a registration request key is valid // Checks whether a registration request key is valid
async function checkRequest(key) { async function checkRequest(key) {
const collection = 'registrations' const collection = 'registrations';
const query = {uuid: key} const query = {uuid: key};
const res = await db.query(collection, query) const res = await db.query(collection, query);
log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, 'dbug') log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, 'dbug');
const result = res.length > 0 && res[0].time const result = res.length > 0 && res[0].time
? { result: true, domain: res[0].domain } ? { result: true, domain: res[0].domain }
: { result: false } : { result: false };
return result return result;
} }
// Creates an API key for a user // Creates an API key for a user
async function generateKey() { // Needs testing & moving to 'register.utils' async function generateKey() { // Needs testing & moving to 'register.utils'
return crypto.randomUUID() return crypto.randomUUID();
} }
async function generateConfirmationEmail(eml, uuid) { async function generateConfirmationEmail(eml, uuid) {
try { try {
const htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8') const htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8');
const htmlStr = htmlTpl.replace(/>>ACCESSCODE<</g, uuid) const htmlStr = htmlTpl.replace(/>>ACCESSCODE<</g, uuid);
const htmlMin = await minify(htmlStr) const htmlMin = await minify(htmlStr);
const txtTpl = fs.readFile('mail-templates/register.txt', 'utf-8') const txtTpl = fs.readFile('mail-templates/register.txt', 'utf-8');
return { return {
to: eml, to: eml,
subject: 'OwlBoard Registration', subject: 'OwlBoard Registration',
text: (await txtTpl).replace(/>>ACCESSCODE<</g, uuid), text: (await txtTpl).replace(/>>ACCESSCODE<</g, uuid),
html: htmlMin html: htmlMin
} };
} catch(err) { } catch(err) {
log.out('mailServices.generateConfirmationEmail: Error reading templates, $(err)', 'err') log.out('mailServices.generateConfirmationEmail: Error reading templates, $(err)', 'err');
return false return false;
} }
} }
@ -54,4 +54,4 @@ module.exports = {
generateKey, generateKey,
generateConfirmationEmail, generateConfirmationEmail,
checkRequest checkRequest
} };

View File

@ -1,44 +1,44 @@
const log = require('../utils/log.utils') // Log Helper const log = require('../utils/log.utils'); // Log Helper
const db = require('../services/dbAccess.services') // DB Access const db = require('../services/dbAccess.services'); // DB Access
const san = require('../utils/sanitizer.utils') // Sanitiser const san = require('../utils/sanitizer.utils'); // Sanitiser
async function checkCrs(input){ async function checkCrs(input){
var INPUT = input.toUpperCase() var INPUT = input.toUpperCase();
log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, 'info') log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, 'info');
var query = { var query = {
'$or':[ '$or':[
{'3ALPHA':INPUT}, {'3ALPHA':INPUT},
{'TIPLOC':INPUT}, {'TIPLOC':INPUT},
{'STANOX':INPUT} {'STANOX':INPUT}
] ]
} };
var result = await db.query('stations', query) var result = await db.query('stations', query);
log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, 'dbug') log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, 'dbug');
return result return result;
} }
async function cleanMessages(input){ // Needs to be moved to the frontend `ensureArray() func` async function cleanMessages(input){ // Needs to be moved to the frontend `ensureArray() func`
var out = [] var out = [];
if (typeof input.message == 'string') { if (typeof input.message == 'string') {
out.push(await san.cleanNrcc(input.message)) out.push(await san.cleanNrcc(input.message));
} else if (typeof input.message == 'object') { } else if (typeof input.message == 'object') {
for(var i = 0; i < input.message.length; i++) { for(var i = 0; i < input.message.length; i++) {
out.push(await san.cleanNrcc(input.message[i])) out.push(await san.cleanNrcc(input.message[i]));
} }
} }
return out return out;
} }
// Accepts an object but not an Array and returns it wrapped in an array. // Accepts an object but not an Array and returns it wrapped in an array.
async function cleanServices(input){ // Need to triple check but I don't think this is used anymore. async function cleanServices(input){ // Need to triple check but I don't think this is used anymore.
var out = [] var out = [];
if (!Array.isArray(input)) { if (!Array.isArray(input)) {
log.out(`ldbUtils.cleanServices: Transforming input: ${input}`, 'depr') log.out(`ldbUtils.cleanServices: Transforming input: ${input}`, 'depr');
out.push(input) out.push(input);
log.out(`ldbUtils.cleanServices: Returning output: ${out}`, 'depr') log.out(`ldbUtils.cleanServices: Returning output: ${out}`, 'depr');
return out return out;
} else { } else {
return input return input;
} }
} }
@ -46,4 +46,4 @@ module.exports = {
checkCrs, checkCrs,
cleanMessages, cleanMessages,
cleanServices cleanServices
} };

View File

@ -1,17 +1,17 @@
/* global process */ /* global process */
const environment = process.env.NODE_ENV const environment = process.env.NODE_ENV;
const hideInProduction = ['info', 'dbug'] const hideInProduction = ['info', 'dbug'];
async function out(msg, level = 'othr') { async function out(msg, level = 'othr') {
if (environment === 'production' && hideInProduction.includes(level.toLowerCase())) { if (environment === 'production' && hideInProduction.includes(level.toLowerCase())) {
return return;
} else { } else {
const time = new Date().toISOString() const time = new Date().toISOString();
console.log(`${time} - ${level.toUpperCase()} - ${msg}`) console.log(`${time} - ${level.toUpperCase()} - ${msg}`);
} }
} }
module.exports = { module.exports = {
out out
} };

View File

@ -1,10 +1,10 @@
const htmlShrink = require('html-minifier').minify const htmlShrink = require('html-minifier').minify;
const juice = require('juice') const juice = require('juice');
module.exports = async function minifyMail(input) { module.exports = async function minifyMail(input) {
const inlined = juice(input) const inlined = juice(input);
return htmlShrink(inlined, { return htmlShrink(inlined, {
removeComments: true, removeComments: true,
collapseWhitespace: true collapseWhitespace: true
}) });
} };

View File

@ -1,42 +1,24 @@
//const clean = require('string-sanitizer-fix'); //const log = require('../utils/log.utils');
const log = require('../utils/log.utils')
function removeNonAlphanumeric(inputString) { // Should be able to replace sanitizer module function removeNonAlphanumeric(inputString) { // Should be able to replace sanitizer module
return inputString.replace(/[^a-zA-Z0-9]/g, '') return inputString.replace(/[^a-zA-Z0-9]/g, '');
} }
function removeNonAlpha(inputString) { // Should be able to replace sanitizer module function removeNonAlpha(inputString) { // Should be able to replace sanitizer module
return inputString.replace(/[^a-zA-Z]/g, '') return inputString.replace(/[^a-zA-Z]/g, '');
} }
const cleanApiEndpointTxt = removeNonAlpha const cleanApiEndpointTxt = removeNonAlpha;
const cleanApiEndpointNum = removeNonAlphanumeric const cleanApiEndpointNum = removeNonAlphanumeric;
/*
function cleanApiEndpointTxt(input) {
var output = clean.sanitize.keepSpace(input)
if (output != input){
log.out(`sanitizerUtils.cleanApiEndpoint: WARN: Sanitizing changed string. Input = ${input}`, "warn");
}
return output
}
function cleanApiEndpointNum(input) {
var output = clean.sanitize.keepNumber(input)
if (output != input){
log.out(`sanitizerUtils.cleanApiEndpointNum: WARN: Sanitizing changed string. Input = ${input}`, "warn");
}
return output
}
*/
function cleanNrcc(input) { // Remove newlines and then <p> tags from input function cleanNrcc(input) { // Remove newlines and then <p> tags from input
const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, '') const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, '');
return cleanInput return cleanInput;
} }
async function getDomainFromEmail(mail) { // Needs testing async function getDomainFromEmail(mail) { // Needs testing
let split = mail.split('@') let split = mail.split('@');
return split[1] return split[1];
} }
module.exports = { module.exports = {
@ -46,4 +28,4 @@ module.exports = {
removeNonAlphanumeric, removeNonAlphanumeric,
cleanNrcc, cleanNrcc,
getDomainFromEmail, getDomainFromEmail,
} };

View File

@ -1,15 +1,15 @@
function unixLocal(unix) { function unixLocal(unix) {
var jsTime = unix*1000 var jsTime = unix*1000;
var dt = new Date(jsTime) var dt = new Date(jsTime);
return dt.toLocaleString() return dt.toLocaleString();
} }
function jsUnix(js) { function jsUnix(js) {
var preRound = js / 1000 var preRound = js / 1000;
return Math.round(preRound) return Math.round(preRound);
} }
module.exports = { module.exports = {
unixLocal, unixLocal,
jsUnix, jsUnix,
} };

View File

@ -8,10 +8,10 @@ async function varTest(){
OWL_LDB_CORPUSUSER: process.env.OWL_LDB_CORPUSUSER, OWL_LDB_CORPUSUSER: process.env.OWL_LDB_CORPUSUSER,
OWL_LDB_CORPUSPASS: process.env.OWL_LDB_CORPUSPASS, OWL_LDB_CORPUSPASS: process.env.OWL_LDB_CORPUSPASS,
OWL_NOT_USED: process.env.OWL_NOT_USED OWL_NOT_USED: process.env.OWL_NOT_USED
} };
var desired = { var desired = {
OWL_DB_PASS: process.env.OWL_DB_PASS OWL_DB_PASS: process.env.OWL_DB_PASS
} };
// DO NOT LOG CREDENTIALS!!! // DO NOT LOG CREDENTIALS!!!
// Test that each of required is NOT undefined. // Test that each of required is NOT undefined.
@ -25,4 +25,4 @@ async function varTest(){
module.exports = { module.exports = {
varTest varTest
} };