ADD A PRODUCT ID TO THE ROUTE

On va generer un unique id bidon

save() {
    this.id = Math.random().toString();
    ...
  }
// in the html : 
<a href="/products/<%= product.id %>" class="btn">Détails</a>

EXTRACT THE ID FROM THE URL

Définir la route :

router.get('/products/:productId', shopController)
// dans le controller on recupere l'id de cette facon :
exports.getProduct = (req, res, next) => {
    const prodId = req.params.productId;
    Product.findByID(prodId, (product) => {
        console.log(product)
    });
}

Définir la méthode findByID dans notre model

static findByID(index, cb) {
    getProductsFromFile(products => {
      const product = products.find(p => p.id === index)
      cb(product);
    })
  }

PASSING DATA WITH POST REQUEST

Dans notre product-detail :

<form action="/cart" method="post">
                <button class="btn" type="submit">Add to Cart</button>
// je met en hidden pour ne pas le voir mais avoir quand même le champ dans notre POST
                <input type="hidden" name="productId" value="<%= product.id %>">
            </form>

On utilise notre route /cart avec POST maintenant donc on doit creer la route :

router.post('/cart', shopController.postCart)
// puis on s'occupe du controller : 
exports.postCart = (req, res, next) => {
  // ici productId car c'est le name="" donné dans la view avec hidden input
  const productId = req.body.productId;
	console.log(productId)
};

Exemple de Model pour un Shopping Cart :

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 previous cart
        fs.readFile(p, (err, fileContent) => {
            let cart = { products: [], totalPrice: 0 }
            if (!err) {
                cart = JSON.parse(fileContent);
            }
            // analyse => find existing product
            const existingProductIndex = cart.products.findIndex(prod => prod.id === id)
            const existingProduct = cart.products[existingProductIndex]
            let updatedProduct;
            // add nex product / increase qty
            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)
            })
        })
    }
}

QUERY PARAMS

Nous allons utiliser les query param pour editer nos produits :

// controller : 
exports.getEditProduct = (req, res, next) => {
// pour accéder aux query params : 
// edit ici fait reference au lien :
// <http://localhost:3000/admin/edit-product/123245?edit=true>
  const editMode = req.query.edit;
  if (!editMode) {
    return res.redirect("/");
  }
  // get product Id
  const prodId = req.params.productId;
// find the product
  Product.findById(prodId, product => {
    if (!product) {
      return res.redirect("/")
    }
    res.render('admin/edit-product', {
      pageTitle: 'Edit Product',
      path: '/admin/edit-product',
      editing: editMode,
      product: product
    });
  })
};
// route : 
router.get('/edit-product/:productId', adminController.getEditProduct);