Continue TS Implementation
Signed-off-by: Fred Boniface <fred@fjla.uk>
This commit is contained in:
parent
d07cd177b3
commit
93c8aed105
6
app.ts
6
app.ts
@ -54,7 +54,7 @@ log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - ` +
|
|||||||
`API versions: ${version.api}`, 'init');
|
`API versions: ${version.api}`, 'init');
|
||||||
|
|
||||||
// Express Error Handling:
|
// Express Error Handling:
|
||||||
app.use((err, req, res, next) => {
|
app.use((err: Error, req: Request, 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});
|
||||||
@ -103,11 +103,11 @@ mode === 'development'
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
// Start Express
|
// Start Express
|
||||||
app.listen(srvPort, srvListen, (error) =>{
|
app.listen(srvPort, srvListen, (error: 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.message}`, 'err');
|
||||||
}
|
}
|
||||||
});
|
});
|
100
package-lock.json
generated
100
package-lock.json
generated
@ -18,7 +18,9 @@
|
|||||||
"juice": "^9.0.0",
|
"juice": "^9.0.0",
|
||||||
"ldbs-json": "^1.2.1",
|
"ldbs-json": "^1.2.1",
|
||||||
"mongodb": "^4.13.0",
|
"mongodb": "^4.13.0",
|
||||||
"nodemailer": "^6.9.1"
|
"nodemailer": "^6.9.1",
|
||||||
|
"redis": "^4.6.7",
|
||||||
|
"zlib": "^1.0.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "^8.39.0",
|
"eslint": "^8.39.0",
|
||||||
@ -823,6 +825,59 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@redis/bloom": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@redis/client": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@redis/client": {
|
||||||
|
"version": "1.5.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz",
|
||||||
|
"integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==",
|
||||||
|
"dependencies": {
|
||||||
|
"cluster-key-slot": "1.1.2",
|
||||||
|
"generic-pool": "3.9.0",
|
||||||
|
"yallist": "4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@redis/graph": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@redis/client": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@redis/json": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@redis/client": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@redis/search": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@redis/client": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@redis/time-series": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@redis/client": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@smithy/abort-controller": {
|
"node_modules/@smithy/abort-controller": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz",
|
||||||
@ -1675,6 +1730,14 @@
|
|||||||
"node": ">= 4.0"
|
"node": ">= 4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/cluster-key-slot": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/color-convert": {
|
"node_modules/color-convert": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
@ -2417,6 +2480,14 @@
|
|||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
||||||
},
|
},
|
||||||
|
"node_modules/generic-pool": {
|
||||||
|
"version": "3.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
|
||||||
|
"integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/get-intrinsic": {
|
"node_modules/get-intrinsic": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
||||||
@ -3287,6 +3358,19 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/redis": {
|
||||||
|
"version": "4.6.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz",
|
||||||
|
"integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@redis/bloom": "1.2.0",
|
||||||
|
"@redis/client": "1.5.8",
|
||||||
|
"@redis/graph": "1.1.0",
|
||||||
|
"@redis/json": "1.0.4",
|
||||||
|
"@redis/search": "1.1.3",
|
||||||
|
"@redis/time-series": "1.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/relateurl": {
|
"node_modules/relateurl": {
|
||||||
"version": "0.2.7",
|
"version": "0.2.7",
|
||||||
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
|
||||||
@ -3890,6 +3974,11 @@
|
|||||||
"node": ">=4.0"
|
"node": ">=4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/yallist": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||||
|
},
|
||||||
"node_modules/yocto-queue": {
|
"node_modules/yocto-queue": {
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
||||||
@ -3901,6 +3990,15 @@
|
|||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"node_modules/zlib": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz",
|
||||||
|
"integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.2.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,9 @@
|
|||||||
"juice": "^9.0.0",
|
"juice": "^9.0.0",
|
||||||
"ldbs-json": "^1.2.1",
|
"ldbs-json": "^1.2.1",
|
||||||
"mongodb": "^4.13.0",
|
"mongodb": "^4.13.0",
|
||||||
"nodemailer": "^6.9.1"
|
"nodemailer": "^6.9.1",
|
||||||
|
"redis": "^4.6.7",
|
||||||
|
"zlib": "^1.0.5"
|
||||||
},
|
},
|
||||||
"name": "owlboard",
|
"name": "owlboard",
|
||||||
"description": "OwlBoard is an API and PWA for live rail departure board in the UK.",
|
"description": "OwlBoard is an API and PWA for live rail departure board in the UK.",
|
||||||
@ -18,7 +20,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"start": "node app.js",
|
"start": "node app.js",
|
||||||
"run": "node app.js"
|
"run": "tsc && node dist/app.js",
|
||||||
|
"build": "tsc"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
24
src/services/redis.services.ts
Normal file
24
src/services/redis.services.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { createClient } from "redis";
|
||||||
|
|
||||||
|
import zlib from 'zlib';
|
||||||
|
|
||||||
|
const client = createClient({
|
||||||
|
url: "redis:PORT"
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('error', err => console.log('Redis Client Error', err));
|
||||||
|
|
||||||
|
async function addToCache(key: string, value: Object): Promise<boolean> {
|
||||||
|
throw new Error("Unable to post to cache")
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getFromCache(key: string): Promise<Object> {
|
||||||
|
throw new Error("Unable to retreive")
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
await client.connect();
|
||||||
|
|
||||||
|
await client.set('key', 'value');
|
||||||
|
const value = await client.get('key');
|
||||||
|
await client.disconnect();
|
||||||
|
*/
|
@ -1,5 +1,5 @@
|
|||||||
const log = require('../utils/log.utils');
|
const logs = require('../utils/logs.utils');
|
||||||
const crypto = require('crypto');
|
const crypt = require('crypt');
|
||||||
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');
|
||||||
@ -8,7 +8,7 @@ const minify = require('../utils/minify.utils');
|
|||||||
async function isAuthed(uuid: string) { // Needs testing
|
async function isAuthed(uuid: string) { // 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: ' +
|
logs.out('authUtils.checkUser: DB Query answer: ' +
|
||||||
JSON.stringify(res[0]), 'dbug');
|
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);
|
||||||
@ -20,7 +20,7 @@ async function checkRequest(key: string) {
|
|||||||
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: ' +
|
logs.out('authUtils.checkRequest: DB Query result: ' +
|
||||||
JSON.stringify(res), 'dbug');
|
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 }
|
||||||
@ -30,7 +30,7 @@ async function checkRequest(key: string) {
|
|||||||
|
|
||||||
// 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 crypt.randomUUID();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function generateConfirmationEmail(eml: string, uuid: string) {
|
async function generateConfirmationEmail(eml: string, uuid: string) {
|
||||||
@ -46,7 +46,7 @@ async function generateConfirmationEmail(eml: string, uuid: string) {
|
|||||||
html: htmlMin
|
html: htmlMin
|
||||||
};
|
};
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
log.out('mailServices.generateConfirmationEmail: Error reading template, ' +
|
logs.out('mailServices.generateConfirmationEmail: Error reading template, ' +
|
||||||
err, 'err');
|
err, 'err');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -58,3 +58,10 @@ module.exports = {
|
|||||||
generateConfirmationEmail,
|
generateConfirmationEmail,
|
||||||
checkRequest
|
checkRequest
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
isAuthed,
|
||||||
|
generateKey,
|
||||||
|
generateConfirmationEmail,
|
||||||
|
checkRequest
|
||||||
|
}
|
@ -1,8 +1,10 @@
|
|||||||
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){
|
import * as san from '../utils/sanitizer.utils'
|
||||||
|
|
||||||
|
async function checkCrs(input = ""){
|
||||||
var INPUT = input.toUpperCase();
|
var INPUT = input.toUpperCase();
|
||||||
var query = {
|
var query = {
|
||||||
'$or':[
|
'$or':[
|
||||||
@ -22,10 +24,10 @@ async function cleanMessages(input){
|
|||||||
log.out('ldbUtils.cleanMessages: Deprecated function has been called', 'err');
|
log.out('ldbUtils.cleanMessages: Deprecated function has been called', 'err');
|
||||||
var out = [];
|
var out = [];
|
||||||
if (typeof input.message == 'string') {
|
if (typeof input.message == 'string') {
|
||||||
out.push(await san.cleanNrcc(input.message));
|
out.push(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(san.cleanNrcc(input.message[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
|
@ -15,3 +15,5 @@ async function out(msg: string, level = 'othr') {
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
out
|
out
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export { out }
|
@ -1,10 +1,13 @@
|
|||||||
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: string): Promise<string> {
|
async function minifyMail(input: string): Promise<string> {
|
||||||
const inlined: string = juice(input);
|
const inlined: string = juice(input);
|
||||||
return htmlShrink(inlined, {
|
return htmlShrink(inlined, {
|
||||||
removeComments: true,
|
removeComments: true,
|
||||||
collapseWhitespace: true
|
collapseWhitespace: true
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module.exports = {minifyMail}
|
||||||
|
export {minifyMail}
|
@ -34,3 +34,13 @@ module.exports = {
|
|||||||
cleanNrcc,
|
cleanNrcc,
|
||||||
getDomainFromEmail,
|
getDomainFromEmail,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
cleanApiEndpointTxt,
|
||||||
|
cleanApiEndpointNum,
|
||||||
|
removeNonAlpha,
|
||||||
|
removeNonAlphanumeric,
|
||||||
|
removeNonNumeric,
|
||||||
|
cleanNrcc,
|
||||||
|
getDomainFromEmail,
|
||||||
|
}
|
@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
/* JavaScript Support */
|
/* JavaScript Support */
|
||||||
"allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
"allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||||
"checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
"checkJs": false, /* Enable error reporting in type-checked JavaScript files. */
|
||||||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||||
|
|
||||||
/* Emit */
|
/* Emit */
|
||||||
|
Loading…
Reference in New Issue
Block a user