Fix database model associations and update API route

This commit is contained in:
newtbot
2024-01-27 20:15:29 +08:00
parent 6190cb63cd
commit d491750916
14 changed files with 61 additions and 164 deletions

View File

@ -2,7 +2,6 @@ const express = require("express");
const { rateLimit } = require("express-rate-limit");
const path = require("path");
const app = express();
const port = 3000;
const ejs = require("ejs");
module.exports = app;

View File

@ -107,6 +107,6 @@ const sensorModel = sequelize.define(
}
);
sensorModel.belongsTo(locationModel);
//sensorModel.belongsTo(locationModel);
module.exports = { sensorModel };

View File

@ -3,7 +3,7 @@ const { Sequelize, DataTypes } = require("sequelize");
const { sequelize } = require("../mySQL");
const { userModel } = require("./userModel");
sequelize.sync();
//sequelize.sync();
const tokenModel = sequelize.define(
"token",
{
@ -48,6 +48,14 @@ const tokenModel = sequelize.define(
isIn: [["canRead", "canWrite",]],
},
},
isKey: {
type: DataTypes.STRING,
allowNull: true,
length: 45,
validate:{
isIn: [["isKey" , "isNotKey"]],
}
},
expiration: {
type: DataTypes.DATE,
allowNull: false,

View File

@ -15,7 +15,7 @@ const sequelize = new Sequelize(
attributeBehavior: 'escape',
dialectOptions: {
ssl: {
ca: fs.readFileSync(path.resolve(__dirname, '../cert/DigiCertGlobalRootCA.crt.pem')),
ca: fs.readFileSync(path.resolve(__dirname, '../cert/DigiCertGlobalRootCA.crt_3.pem')),
},
},

View File

@ -30,7 +30,7 @@ async function getTokenByToken(token) {
return token;
}
async function addToken(userId, permission, expiry) {
async function addToken(userId, permission, isKey ,expiry) {
let uuid = await generateUUID();
let hashtoken = await hash(uuid);
//console.log("user id", userId);
@ -41,6 +41,7 @@ async function addToken(userId, permission, expiry) {
userid: userId,
token: hashtoken,
permission: permission,
isKey: isKey,
expiration: expiry,
});
@ -48,4 +49,16 @@ async function addToken(userId, permission, expiry) {
return token.id + "-" + uuid;
}
module.exports = { addToken, getTokenByToken };
async function checkToken(id) {
let tokenRes = await tokenModel.findOne(
{
where: {
userid: id,
}
}
);
return tokenRes;
}
module.exports = { addToken, getTokenByToken , checkToken};

View File

@ -84,7 +84,7 @@ async function loginUser(user) {
//let tokenToLive = moment().add(30, 'minutes').format();
let currentDate = new Date();
let tokenToLive = new Date(currentDate.getTime() + 30 * 60000);
let token = await addToken(userRes.id , "canRead" , tokenToLive);
let token = await addToken(userRes.id , "canRead" , "isNotKey" , tokenToLive);
return { token: token, userid: userRes.id, username: userRes.username };
}

View File

@ -1,5 +1,9 @@
var validator = require("validator");
/*
All the validation functions are used by database model.
*/
const dateRegex = /^[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT$/;
function isValidDateString(value) {

View File

@ -547,106 +547,3 @@ body.one-content-column-version .content thead {
background-color: #45a049; /* Darker green on hover */
}
.delete-key-button {
float: right; /* Align the button to the right */
margin-right: 78%;
margin-top: -40px; /* Adjust the margin-top value based on your layout */
/* Add any additional styling you want for the button */
}
#content-get-api .delete-key-button {
background-color: #af4c4c; /* Green background color */
color: white; /* White text color */
padding: 5px 11px; /* Padding for the button */
border: none; /* Remove button border */
border-radius: 5px; /* Add border-radius for rounded corners */
cursor: pointer; /* Add pointer cursor on hover */
font-size: 14px; /* Font size */
}
#content-get-api .delete-key-button:hover {
background-color: #a04545; /* Darker green on hover */
}
.generate-key-screen {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 30px;
width: 400px; /* Adjust the width as needed */
background-color: #ffffff;
border: 1px solid #eaeaea;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); /* Adjust the shadow as needed */
z-index: 1000;
border-radius: 12px; /* Slightly increased border-radius for a softer look */
overflow: hidden; /* Hide overflow content */
}
.generate-key-screen label {
display: block;
margin-bottom: 8px;
color: #333;
}
.generate-key-screen input {
width: 100%;
padding: 8px;
margin-bottom: 16px;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 4px;
}
.generate-key-screen button {
background-color: #4caf50;
color: #fff;
padding: 10px 15px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.generate-key-screen button:hover {
background-color: #45a049;
}
.generate-key-screen button + button {
margin-left: 8px;
background-color: #f44336;
}
.generate-key-screen button + button:hover {
background-color: #d32f2f;
}
.key-input {
display: flex;
align-items: center;
}
.key-input input {
flex: 1;
padding: 8px;
margin-right: 8px;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 4px;
}
.key-input button {
background-color: #4caf50;
color: #fff;
padding: 8px 12px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.key-input button:hover {
background-color: #45a049;
}

View File

@ -147,13 +147,13 @@ button.btn-secondary:hover{
border: none;
}
.services-bar .card h4.card-header{
background-color: #4e3914;
background-color: #ffffff;
color: #4eae3a;
font-size: 18px;
font-weight: 400;
}
.services-bar .card .card-footer{
background-color: #4e3914;
background-color: #ffffff;
}
.about-main{
padding: 30px 0px;

View File

@ -5,8 +5,6 @@ document.addEventListener("DOMContentLoaded", function () {
const aqi = "15";
const temperature = "25°C";
const humidity = "60%";
const pm25 = "10";
const pm10 = "20";
const so2 = "5";
const o3 = "35";
const co = "0.5";
@ -15,7 +13,6 @@ document.addEventListener("DOMContentLoaded", function () {
infoContainer.innerHTML = `
<div class="additional-info-box">
<h3>Additional Information - ${region}</h3>
<button id="viewData">View Data</button>
<div class="info-item">
<span class="info-label">Air Quality Index:</span>
<span class="info-value">${aqi}</span>
@ -28,14 +25,6 @@ document.addEventListener("DOMContentLoaded", function () {
<span class="info-label">Humidity:</span>
<span class="info-value">${humidity}</span>
</div>
<div class="info-item">
<span class="info-label">PM2.5:</span>
<span class="info-value">${pm25}</span>
</div>
<div class="info-item">
<span class="info-label">PM10:</span>
<span class="info-value">${pm10}</span>
</div>
<div class="info-item">
<span class="info-label">SO2:</span>
<span class="info-value">${so2}</span>
@ -54,21 +43,6 @@ document.addEventListener("DOMContentLoaded", function () {
</div>
</div>
`;
var viewDataButton = document.getElementById("viewData");
// Add a click event listener to the button
viewDataButton.addEventListener("click", function () {
// Redirect to the "viewdata.ejs" page
window.location.href = "/viewdata";
});
// Remove the 'active' class from all info-box elements
const infoBoxes = document.querySelectorAll('.info-box');
infoBoxes.forEach(box => box.classList.remove('active'));
// Add the 'active' class to the clicked info-box
const clickedBox = document.getElementById(region.toLowerCase());
clickedBox.classList.add('active');
}

View File

@ -1,9 +1,7 @@
const { addToken } = require("../functions/api");
const { addToken, checkToken } = require("../functions/api");
const { checkEmail, getUserByEmail } = require("../functions/user");
const { sendTokenEmail } = require("../functions/nodeMail");
const express = require("express");
const router = express.Router();
@ -24,21 +22,27 @@ router.post("/new", async (req, res, next) => {
let error = new Error("Email not found");
error.status = 400;
return next(error);
}
else
{
//console.log("email found");
} else {
let userid = await getUserByEmail(req.body.email);
if (!userid) return false;
const token = await addToken(userid.id, "canRead" , "2204-01-24 07:34:36" );
const tokenRes = await checkToken(userid.id);
if (tokenRes.isKey !== "null" && tokenRes.isKey !== "isKey") {
//allow user to create token
const token = await addToken(
userid.id,
"canRead",
"isKey",
"2204-01-24 07:34:36"
);
if (!token) return false;
sendTokenEmail(req.body.email, token);
res.json({
message: "Token generated successfully and sent to email",
})
});
}
}
//const token = await addToken(req.body.userid, "canRead" , "2204-01-24 07:34:36" );
//res.json({token: token});
} catch (error) {
@ -47,6 +51,4 @@ router.post("/new", async (req, res, next) => {
}
});
module.exports = router;

View File

@ -7,7 +7,7 @@ const router = express.Router();
//getbyid
router.get("/me", async function (req, res, next) {
try {
let user = await getUserByID(req.user);
let user = await getUserByID(req.user); //req.user assigned in middleware!
//console.log(user);
res.json({
user: user,

View File

@ -41,14 +41,14 @@
</div>
<ul>
<li class="scroll-to-link active" data-target="content-get-started">
<a>GET STARTED</a>
</li>
<li class="scroll-to-link" data-target="content-errors">
<a>Errors</a>
<a>Get Started</a>
</li>
<li class="scroll-to-link" data-target="content-get-api">
<a>Generate API</a>
</li>
<li class="scroll-to-link" data-target="content-errors">
<a>Errors</a>
</li>
</ul>
</div>
</div>