diff --git a/package-lock.json b/package-lock.json index 729aa63..85488f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "axios": "^1.6.8", "bcrypt": "^5.1.1", "buffer": "^6.0.3", + "chart.js": "^4.4.3", "dotenv": "^16.4.5", "eslint-config-google": "^0.14.0", "js-cookie": "^3.0.5", @@ -3290,6 +3291,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -5157,6 +5163,17 @@ "node": ">=10" } }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", diff --git a/package.json b/package.json index 40ca38f..546f7c8 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "axios": "^1.6.8", "bcrypt": "^5.1.1", "buffer": "^6.0.3", + "chart.js": "^4.4.3", "dotenv": "^16.4.5", "eslint-config-google": "^0.14.0", "js-cookie": "^3.0.5", diff --git a/packages/express-backend/backend.js b/packages/express-backend/backend.js index da3e428..c24bee5 100644 --- a/packages/express-backend/backend.js +++ b/packages/express-backend/backend.js @@ -103,6 +103,13 @@ app.post("/users/profile", userService.authenticateUser, (req, res) => { }); }); +app.get("/user-stats", userService.authenticateUser, (req, res) => { + const id = req.userID; + userService.getProductOrderCounts(id).then(result => { + res.send(result) + }) +}) + app.get("/users", userService.authenticateUser, (req, res) => { const id = req.userID; userService @@ -294,13 +301,13 @@ app.get("/orders/:find", userService.authenticateUser, (req, res) => { }); app.post("/orders", userService.authenticateUser, (req, res) => { - //console.log(req.body); const orderToAdd = req.body; + console.log(orderToAdd); orderService .addOrder(orderToAdd) .then((result) => { const UserID = req.userID; - userService.addOrderToUser(UserID, result.id); + userService.addOrderToUser(UserID, result); console.log(result); res.status(201).send(result); }) @@ -359,10 +366,17 @@ app.post("/order-units", userService.authenticateUser, (req, res) => { console.log(orderToAdd); userService.hasProduct(UserID, orderToAdd.product).then(has => { if (has) { - orderUnitService - .addOrder(orderToAdd) - .then((result) => { - res.status(201).send(result); + userService.quantityCheck(UserID, orderToAdd.product, orderToAdd.quantity).then(good => { + if (good == true) { + orderUnitService + .addOrder(orderToAdd) + .then((result) => { + res.status(201).send(result); + }) + } + else { + res.status(400).send(good.toString()); + } }) } else { res.status(204).send(orderToAdd.product); diff --git a/packages/express-backend/services/order-unit-service.js b/packages/express-backend/services/order-unit-service.js index 6f84b12..605b17f 100644 --- a/packages/express-backend/services/order-unit-service.js +++ b/packages/express-backend/services/order-unit-service.js @@ -29,7 +29,6 @@ function removeOrder(id) { } function addOrder(order_unit) { - //console.log(order_unit); const OrderToAdd = new OrderUnitModel(order_unit); const promise = OrderToAdd.save(); return promise; diff --git a/packages/express-backend/services/product-service.js b/packages/express-backend/services/product-service.js index 164d222..d6fd7f2 100644 --- a/packages/express-backend/services/product-service.js +++ b/packages/express-backend/services/product-service.js @@ -39,9 +39,6 @@ function addProduct(product) { $set: { price: product.price } }; - console.log(product.quantity); - console.log(product); - // Only include $inc for quantity if it is not null if (product.quantity !== null && product.quantity !== undefined && product.quantity !== "") { updateObject.$inc = { quantity: product.quantity }; } diff --git a/packages/express-backend/services/user-service.js b/packages/express-backend/services/user-service.js index e187dd1..ddda3cf 100644 --- a/packages/express-backend/services/user-service.js +++ b/packages/express-backend/services/user-service.js @@ -199,22 +199,58 @@ function removeProductFromUserID(userID, productIDToRemove) { return UserModel.updateOne({ _id: userID }, { $pull: { products: productIDToRemove } }); } -async function addOrderToUser(id, orderId) { +async function addOrderToUser(id, order) { try { - const user = await UserModel.findById(id); + const user = await UserModel.findById(id).populate('products'); if (!user) { throw new Error("User not found"); } + for (const item of order.items) { + const product = user.products.find(prod => prod.product === item.product); - user.orders.push(orderId); + if (!product) { + throw new Error(`Product ${item.product} not found for user ${id}`); + } + product.quantity -= item.quantity; + await product.save(); + } + user.orders.push(order.id); await user.save(); - console.log(`Product ${orderId} added to user ${id}`); + console.log(`Order ${order.id} added to user ${id}`); } catch (error) { - console.error("Error adding product to user:", error); + console.error("Error adding order to user:", error); } } +async function getProductOrderCounts(userId) { + try { + const user = await UserModel.findById(userId).populate('products orders'); + + if (!user) { + throw new Error("User not found"); + } + + + const productOrderCounts = {}; + for (const product of user.products) { + let productCount = 0; + for (const order of user.orders) { + const orderContainsProduct = order.items.some(item => item.product === product.product); + if (orderContainsProduct) { + productCount++; + } + } + productOrderCounts[product.product] = productCount; + } + return productOrderCounts; + } catch (error) { + console.error("Error getting product order counts:", error); + throw error; + } +} + + function removeOrderFromUserID(userID, orderIDToRemove) { return UserModel.updateOne({ _id: userID }, { $pull: { orders: orderIDToRemove } }); } @@ -224,12 +260,28 @@ async function hasProduct(userID, productName) { if (!user || !user.products) { return false; } - console.log("delapaz") - console.log(user.products) - console.log(productName) return user.products.some(product => product.product === productName); } +async function quantityCheck(userID, productName, desiredQuantity) { + const user = await findUserById(userID).populate("products"); + if (!user || !user.products) { + return false; + } + let product = null; + for (let i = 0; i < user.products.length; i++) { + if (user.products[i].product === productName) { + product = user.products[i]; + break; + } +} + if (product.quantity < desiredQuantity) { + return product.quantity; + } + return true; +} + + export default { addUser, removeUser, @@ -246,5 +298,7 @@ export default { removeProductFromUserID, addOrderToUser, removeOrderFromUserID, - hasProduct + hasProduct, + quantityCheck, + getProductOrderCounts }; \ No newline at end of file diff --git a/packages/react-frontend/src/Components/Navbar.jsx b/packages/react-frontend/src/Components/Navbar.jsx index e4f3478..0246557 100644 --- a/packages/react-frontend/src/Components/Navbar.jsx +++ b/packages/react-frontend/src/Components/Navbar.jsx @@ -12,6 +12,7 @@ import ProductPage from "../Views/ProductPage"; import AboutUs from "../Views/AboutUs"; import TermsAndConds from "../Views/TermsAndConds"; import EditProfile from "../Views/EditProfile"; + import "../Styles/Navbar.css"; function App() { @@ -73,7 +74,7 @@ function NavBar() { Manage Orders
  • -    Add Orders + Add Orders
  • @@ -100,6 +101,7 @@ function NavBar() { ); } + function Footer() { return (