added new feature: service config; Currently implemented in: loanMgmt and userMgmt (only Backend)
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
import { authenticate, generateToken } from "../../services/authentication.js";
|
import { authenticate, generateToken } from "../../services/authentication.js";
|
||||||
|
import {
|
||||||
|
checkIfServiceIsActive,
|
||||||
|
checkIfServiceIsActive2,
|
||||||
|
} from "../../services/functions.js";
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
import dotenv from "dotenv";
|
import dotenv from "dotenv";
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
@@ -18,7 +22,11 @@ import {
|
|||||||
} from "./database/loansMgmt.database.js";
|
} from "./database/loansMgmt.database.js";
|
||||||
import { sendMailLoan } from "./services/mailer.js";
|
import { sendMailLoan } from "./services/mailer.js";
|
||||||
|
|
||||||
router.post("/createLoan", authenticate, async (req, res) => {
|
router.post(
|
||||||
|
"/createLoan",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { items, startDate, endDate, note } = req.body || {};
|
const { items, startDate, endDate, note } = req.body || {};
|
||||||
|
|
||||||
@@ -54,6 +62,7 @@ router.post("/createLoan", authenticate, async (req, res) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
|
if (await checkIfServiceIsActive2("Loan Mailer")) {
|
||||||
const mailInfo = await getLoanInfoWithID(result.data.id);
|
const mailInfo = await getLoanInfoWithID(result.data.id);
|
||||||
console.log(mailInfo);
|
console.log(mailInfo);
|
||||||
sendMailLoan(
|
sendMailLoan(
|
||||||
@@ -64,6 +73,8 @@ router.post("/createLoan", authenticate, async (req, res) => {
|
|||||||
mailInfo.data.created_at,
|
mailInfo.data.created_at,
|
||||||
mailInfo.data.note,
|
mailInfo.data.note,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return res.status(201).json({
|
return res.status(201).json({
|
||||||
message: "Loan created successfully",
|
message: "Loan created successfully",
|
||||||
loanId: result.data.id,
|
loanId: result.data.id,
|
||||||
@@ -86,9 +97,14 @@ router.post("/createLoan", authenticate, async (req, res) => {
|
|||||||
console.error("createLoan error:", err);
|
console.error("createLoan error:", err);
|
||||||
return res.status(500).json({ message: "Failed to create loan" });
|
return res.status(500).json({ message: "Failed to create loan" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.get("/loans", authenticate, async (req, res) => {
|
router.get(
|
||||||
|
"/loans",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const result = await getLoansFromDatabase(req.user.username);
|
const result = await getLoansFromDatabase(req.user.username);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
res.status(200).json(result.data);
|
res.status(200).json(result.data);
|
||||||
@@ -97,9 +113,14 @@ router.get("/loans", authenticate, async (req, res) => {
|
|||||||
} else {
|
} else {
|
||||||
res.status(500).json({ message: "Failed to fetch loans" });
|
res.status(500).json({ message: "Failed to fetch loans" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/set-return-date/:loan_code", authenticate, async (req, res) => {
|
router.post(
|
||||||
|
"/set-return-date/:loan_code",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const loanCode = req.params.loan_code;
|
const loanCode = req.params.loan_code;
|
||||||
const result = await setReturnDate(loanCode);
|
const result = await setReturnDate(loanCode);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
@@ -107,9 +128,14 @@ router.post("/set-return-date/:loan_code", authenticate, async (req, res) => {
|
|||||||
} else {
|
} else {
|
||||||
res.status(500).json({ message: "Failed to set return date" });
|
res.status(500).json({ message: "Failed to set return date" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/set-take-date/:loan_code", authenticate, async (req, res) => {
|
router.post(
|
||||||
|
"/set-take-date/:loan_code",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const loanCode = req.params.loan_code;
|
const loanCode = req.params.loan_code;
|
||||||
const result = await setTakeDate(loanCode);
|
const result = await setTakeDate(loanCode);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
@@ -117,7 +143,8 @@ router.post("/set-take-date/:loan_code", authenticate, async (req, res) => {
|
|||||||
} else {
|
} else {
|
||||||
res.status(500).json({ message: "Failed to set take date" });
|
res.status(500).json({ message: "Failed to set take date" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.get("/all-items", authenticate, async (req, res) => {
|
router.get("/all-items", authenticate, async (req, res) => {
|
||||||
const result = await getItems();
|
const result = await getItems();
|
||||||
@@ -128,7 +155,11 @@ router.get("/all-items", authenticate, async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
router.delete("/delete-loan/:id", authenticate, async (req, res) => {
|
router.delete(
|
||||||
|
"/delete-loan/:id",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const loanId = req.params.id;
|
const loanId = req.params.id;
|
||||||
const result = await SETdeleteLoanFromDatabase(loanId);
|
const result = await SETdeleteLoanFromDatabase(loanId);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
@@ -146,18 +177,28 @@ router.delete("/delete-loan/:id", authenticate, async (req, res) => {
|
|||||||
|
|
||||||
res.status(500).json({ message: "Failed to delete loan" });
|
res.status(500).json({ message: "Failed to delete loan" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.get("/all-loans", authenticate, async (req, res) => {
|
router.get(
|
||||||
|
"/all-loans",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const result = await getALLLoans();
|
const result = await getALLLoans();
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
res.status(200).json(result.data);
|
res.status(200).json(result.data);
|
||||||
} else {
|
} else {
|
||||||
res.status(500).json({ message: "Failed to fetch loans" });
|
res.status(500).json({ message: "Failed to fetch loans" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/borrowable-items", authenticate, async (req, res) => {
|
router.post(
|
||||||
|
"/borrowable-items",
|
||||||
|
checkIfServiceIsActive("Loan Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const { startDate, endDate } = req.body || {};
|
const { startDate, endDate } = req.body || {};
|
||||||
if (!startDate || !endDate) {
|
if (!startDate || !endDate) {
|
||||||
return res
|
return res
|
||||||
@@ -178,6 +219,7 @@ router.post("/borrowable-items", authenticate, async (req, res) => {
|
|||||||
.status(500)
|
.status(500)
|
||||||
.json({ message: "Failed to fetch borrowable items" });
|
.json({ message: "Failed to fetch borrowable items" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
import { authenticate, generateToken } from "../../services/authentication.js";
|
import { authenticate, generateToken } from "../../services/authentication.js";
|
||||||
|
import { checkIfServiceIsActive } from "../../services/functions.js";
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
import dotenv from "dotenv";
|
import dotenv from "dotenv";
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
@@ -8,7 +9,10 @@ dotenv.config();
|
|||||||
import { loginFunc, changePassword } from "./database/userMgmt.database.js";
|
import { loginFunc, changePassword } from "./database/userMgmt.database.js";
|
||||||
import { sendMail } from "./services/mailer_v2.js";
|
import { sendMail } from "./services/mailer_v2.js";
|
||||||
|
|
||||||
router.post("/login", async (req, res) => {
|
router.post(
|
||||||
|
"/login",
|
||||||
|
checkIfServiceIsActive("User Frontend"),
|
||||||
|
async (req, res) => {
|
||||||
const result = await loginFunc(req.body.username, req.body.password);
|
const result = await loginFunc(req.body.username, req.body.password);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
const token = await generateToken({
|
const token = await generateToken({
|
||||||
@@ -22,9 +26,14 @@ router.post("/login", async (req, res) => {
|
|||||||
} else {
|
} else {
|
||||||
res.status(401).json({ message: "Invalid credentials" });
|
res.status(401).json({ message: "Invalid credentials" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/change-password", authenticate, async (req, res) => {
|
router.post(
|
||||||
|
"/change-password",
|
||||||
|
checkIfServiceIsActive("User Frontend"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const oldPassword = req.body.oldPassword;
|
const oldPassword = req.body.oldPassword;
|
||||||
const newPassword = req.body.newPassword;
|
const newPassword = req.body.newPassword;
|
||||||
const username = req.user.username;
|
const username = req.user.username;
|
||||||
@@ -34,15 +43,21 @@ router.post("/change-password", authenticate, async (req, res) => {
|
|||||||
} else {
|
} else {
|
||||||
res.status(500).json({ message: "Failed to change password" });
|
res.status(500).json({ message: "Failed to change password" });
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/contact", authenticate, async (req, res) => {
|
router.post(
|
||||||
|
"/contact",
|
||||||
|
checkIfServiceIsActive("Contact Form Service"),
|
||||||
|
authenticate,
|
||||||
|
async (req, res) => {
|
||||||
const message = req.body.message;
|
const message = req.body.message;
|
||||||
const username = req.user.username;
|
const username = req.user.username;
|
||||||
|
|
||||||
sendMail(username, message);
|
sendMail(username, message);
|
||||||
|
|
||||||
res.status(200).json({ message: "Contact message sent successfully" });
|
res.status(200).json({ message: "Contact message sent successfully" });
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
@@ -55,3 +55,14 @@ CREATE TABLE apiKeys (
|
|||||||
PRIMARY KEY (id),
|
PRIMARY KEY (id),
|
||||||
CHECK (api_key REGEXP '^[0-9]{8}$')
|
CHECK (api_key REGEXP '^[0-9]{8}$')
|
||||||
) ENGINE=InnoDB;
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE functions (
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
function_name VARCHAR(500) NOT NULL UNIQUE,
|
||||||
|
active BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
entry_updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
entry_created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
INSERT INTO functions (function_name) VALUES ("Loan Mailer"), ("Loan Service"), ("Contact Form Service"), ("User Frontend"), ("API")
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import mysql from "mysql2";
|
||||||
|
import dotenv from "dotenv";
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
const pool = mysql
|
||||||
|
.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_NAME,
|
||||||
|
})
|
||||||
|
.promise();
|
||||||
|
|
||||||
|
export function checkIfServiceIsActive(service) {
|
||||||
|
return async (req, res, next) => {
|
||||||
|
const [result] = await pool.query(
|
||||||
|
"SELECT * FROM functions WHERE function_name = ? AND active = 1;",
|
||||||
|
[service],
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result.length > 0) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
.status(503)
|
||||||
|
.json({ message: `-${service}- is currently unavailable.` });
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function checkIfServiceIsActive2(service) {
|
||||||
|
const [result] = await pool.query(
|
||||||
|
"SELECT * FROM functions WHERE function_name = ? AND active = 1;",
|
||||||
|
[service],
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result.length > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user