const fs = require("fs")
const { json } = require("node:stream/consumers") //acá deberías usar los imports de ESModules como acordamos al inicio del curso. Para ello falta el package.json
class ProductManager {
constructor(path) {
this.path = path,
this.products = [
]
}
getProduct = async () => {
const listOfProducts = await fs.promises.readFile(this.path, "utf-8")
const listOfProductsParse = JSON.parse(listOfProducts)
return listOfProductsParse
}
generateId = async () => {
const counter = this.products.length
if (counter === 0) {
return 1
} else {
return (this.products[counter - 1].id) + 1
}
}
addProduct = async (title, description, price, image, code, stock) => {
if (!title || !description || !price || !image || !code || !stock) {
console.error("Ingresa todos los datos del producto")
return
} else {
const coderepet = this.products.find(element => element.code === code)
if (!coderepet) { //este condicional no es correcto, está haciendo que si el código no está repetido (find devuelve undefined) entonces entrá acá
console.error("El codigo del producto es repetido")
return
} else {
const generatedIds = await this.generateId()
const productNew = {
id: generatedIds, title, description, price, image, code, stock
}
this.products.push(productNew)
await fs.promises.writeFile(this.path, JSON.stringify(this.products, null, 2))
}
}
}
updateProduct = async (id, title, description, price, image, code, stock) => {
if (!id || !title || !description || !price || !image || !code || !stock) {
console.error("Ingresa todos los datos del producto para su correcta actualizacion")
return
} else {
const allproducts = await this.getProduct()
const coderepet = allproducts.find(element => element.code === code)
if (coderepet) {
console.error("El codigo del producto que desea actualizar se encuentra repetido")
return
} else {
const currentProductsList = await this.getProduct()
const newProductsList = currentProductsList.map(element => {
if (element.id === id) {
const updatedProduct = {
...element, title, description, price, image, code, stock
}
return updatedProduct
} else {
return element
}
})
await fs.promises.writeFile(this.path, JSON.stringify(newProductsList, null, 2))
}
}
}
delateProduct = async (id) => {
const allproducts = await this.getProduct()
const productsNotFound = allproducts.filter (element => element.id === id)
//acá hay dos temas: primero el nombre de la variable no corresponde a lo que representa.
//podría ser filteredProducts
//segundo: la confición no es correcta para lo que se busca, debería ser !== porque justamente buscas filtrar los productos que querés conservar.
await fs.promises.writeFile(this.path, JSON.stringify(productsNotFound, null, 2))
//esto no es correcto, se está escribiendo en el archivo el producto que supuestamente hay que eliminar
}
getProductById = async(id) => {
const allproducts = await this.getProduct()
const found = allproducts.find(element => element.id === id)
return found
}
}
async function generator() {
const productManager = new ProductManager("./path/products.json");
//const list = await productManager.getProduct()
const only = await productManager.getProductById(1)
console.log(only)
}
generator()