diff --git a/backendV2/routes/admin/database/itemDataMgmt.database.js b/backendV2/routes/admin/database/itemDataMgmt.database.js index e69de29..9aa392f 100644 --- a/backendV2/routes/admin/database/itemDataMgmt.database.js +++ b/backendV2/routes/admin/database/itemDataMgmt.database.js @@ -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 const getAllItems = async () => { + const [result] = await pool.query("SELECT * FROM items"); + if (result.length > 0) return { success: true, data: result }; + return { success: false }; +}; + +export const deleteItemById = async (itemId) => { + const [result] = await pool.query("DELETE FROM items WHERE id = ?", [itemId]); + if (result.affectedRows > 0) return { success: true }; + return { success: false }; +}; + +export const createItem = async (item_name, can_borrow_role, in_safe) => { + const [result] = await pool.query( + "INSERT INTO items (item_name, can_borrow_role, in_safe) VALUES (?, ?, ?)", + [item_name, can_borrow_role, in_safe] + ); + if (result.affectedRows > 0) return { success: true }; + return { success: false }; +}; + +export const editItemById = async (itemId, item_name, can_borrow_role) => { + const [result] = await pool.query( + "UPDATE items SET item_name = ?, can_borrow_role = ? WHERE id = ?", + [item_name, can_borrow_role, itemId] + ); + if (result.affectedRows > 0) return { success: true }; + return { success: false }; +}; diff --git a/backendV2/routes/admin/database/loanDataMgmt.database.js b/backendV2/routes/admin/database/loanDataMgmt.database.js index e69de29..5bdee37 100644 --- a/backendV2/routes/admin/database/loanDataMgmt.database.js +++ b/backendV2/routes/admin/database/loanDataMgmt.database.js @@ -0,0 +1,23 @@ +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 const getAllLoans = async () => { + const [rows] = await pool.query("SELECT * FROM loans"); + return { success: true, data: rows }; +}; + +export const deleteLoanById = async (loanId) => { + const [result] = await pool.query("DELETE FROM loans WHERE id = ?", [loanId]); + if (result.affectedRows > 0) return { success: true }; + return { success: false }; +}; diff --git a/backendV2/routes/admin/itemDataMgmt.route.js b/backendV2/routes/admin/itemDataMgmt.route.js index e69de29..9762b8b 100644 --- a/backendV2/routes/admin/itemDataMgmt.route.js +++ b/backendV2/routes/admin/itemDataMgmt.route.js @@ -0,0 +1,66 @@ +import express from "express"; +import { authenticateAdmin } from "../../services/authentication.js"; +const router = express.Router(); +import dotenv from "dotenv"; +dotenv.config(); + +// database funcs import +import { + editItemById, + getAllItems, + deleteItemById, + createItem, + changeSafeState, +} from "./database/itemDataMgmt.database.js"; + +router.get("/all-items", authenticateAdmin, async (req, res) => { + const result = await getAllItems(); + if (result.success) { + return res.status(200).json({ items: result.data }); + } + return res.status(500).json({ message: "Failed to retrieve items" }); +}); + +router.delete("/delete-item/:id", authenticateAdmin, async (req, res) => { + const itemId = req.params.id; + const result = await deleteItemById(itemId); + if (result.success) { + return res.status(200).json({ message: "Item deleted successfully" }); + } + return res.status(500).json({ message: "Failed to delete item" }); +}); + +router.post("/create-item", authenticateAdmin, async (req, res) => { + const { item_name, can_borrow_role, in_safe } = req.body; + const result = await createItem(item_name, can_borrow_role, in_safe); + if (result.success) { + return res.status(201).json({ message: "Item created successfully" }); + } + return res.status(500).json({ message: "Failed to create item" }); +}); + +router.post("/edit-item/:id", authenticateAdmin, async (req, res) => { + const itemId = req.params.id; + const { item_name, can_borrow_role } = req.body; + const result = await editItemById( + itemId, + item_name, + can_borrow_role + ); + if (result.success) { + return res.status(200).json({ message: "Item edited successfully" }); + } + return res.status(500).json({ message: "Failed to edit item" }); +}); + +router.post("/change-safe-state/:id", authenticateAdmin, async (req, res) => { + const itemId = req.params.id; + const { in_safe } = req.body; + const result = await changeSafeState(itemId, in_safe); + if (result.success) { + return res.status(200).json({ message: "Safe state changed successfully" }); + } + return res.status(500).json({ message: "Failed to change safe state" }); +}); + +export default router; diff --git a/backendV2/routes/admin/loanDataMgmt.route.js b/backendV2/routes/admin/loanDataMgmt.route.js index e69de29..201a1d2 100644 --- a/backendV2/routes/admin/loanDataMgmt.route.js +++ b/backendV2/routes/admin/loanDataMgmt.route.js @@ -0,0 +1,30 @@ +import express from "express"; +import { authenticateAdmin } from "../../services/authentication.js"; +const router = express.Router(); +import dotenv from "dotenv"; +dotenv.config(); + +// database funcs import +import { + deleteLoanById, + getAllLoans, +} from "./database/loanDataMgmt.database.js"; + +router.get("/all-loans", authenticateAdmin, async (req, res) => { + const result = await getAllLoans(); + if (result.success) { + return res.status(200).json({ loans: result.data }); + } + return res.status(500).json({ message: "Failed to retrieve loans" }); +}); + +router.delete("/delete-loan/:id", authenticateAdmin, async (req, res) => { + const loanId = req.params.id; + const result = await deleteLoanById(loanId); + if (result.success) { + return res.status(200).json({ message: "Loan deleted successfully" }); + } + return res.status(500).json({ message: "Failed to delete loan" }); +}); + +export default router; diff --git a/backendV2/routes/admin/userDataMgmt.route.js b/backendV2/routes/admin/userDataMgmt.route.js index 3c01df1..7b57187 100644 --- a/backendV2/routes/admin/userDataMgmt.route.js +++ b/backendV2/routes/admin/userDataMgmt.route.js @@ -1,7 +1,6 @@ import express from "express"; import { authenticateAdmin } from "../../services/authentication.js"; const router = express.Router(); -import nodemailer from "nodemailer"; import dotenv from "dotenv"; dotenv.config(); diff --git a/backendV2/server.js b/backendV2/server.js index 2a1249a..08fd7d7 100644 --- a/backendV2/server.js +++ b/backendV2/server.js @@ -1,9 +1,16 @@ import express from "express"; import cors from "cors"; import env from "dotenv"; + +// frontend routes import loansMgmtRouter from "./routes/app/loanMgmt.route.js"; import userMgmtRouter from "./routes/app/userMgmt.route.js"; -import userDataMgmtRouter from "./routes/admin/userDataMgmt.route.js" + +// admin routes +import userDataMgmtRouter from "./routes/admin/userDataMgmt.route.js"; +import loanDataMgmtRouter from "./routes/admin/loanDataMgmt.route.js"; +import itemDataMgmtRouter from "./routes/admin/itemDataMgmt.route.js"; + env.config(); const app = express(); const port = 8002; @@ -14,8 +21,9 @@ app.use("/api/loans", loansMgmtRouter); app.use("/api/users", userMgmtRouter); // admin routes - +app.use("/api/admin/loan-data", loanDataMgmtRouter); app.use("/api/admin/user-data", userDataMgmtRouter); +app.use("/api/admin/item-data", itemDataMgmtRouter); // Increase body size limits to support large CSV JSON payloads app.use(express.urlencoded({ extended: true, limit: "10mb" }));