You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.7 KiB
JavaScript

const Cart = require('../model/Cart');
exports.addToCart = async (req, res) => {
const { userId } = req.body;
const { productId, quantity } = req.body;
try {
let cart = await Cart.findOne({ userId });
if (!cart) {
cart = new Cart({
userId,
items: [{ productId, quantity }],
});
} else {
const existingItem = cart.items.find(item => item.productId.toString() === productId);
if (existingItem) {
existingItem.quantity += quantity;
} else {
cart.items.push({ productId, quantity });
}
}
await cart.save();
res.json({ message: 'Item added to cart successfully' });
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal Server Error' });
}
};
exports.updateQuantity = async (req, res) => {
const { userId, productId, quantity } = req.body;
try {
let cart = await Cart.findOne({ userId });
if (!cart) {
return res.status(404).json({ error: 'Cart not found for the user' });
}
const existingItem = cart.items.find(item => item.productId.toString() === productId);
if (!existingItem) {
return res.status(404).json({ error: 'Product not found in the cart' });
}
existingItem.quantity = quantity;
await cart.save();
res.json({ message: 'Quantity updated successfully' });
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal Server Error' });
}
};
exports.removeFromCart = async (req, res) => {
const { userId, productId } = req.body;
try {
let cart = await Cart.findOne({ userId });
if (!cart) {
return res.status(404).json({ error: 'Cart not found for the user' });
}
cart.items = cart.items.filter(item => item.productId.toString() !== productId);
await cart.save();
res.json({ message: 'Product removed from cart successfully' });
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal Server Error' });
}
};
exports.getCartDetails = async (req, res) => {
const { userId } = req.body;
try {
const cart = await Cart.findOne({ userId }).populate('items.productId', 'name price');
if (!cart) {
return res.status(404).json({ error: 'Cart not found for the user' });
}
// Calculate subtotal for each item
const itemsWithSubtotal = cart.items.map(item => ({
...item.toObject(),
subtotal: item.quantity * item.productId.price,
}));
// Calculate total price for all items
const totalPrice = itemsWithSubtotal.reduce((total, item) => total + item.subtotal, 0);
res.json({
items: itemsWithSubtotal,
totalPrice,
});
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal Server Error' });
}
};