From 90754c1792d0d023315ac7fb863aa426c2d21022 Mon Sep 17 00:00:00 2001 From: newtbot Date: Wed, 3 Jan 2024 03:51:15 +0800 Subject: [PATCH] seedroute and vlidate --- Database/model/apiLog.js | 22 ++++------- Database/model/locationModel.js | 23 ++++------- Web-Server/functions/APIDatabase.js | 22 +---------- Web-Server/functions/SeedCRUD.js | 0 Web-Server/modules/express.js | 45 +++++++++++++--------- Web-Server/routes/Location.js | 5 ++- Web-Server/routes/SeedLocationAndSensor.js | 42 ++++++++++++++++++++ Web-Server/routes/SeedsensorData.js | 0 Web-Server/routes/seed_route.js | 11 ++++++ api.MD | 13 +++++++ 10 files changed, 113 insertions(+), 70 deletions(-) create mode 100644 Web-Server/functions/SeedCRUD.js create mode 100644 Web-Server/routes/SeedLocationAndSensor.js create mode 100644 Web-Server/routes/SeedsensorData.js create mode 100644 Web-Server/routes/seed_route.js diff --git a/Database/model/apiLog.js b/Database/model/apiLog.js index fd7fcb9..d90fb2d 100644 --- a/Database/model/apiLog.js +++ b/Database/model/apiLog.js @@ -15,7 +15,7 @@ const api_log_Model = sequelize.define( allowNull: true, primaryKey: true, autoIncrement: true, - validator: { + validate: { isNumeric: true, }, }, @@ -23,7 +23,7 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 45, - validator: { + validate: { isIP: true, }, }, @@ -31,7 +31,7 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 20, - validator: { + validate: { //validate time: new Date().toUTCString(), isValidDateString(value) { if (!isValidDateString(value)) { @@ -46,7 +46,7 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 10, - validator: { + validate: { isIn: [["GET", "POST", "PUT", "DELETE"]], }, }, @@ -54,18 +54,12 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 45, - validator: { - //http://localhost/api/test - //remember to add domain name to the list - isIn: [["localhost"]], - //isFqdn: true, - }, }, statusCode: { type: DataTypes.STRING, allowNull: false, length: 10, - validator: { + validate: { isNumeric: true, len: [1, 3], }, @@ -74,7 +68,7 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 10, - validator: { + validate: { isNumeric: true, len: [1, 100], }, @@ -83,7 +77,7 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 45, - validator: { + validate: { isString(value) { if (typeof value !== "string") { throw new Error("Referrer must be a string"); @@ -97,7 +91,7 @@ const api_log_Model = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 100, - validator: { + validate: { isString(value) { if (typeof value !== "string") { throw new Error("UserAgent must be a string"); diff --git a/Database/model/locationModel.js b/Database/model/locationModel.js index b8b712c..1404edd 100644 --- a/Database/model/locationModel.js +++ b/Database/model/locationModel.js @@ -11,7 +11,7 @@ const locationModel = sequelize.define( allowNull: true, primaryKey: true, autoIncrement: true, - validator: { + validate: { isNumeric: true, }, }, @@ -19,7 +19,7 @@ const locationModel = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 10, - validator: { + validate: { notEmpty: { msg: "Name cannot be empty" }, len: [1, 20], /* @@ -27,7 +27,8 @@ const locationModel = sequelize.define( "hello world" (contains a space) "hello@123" (contains a symbol) "" (empty string) - + is: /^[a-z]+$/i, // matches this RegExp + is: ["^[a-z]+$",'i'], */ is: ["^[a-z0-9]+$", "i"] }, @@ -36,16 +37,9 @@ const locationModel = sequelize.define( type: DataTypes.STRING, allowNull: false, length: 10, - validator: { + validate: { notEmpty: { msg: "Added by cannot be empty" }, - len: [1, 20], - /* - //will not validate this and fail it - "hello world" (contains a space) - "hello@123" (contains a symbol) - "" (empty string) - - */ + len: [1, 20], is: ["^[a-z0-9]+$", "i"] }, }, @@ -53,17 +47,16 @@ const locationModel = sequelize.define( type: DataTypes.STRING, allowNull: true, length: 100, - validator: { + validate: { notEmpty: { msg: "Description cannot be empty" }, len: [1, 100], /* //will not validate this and fail it - "hello world" (contains a space) "hello@123" (contains a symbol) "" (empty string) */ - is: ["^[a-z0-9]+$", "i"] + is: ["^[a-zA-Z0-9 ]+$", "i"] }, }, createdAt: { diff --git a/Web-Server/functions/APIDatabase.js b/Web-Server/functions/APIDatabase.js index 5992ac2..b2b2010 100644 --- a/Web-Server/functions/APIDatabase.js +++ b/Web-Server/functions/APIDatabase.js @@ -6,29 +6,20 @@ const { sensorDataModel } = require("../../Database/model/sensorDataModel.js"); async function getLocation() { - try { const location = await locationModel.findAll(); return location; - } catch (error) { - console.error(error); - } } async function addLocation(name, added_by, description) { - try { const location = await locationModel.create({ name: name, added_by: added_by, description: description, }); - } catch (error) { - console.error(error); - } + } async function updateLocation(id, name, added_by, description) { - try { - //update by id const location = await locationModel.update( { name: name, @@ -41,35 +32,24 @@ async function updateLocation(id, name, added_by, description) { }, } ); - } catch (error) { - console.error(error); - } } async function deleteLocation(id) { - try { //delete by id const location = await locationModel.destroy({ where: { id: id, }, }); - } catch (error) { - console.error(error); - } } async function getLocationById(id) { - try { const location = await locationModel.findAll({ where: { id: id, }, }); return location; - } catch (error) { - console.error(error); - } } async function getSensor() { diff --git a/Web-Server/functions/SeedCRUD.js b/Web-Server/functions/SeedCRUD.js new file mode 100644 index 0000000..e69de29 diff --git a/Web-Server/modules/express.js b/Web-Server/modules/express.js index 8c7057c..6a9bb41 100644 --- a/Web-Server/modules/express.js +++ b/Web-Server/modules/express.js @@ -15,15 +15,18 @@ app.disable("x-powered-by"); app.use(express.json()); app.set("json spaces", 2); -const { APIlogger } = require('../middleware/ApiLogger.js'); +//const { APIlogger } = require('../middleware/ApiLogger.js'); //middleware logic ( called by next() ) //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')); //route logic app.use("/api/v0", require("../routes/api_route.js")); +//seed logic +app.use("/api/seed/v0", require("../routes/seed_route.js")); + // Catch 404 and forward to error handler. If none of the above routes are // used, this is what will be called. app.use(function (req, res, next) { @@ -34,29 +37,33 @@ app.use(function (req, res, next) { }); // Error handler. This is where `next()` will go on error -app.use(function (err, req, res, next) { +app.use(function(err, req, res, next) { console.error(err.status || res.status, err.name, req.method, req.url); - if (![404].includes(err.status || res.status)) { - console.error(err.message); - console.error(err.stack); - console.error("========================================="); + if(![ 404].includes(err.status || res.status)){ + console.error(err.message); + console.error(err.stack); + console.error('========================================='); } - //validation error - if (err.name === "SequelizeValidationError") { - err.status = 400; - err.message = "Validation Error"; + + console.log(err.name + " validation error"); + // Parse key error for Sequilzw + let keyErrors = {} + if(['SequelizeValidationError'].includes(err.name) && err.errors){ + for(let item of err.errors){ + if(item.path){ + keyErrors[item.path] = item.message + } + } } - else if (err.name === "SequelizeUniqueConstraintError") - { - console.log("this is my custom error!" + err); - } - + res.status(err.status || 500); + console.log(keyErrors); res.json({ - name: err.name, - message: err.message, + name: err.name, + message: err.message, + keyErrors, }); -}); + }); app.listen(port, () => { console.log(`app listening on port ${port}`); }); diff --git a/Web-Server/routes/Location.js b/Web-Server/routes/Location.js index 9c8218a..a18f2dd 100644 --- a/Web-Server/routes/Location.js +++ b/Web-Server/routes/Location.js @@ -22,11 +22,12 @@ router.get("/", async (req, res, next) => { } }); -//add location +//add location router.post("/new", async (req, res, next) => { try { const { name, added_by, description } = req.body; await addLocation(name, added_by, description); + res.sendStatus(200) } catch (error) { console.error(error); next(error); @@ -38,6 +39,7 @@ router.put("/update", async (req, res, next) => { try { const { id, name, added_by, description } = req.body; await updateLocation(id, name, added_by, description); + res.status(200).json({ message: "Location " + id + " updated" }); } catch (error) { console.error(error); next(error); @@ -49,6 +51,7 @@ router.delete("/delete", async (req, res, next) => { try { const { id } = req.body; await deleteLocation(id); + res.status(200).json({ message: "Location " + id + " deleted" }); } catch (error) { console.error(error); next(error); diff --git a/Web-Server/routes/SeedLocationAndSensor.js b/Web-Server/routes/SeedLocationAndSensor.js new file mode 100644 index 0000000..67d95ba --- /dev/null +++ b/Web-Server/routes/SeedLocationAndSensor.js @@ -0,0 +1,42 @@ +const { sequelize } = require("../../Database/mySql.js"); +const { locationModel } = require("../../Database/model/locationModel.js"); +const { sensorModel } = require("../../Database/model/sensorModel.js"); + +const express = require("express"); +const router = express.Router(); + +let mockLocation = [] + +//add seed +router.post("/new", async (req, res, next) => { + try { + console.log(mockLocation) + + for(let locationName of req.body.mockLocation){ + //create location and create sensor + let location = await locationModel.create({ + name: locationName, + added_by: "system", + description: "system generated location", + }); + await sensorModel.create({ + sensorname: `AQI-${Math.floor(Math.random()*898)+101}`, + added_by: "system", + //random mac address + mac_address: `${Math.floor(Math.random()*256).toString(16).padStart(2, '0')}-${Math.floor(Math.random()*256).toString(16).padStart(2, '0')}-${Math.floor(Math.random()*256).toString(16).padStart(2, '0')}-${Math.floor(Math.random()*256).toString(16).padStart(2, '0')}-${Math.floor(Math.random()*256).toString(16).padStart(2, '0')}-${Math.floor(Math.random()*256).toString(16).padStart(2, '0')}`, + description: "system generated sensor", + location: location.id + + }); + } + res.sendStatus(200).json({message: "seeded"}) + } catch (error) { + console.error(error); + next(error); + } +}); + + + + +module.exports = router; diff --git a/Web-Server/routes/SeedsensorData.js b/Web-Server/routes/SeedsensorData.js new file mode 100644 index 0000000..e69de29 diff --git a/Web-Server/routes/seed_route.js b/Web-Server/routes/seed_route.js new file mode 100644 index 0000000..d7116e8 --- /dev/null +++ b/Web-Server/routes/seed_route.js @@ -0,0 +1,11 @@ +'use strict'; +const router = require('express').Router(); + +//location route +router.use('/seed', require('./SeedLocationAndSensor')); + + + + + +module.exports = router; \ No newline at end of file diff --git a/api.MD b/api.MD index 7fe886d..333339e 100644 --- a/api.MD +++ b/api.MD @@ -8,12 +8,22 @@ curl http://localhost/api/v0/location/3 //post curl localhost/api/v0/location/new -H "Content-Type: application/json" -X POST -d '{"name": "test", "added_by": "noot" , "description": "test"}' +status: 200 + //put curl localhost/api/v0/location/update -X PUT -H "Content-Type: application/json" -d '{"id": "2" , "name": "test", "added_by": "noot", "description": "test12344444444"}' + status: 200 + "message": "Location 13 updated" + //delete curl localhost/api/v0/location/delete -X DELETE -H "Content-Type: application/json" -d '{"id": "6" }' +status: 200 +{ + "message": "Location 13 deleted" +} + //sensor //GET all curl localhost/api/v0/sensor @@ -68,3 +78,6 @@ curl localhost/api/v0/sensor-data/update -H "Content-Type: application/json" -X //delete curl localhost/api/v0/sensor-data/delete -X DELETE -H "Content-Type: application/json" -d '{"id": "3" }' +//seed + +curl localhost/api/seed/v0/seed/new -H "Content-Type: application/json" -X POST -d '{"mockLocation": ["test", "test123"]}'