...
exports.postCart = (req, res, next) => {
const prodId = req.body.productId;
Product.findById(prodId, (product) => {
Cart.addProduct(prodId, product.price);
});
res.redirect("/cart");
};
...
Cart에 물건이 담길 때, 새로운 물건이면 id를 추가해 주어야 하고 기존에 있던 id라면 수량 및 가격을 변경 할 수 있어야 한다. 따라서 물건의 id를 찾는 메서드를 만들어서 사용해야 한다.
module.exports = class Product {
constructor(title, imageUrl, description, price) {
this.title = title;
this.imageUrl = imageUrl;
this.description = description;
this.price = price;
}
...
static findById(id, cb) {
getProductsFromFile((products) => {
const product = products.find((p) => p.id === id);
cb(product);
});
}
};
Product class 내부 함수에 값을 전달 할 수 있게 하기 위해서 static을 이용한다. 그래서 Controller shop.js의 prodId인자를 받아 올 수 있게하자.
const fs = require("fs");
const path = require("path");
const p = path.join(
path.dirname(process.mainModule.filename),
"data",
"cart.json"
);
module.exports = class Cart {
static addProduct(id, productPrice) {
// Fetch the previous cart
fs.readFile(p, (err, fileContent) => {
let cart = { products: [], totalPrice: 0 };
if (!err) {
cart = JSON.parse(fileContent);
}
// Analyze the cart => Find existing product
const existingProductIndex = cart.products.findIndex(
(prod) => prod.id === id
);
const existingProduct = cart.products[existingProductIndex];
let updatedProduct;
// Add new product/ increase quantity
if (existingProduct) {
updatedProduct = { ...existingProduct };
updatedProduct.qty = updatedProduct.qty + 1;
cart.products = [...cart.products];
cart.products[existingProductIndex] = updatedProduct;
} else {
updatedProduct = { id: id, qty: 1 };
cart.products = [...cart.products, updatedProduct];
}
cart.totalPrice = cart.totalPrice + +productPrice;
fs.writeFile(p, JSON.stringify(cart), (err) => {
console.log(err);
});
});
}
};