This commit is contained in:
newtbot 2024-01-13 02:47:01 +08:00
parent b3f2f4e5f6
commit a7e1a0028e
6 changed files with 47 additions and 36 deletions

View File

@ -842,5 +842,4 @@ module.exports = {
getSensorDataById, getSensorDataById,
getData, getData,
getDatabyRange, getDatabyRange,
getAverage,
}; };

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
@ -23,6 +21,8 @@ client.on('connect', () => {
//upload to db logic here //upload to db logic here
insertData(data); insertData(data);
//websocket logic here??
} }
else { else {
console.log("Data is invalid"); console.log("Data is invalid");

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,19 +64,23 @@ 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 range = inputNumber * percent;
const randomOffset = Math.random() * range; const randomOffset = Math.random() * range;
@ -84,22 +88,6 @@ function numberWithinPercent(inputNumber) {
return Math.floor(newNumber); 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})
*/ */

15
package-lock.json generated
View File

@ -14,6 +14,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",
@ -891,6 +892,20 @@
"node": ">= 0.10.0" "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": { "node_modules/express-session": {
"version": "1.17.3", "version": "1.17.3",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",

View File

@ -22,6 +22,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",