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 (