Fixed updating of cart + added retrieval of cart & specs

master
Mark Moffat 2019-12-20 09:38:46 +10:30
parent ddf78c1618
commit 588fdddb75
4 changed files with 71 additions and 30 deletions

View File

@ -443,12 +443,10 @@ function updateCart(){
// gather items of cart
var cartItems = [];
$('.cart-product-quantity').each(function(){
var item = {
cartIndex: $(this).attr('id'),
itemQuantity: $(this).val(),
productId: $(this).attr('data-id')
};
cartItems.push(item);
cartItems.push({
productId: $(this).attr('data-id'),
quantity: $(this).val()
});
});
// update cart on server

File diff suppressed because one or more lines are too long

View File

@ -192,6 +192,16 @@ router.get('/product/:id', async (req, res) => {
});
});
// Gets the current cart
router.get('/cart/retrieve', async (req, res, next) => {
const db = req.app.db;
// Get the cart from the DB using the session id
const cart = await db.cart.findOne({ sessionId: getId(req.session.id) });
res.status(200).json({ cart: cart.cart });
});
// Updates a single product quantity
router.post('/product/updatecart', (req, res, next) => {
const db = req.app.db;
@ -201,34 +211,41 @@ router.post('/product/updatecart', (req, res, next) => {
let stockError = false;
async.eachSeries(cartItems, async (cartItem, callback) => {
const productQuantity = cartItem.itemQuantity ? cartItem.itemQuantity : 1;
if(cartItem.itemQuantity === 0){
// quantity equals zero so we remove the item
req.session.cart.splice(cartItem.cartIndex, 1);
callback(null);
}else{
const product = await db.products.findOne({ _id: getId(cartItem.productId) });
if(product){
// If stock management on check there is sufficient stock for this product
if(config.trackStock){
if(productQuantity > product.productStock){
hasError = true;
stockError = true;
callback(null);
return;
}
}
// Find index in cart
const cartIndex = _.findIndex(req.session.cart, { productId: cartItem.productId });
const productPrice = parseFloat(product.productPrice).toFixed(2);
if(req.session.cart[cartItem.cartIndex]){
req.session.cart[cartItem.cartIndex].quantity = productQuantity;
req.session.cart[cartItem.cartIndex].totalItemPrice = productPrice * productQuantity;
// Calculate the quantity to update
let productQuantity = cartItem.quantity ? cartItem.quantity : 1;
if(typeof productQuantity === 'string'){
productQuantity = parseInt(productQuantity);
}
if(productQuantity === 0){
// quantity equals zero so we remove the item
req.session.cart.splice(cartIndex, 1);
callback(null);
return;
}
const product = await db.products.findOne({ _id: getId(cartItem.productId) });
if(product){
// If stock management on check there is sufficient stock for this product
if(config.trackStock){
if(productQuantity > product.productStock){
hasError = true;
stockError = true;
callback(null);
return;
}
}else{
hasError = true;
}
const productPrice = parseFloat(product.productPrice).toFixed(2);
if(req.session.cart[cartIndex]){
req.session.cart[cartIndex].quantity = productQuantity;
req.session.cart[cartIndex].totalItemPrice = productPrice * productQuantity;
callback(null);
}
}else{
hasError = true;
callback(null);
}
}, async () => {
// update total cart amount

View File

@ -70,6 +70,32 @@ test('[Success] Add product to cart', async t => {
t.deepEqual(res.body.message, 'Cart successfully updated');
});
test('[Success] Update cart', async t => {
const cart = await g.request
.get('/cart/retrieve')
.expect(200);
// Adjust the quantity of an item
cart.body.cart[0].quantity = 10;
const res = await g.request
.post('/product/updatecart')
.send({
items: JSON.stringify(cart.body.cart)
})
.expect(200);
t.deepEqual(res.body.message, 'Cart successfully updated');
const checkCart = await g.request
.get('/cart/retrieve')
.expect(200);
// Check new quantity and total price has been updated
t.deepEqual(checkCart.body.cart[0].quantity, 10);
t.deepEqual(checkCart.body.cart[0].totalItemPrice, cart.body.cart[0].totalItemPrice * 10);
});
test('[Fail] Cannot add subscripton when other product in cart', async t => {
const res = await g.request
.post('/product/addtocart')