From 90ca266793de3de67b3ddbbb5175c2052e81e17b Mon Sep 17 00:00:00 2001 From: Theis Gaedigk Date: Sun, 23 Nov 2025 20:26:49 +0100 Subject: [PATCH 1/3] changed docker config --- FrontendV2/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrontendV2/Dockerfile b/FrontendV2/Dockerfile index 6d0dfae..3611744 100644 --- a/FrontendV2/Dockerfile +++ b/FrontendV2/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18 as builder +FROM node:22-alpine AS builder WORKDIR /app From 4b9f55268cca2ba0ce1124d87a7d9b6c248d8004 Mon Sep 17 00:00:00 2001 From: Theis Gaedigk Date: Sun, 23 Nov 2025 21:25:08 +0100 Subject: [PATCH 2/3] updated scheme --- backendV2/schemeV2.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backendV2/schemeV2.sql b/backendV2/schemeV2.sql index cdd0a16..7e44a57 100644 --- a/backendV2/schemeV2.sql +++ b/backendV2/schemeV2.sql @@ -37,7 +37,7 @@ CREATE TABLE items ( item_name varchar(255) NOT NULL UNIQUE, can_borrow_role INT NOT NULL, in_safe bool NOT NULL DEFAULT true, - safe_nr CHAR(2) DEFAULT NULL UNIQUE, + safe_nr CHAR(2) DEFAULT NULL, entry_created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, entry_updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, last_borrowed_person varchar(255) DEFAULT NULL, @@ -46,6 +46,10 @@ CREATE TABLE items ( CHECK (safe_nr REGEXP '^[0-9]{2}$' OR safe_nr IS NULL) ) ENGINE=InnoDB; +CREATE UNIQUE INDEX ux_items_safe_nr_not_null +ON items (safe_nr) +WHERE safe_nr IS NOT NULL; + CREATE TABLE apiKeys ( id INT NOT NULL AUTO_INCREMENT, api_key CHAR(8) NOT NULL UNIQUE, From 85e6d7fe001c2c3519fcbddb043630873145dcac Mon Sep 17 00:00:00 2001 From: Theis Gaedigk Date: Sun, 23 Nov 2025 21:39:18 +0100 Subject: [PATCH 3/3] fixed bugs --- admin/src/components/ItemTable.tsx | 2 +- admin/src/utils/userActions.ts | 3 +-- .../admin/database/itemDataMgmt.database.js | 17 ++++++++++++++--- backendV2/routes/admin/itemDataMgmt.route.js | 6 ++++-- backendV2/schemeV2.sql | 3 ++- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/admin/src/components/ItemTable.tsx b/admin/src/components/ItemTable.tsx index b72512b..16336e0 100644 --- a/admin/src/components/ItemTable.tsx +++ b/admin/src/components/ItemTable.tsx @@ -68,7 +68,7 @@ const ItemTable: React.FC = () => { const handleLockerNumberChange = (id: number, value: string) => { setItems((prev) => - prev.map((it) => (it.id === id ? { ...it, lockerNumber: value } : it)) + prev.map((it) => (it.id === id ? { ...it, safe_nr: value } : it)) ); }; diff --git a/admin/src/utils/userActions.ts b/admin/src/utils/userActions.ts index 76eea03..eb254a1 100644 --- a/admin/src/utils/userActions.ts +++ b/admin/src/utils/userActions.ts @@ -200,7 +200,6 @@ export const handleEditItems = async ( safe_nr: string | null, can_borrow_role: string ) => { - const newSafeNr = Number(safe_nr || 0); try { const response = await fetch( `${API_BASE}/api/admin/item-data/edit-item/${itemId}`, @@ -210,7 +209,7 @@ export const handleEditItems = async ( "Content-Type": "application/json", Authorization: `Bearer ${Cookies.get("token")}`, }, - body: JSON.stringify({ item_name, newSafeNr, can_borrow_role }), + body: JSON.stringify({ item_name, safe_nr, can_borrow_role }), } ); if (!response.ok) { diff --git a/backendV2/routes/admin/database/itemDataMgmt.database.js b/backendV2/routes/admin/database/itemDataMgmt.database.js index 98bbc30..2637f9c 100644 --- a/backendV2/routes/admin/database/itemDataMgmt.database.js +++ b/backendV2/routes/admin/database/itemDataMgmt.database.js @@ -32,10 +32,21 @@ export const createItem = async (item_name, can_borrow_role, lockerNumber) => { return { success: false }; }; -export const editItemById = async (itemId, item_name, can_borrow_role) => { +export const editItemById = async ( + itemId, + item_name, + can_borrow_role, + safe_nr +) => { + let newSafeNr; + if (safe_nr === null || safe_nr === "") { + newSafeNr = null; + } else { + newSafeNr = safe_nr; + } const [result] = await pool.query( - "UPDATE items SET item_name = ?, can_borrow_role = ?, entry_updated_at = NOW() WHERE id = ?", - [item_name, can_borrow_role, itemId] + "UPDATE items SET item_name = ?, can_borrow_role = ?, safe_nr = ?, entry_updated_at = NOW() WHERE id = ?", + [item_name, can_borrow_role, newSafeNr, itemId] ); 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 9ca8642..77eb6ad 100644 --- a/backendV2/routes/admin/itemDataMgmt.route.js +++ b/backendV2/routes/admin/itemDataMgmt.route.js @@ -41,11 +41,13 @@ router.post("/create-item", authenticateAdmin, async (req, res) => { router.post("/edit-item/:id", authenticateAdmin, async (req, res) => { const itemId = req.params.id; - const { item_name, can_borrow_role } = req.body; + const { item_name, can_borrow_role, safe_nr } = req.body; + const result = await editItemById( itemId, item_name, - can_borrow_role + can_borrow_role, + safe_nr ); if (result.success) { return res.status(200).json({ message: "Item edited successfully" }); diff --git a/backendV2/schemeV2.sql b/backendV2/schemeV2.sql index 7e44a57..d434f5e 100644 --- a/backendV2/schemeV2.sql +++ b/backendV2/schemeV2.sql @@ -43,7 +43,8 @@ CREATE TABLE items ( last_borrowed_person varchar(255) DEFAULT NULL, currently_borrowing varchar(255) DEFAULT NULL, PRIMARY KEY (id), - CHECK (safe_nr REGEXP '^[0-9]{2}$' OR safe_nr IS NULL) + CHECK (safe_nr REGEXP '^[0-9]{2}$' OR safe_nr IS NULL), + UNIQUE KEY ux_items_safe_nr (safe_nr) ) ENGINE=InnoDB; CREATE UNIQUE INDEX ux_items_safe_nr_not_null