From a7e1a0028ea1de35a6fee52d675318bae9620737 Mon Sep 17 00:00:00 2001 From: newtbot Date: Sat, 13 Jan 2024 02:47:01 +0800 Subject: [PATCH] blah --- Web-Server/functions/APIDatabase.js | 1 - Web-Server/index.js | 10 ++++----- Web-Server/modules/express.js | 22 ++++++++++++++----- Web-Server/routes/SeedsensorData.js | 34 +++++++++-------------------- package-lock.json | 15 +++++++++++++ package.json | 1 + 6 files changed, 47 insertions(+), 36 deletions(-) diff --git a/Web-Server/functions/APIDatabase.js b/Web-Server/functions/APIDatabase.js index f3e5af1..64471ca 100644 --- a/Web-Server/functions/APIDatabase.js +++ b/Web-Server/functions/APIDatabase.js @@ -842,5 +842,4 @@ module.exports = { getSensorDataById, getData, getDatabyRange, - getAverage, }; diff --git a/Web-Server/index.js b/Web-Server/index.js index 2b80b39..917461a 100644 --- a/Web-Server/index.js +++ b/Web-Server/index.js @@ -3,11 +3,9 @@ const client = require("./modules/mqtt"); const { validateData } = require("./functions/validateData.js"); const { insertData } = require("./functions/database.js"); /* -1) validate data from IoT sensor -2) upload data to database -3) add more routes to api -4) add swagger documentation -5) add middleware for authentication +1) on data received, validate data +2) websocket to another server + */ // Event handlers @@ -22,6 +20,8 @@ client.on('connect', () => { if (validateData(data)) { //upload to db logic here insertData(data); + + //websocket logic here?? } else { diff --git a/Web-Server/modules/express.js b/Web-Server/modules/express.js index 62d2f51..dda3077 100644 --- a/Web-Server/modules/express.js +++ b/Web-Server/modules/express.js @@ -1,24 +1,34 @@ -/* -1) api route -2) enforce best practice for api routes -*/ const express = require("express"); const helmet = require("helmet"); +const { rateLimit } = require("express-rate-limit"); const { APIlogger } = require('../middleware/apiLogger.js'); const app = express(); app.use(helmet()); 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 app.disable("x-powered-by"); +//parse json body format app.use(express.json()); 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', APIlogger, require('../routes/api_route.js')); diff --git a/Web-Server/routes/SeedsensorData.js b/Web-Server/routes/SeedsensorData.js index d223ea0..02db887 100644 --- a/Web-Server/routes/SeedsensorData.js +++ b/Web-Server/routes/SeedsensorData.js @@ -64,42 +64,30 @@ function nextDataRow(currentRow, interval) { measurement: { psi: numberWithinPercent(currentRow.measurement.psi), 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), 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), 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(), }; } 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 router.post("/new", async (req, res, next) => { @@ -130,6 +118,4 @@ POST /api/v0/seed/sensordata 2) nextDataRow(lastRow, interval) 3) seedSensorData({post object from abovr}) - - */ diff --git a/package-lock.json b/package-lock.json index b9b57ef..67671ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "dotenv": "^16.3.1", "ejs": "^3.1.9", "express": "^4.18.2", + "express-rate-limit": "^7.1.5", "express-session": "^1.17.3", "express-validator": "^7.0.1", "helmet": "^7.1.0", @@ -891,6 +892,20 @@ "node": ">= 0.10.0" } }, + "node_modules/express-rate-limit": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.5.tgz", + "integrity": "sha512-/iVogxu7ueadrepw1bS0X0kaRC/U0afwiYRSLg68Ts+p4Dc85Q5QKsOnPS/QUjPMHvOJQtBDrZgvkOzf8ejUYw==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "4 || 5 || ^5.0.0-beta.1" + } + }, "node_modules/express-session": { "version": "1.17.3", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", diff --git a/package.json b/package.json index 0bb46cd..87aa32a 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "dotenv": "^16.3.1", "ejs": "^3.1.9", "express": "^4.18.2", + "express-rate-limit": "^7.1.5", "express-session": "^1.17.3", "express-validator": "^7.0.1", "helmet": "^7.1.0",