Merge branch 'Dev-branch'

This commit is contained in:
newtbot 2024-01-13 02:52:48 +08:00
commit d3208d9dce
5 changed files with 40 additions and 35 deletions

View File

@ -3,11 +3,9 @@ const client = require("./modules/mqtt");
const { validateData } = require("./functions/validateData.js"); const { validateData } = require("./functions/validateData.js");
const { insertData } = require("./functions/database.js"); const { insertData } = require("./functions/database.js");
/* /*
1) validate data from IoT sensor 1) on data received, validate data
2) upload data to database 2) websocket to another server
3) add more routes to api
4) add swagger documentation
5) add middleware for authentication
*/ */
// Event handlers // Event handlers
@ -22,6 +20,8 @@ client.on('connect', () => {
if (validateData(data)) { if (validateData(data)) {
//upload to db logic here //upload to db logic here
insertData(data); insertData(data);
//websocket logic here??
} }
else { else {

View File

@ -1,24 +1,34 @@
/*
1) api route
2) enforce best practice for api routes
*/
const express = require("express"); const express = require("express");
const helmet = require("helmet"); const helmet = require("helmet");
const { rateLimit } = require("express-rate-limit");
const { APIlogger } = require('../middleware/apiLogger.js'); const { APIlogger } = require('../middleware/apiLogger.js');
const app = express(); const app = express();
app.use(helmet()); app.use(helmet());
const port = 80; const port = 80;
//express-rate-limit stolen from docs
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
limit: 600, // Limit each IP to 100 requests per `window` (here, per 15 minutes).
standardHeaders: 'draft-7', // draft-6: `RateLimit-*` headers; draft-7: combined `RateLimit` header
legacyHeaders: false, // Disable the `X-RateLimit-*` headers.
})
// Apply the rate limiting middleware to all requests.
app.use(limiter)
//disable x-powered-by header for security reasons //disable x-powered-by header for security reasons
app.disable("x-powered-by"); app.disable("x-powered-by");
//parse json body format
app.use(express.json()); app.use(express.json());
app.set("json spaces", 2); app.set("json spaces", 2);
//middleware logic ( called by next() ) /*
middleware logic ( called by next() )
*/
//app.use('/api/v0', require('../middleware/ApiKey.js')); //app.use('/api/v0', require('../middleware/ApiKey.js'));
app.use('/api/v0', APIlogger, require('../routes/api_route.js')); app.use('/api/v0', APIlogger, require('../routes/api_route.js'));

View File

@ -64,42 +64,30 @@ function nextDataRow(currentRow, interval) {
measurement: { measurement: {
psi: numberWithinPercent(currentRow.measurement.psi), psi: numberWithinPercent(currentRow.measurement.psi),
humidity: Math.floor(Math.random() * (90 - 80 + 1) + 80), humidity: Math.floor(Math.random() * (90 - 80 + 1) + 80),
o3: Math.floor(Math.random() * (100 - 20 + 1) + 30), o3: numberWithinPercent(currentRow.measurement.o3),
no2: numberWithinPercent(currentRow.measurement.no2), no2: numberWithinPercent(currentRow.measurement.no2),
so2: numberWithinPercent(currentRow.measurement.so2), so2: numberWithinPercent(currentRow.measurement.so2),
co: Math.floor(Math.random() * 25 - 0.5), co: numberWithinPercent(currentRow.measurement.co),
temperature: Math.floor(Math.random() * (30 - 23 + 1) + 25), temperature: Math.floor(Math.random() * (30 - 23 + 1) + 25),
windspeed: Math.floor(Math.random() * (10 - 1 + 1) + 1), windspeed: Math.floor(Math.random() * (10 - 1 + 1) + 1),
}, },
//add 15 minutes to current row time to get next row time in UTC
createdAt: moment(currentRow.createdAt).add(interval, "m").toDate(), createdAt: moment(currentRow.createdAt).add(interval, "m").toDate(),
}; };
} }
function numberWithinPercent(inputNumber) { function numberWithinPercent(inputNumber) {
const range = inputNumber * 0.003; //random percent with max of 1 and min of -1
const percent = Math.random() * 1 - Math.random();
const randomOffset = Math.random() * range; const range = inputNumber * percent;
const newNumber = inputNumber + randomOffset; const randomOffset = Math.random() * range;
return Math.floor(newNumber); const newNumber = inputNumber + randomOffset;
return Math.floor(newNumber);
} }
/*
function randomizeDataPoint(value, delta, maxDelta){
// https://stackoverflow.com/a/36756480
delta = Math.random() < 0.9 ? delta : maxDelta
return Math.floor(Math.random() * ((value+delta) - Math.abs(delta-value)) + Math.abs(delta-value));
}
let count = 0
let currentValue = 85
while(count <50){
count++
console.log(currentValue)
currentValue = randomizeDataPoint(currentValue, 2, 5)
}
*/
//add seed //add seed
router.post("/new", async (req, res, next) => { router.post("/new", async (req, res, next) => {
@ -130,6 +118,4 @@ POST /api/v0/seed/sensordata
2) nextDataRow(lastRow, interval) 2) nextDataRow(lastRow, interval)
3) seedSensorData({post object from abovr}) 3) seedSensorData({post object from abovr})
*/ */

8
package-lock.json generated
View File

@ -572,6 +572,14 @@
"utils-merge": "1.0.1", "utils-merge": "1.0.1",
"vary": "~1.1.2" "vary": "~1.1.2"
}, },
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/express-session": {
"version": "1.17.3",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
"integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
"dependencies": { "dependencies": {
"body-parser": { "body-parser": {
"version": "1.20.1", "version": "1.20.1",

View File

@ -24,6 +24,7 @@
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"ejs": "^3.1.9", "ejs": "^3.1.9",
"express": "^4.18.2", "express": "^4.18.2",
"express-rate-limit": "^7.1.5",
"express-session": "^1.17.3", "express-session": "^1.17.3",
"express-validator": "^7.0.1", "express-validator": "^7.0.1",
"helmet": "^7.1.0", "helmet": "^7.1.0",