diff --git a/server/controllers/products.controller.js b/server/controllers/products.controller.js index 0115218..71a1048 100644 --- a/server/controllers/products.controller.js +++ b/server/controllers/products.controller.js @@ -1,179 +1,7 @@ -import Products from "../models/products.model.js"; +import ProductsModel from "../models/products.model.js"; import UserModel from "../models/users.model.js"; import { getUserFromToken } from "../utils/auth.js"; -// // Fetch product by barcode from OpenFoodFacts -// async function fetchOFFProductByBarcode(barcode) { -// const response = await axios.get( -// `https://world.openfoodfacts.net/api/v2/product/${barcode}.json`, -// { -// timeout: 30000, -// } -// ); -// return response.data.product; -// } - -// // Fetch products by search term from OpenFoodFacts -// async function fetchOFFProductsBySearch(searchTerm) { -// const response = await axios.get( -// `https://world.openfoodfacts.net/cgi/search.pl?&search_terms=${searchTerm}&json=1`, -// { -// timeout: 30000, -// } -// ); -// return response; -// } - -// // Insert product to database, updating if it already exists -// async function InsertToProductsDB(product) { -// const existingProduct = await Product.findById(product._id); -// if (existingProduct) { -// await Product.findByIdAndUpdate(product._id, product.toObject()); -// console.log(`Updated existing product with _id: ${product._id}`); -// } else { -// await product.save(); -// console.log(`Saved new product with _id: ${product._id}`); -// } -// } - -// // Insert product to user's list of foods -// async function InsertToUsersDB(user, product) { -// const userProducts = await UserModel.getUserFoods(user.id); -// // Check if product is already added to the user's foods -// if (!userProducts.products.some((up) => up._id.equals(product._id))) { -// await UserModel.addProductToUserFoods(user.id, { -// _id: product._id, -// added_at: new Date(), -// }); -// } -// } - -// // Format product data to match the database schema -// function formatProductData(responseProduct) { -// const paddedId = formatId(responseProduct._id); -// const product = new Product({ -// _id: paddedId, -// food_name: responseProduct.product_name, -// image_url: responseProduct.image_thumb_url, -// obsolete_since_date: responseProduct.obsolete_since_date, -// product_quantity: responseProduct.product_quantity, -// product_quantity_unit: responseProduct.product_quantity_unit, -// product_information: responseProduct.product_information, -// nutriments: responseProduct.nutriments, -// allergens_tags: responseProduct.allergens_tags, -// traces_tags: responseProduct.traces_tags, -// unknown_ingredients_n: responseProduct.unknown_ingredients_n, -// vitamins_tags: responseProduct.vitamins_tags, -// states_tags: responseProduct.states_tags, -// ingredients_tags: responseProduct.ingredients_tags, -// ingredients_analysis_tags: responseProduct.ingredients_analysis_tags, -// }); -// return product; -// } - -// async function displayProductByBarcode(barcode, req) { -// try { -// // Get the user ID from the JWT token in the request cookies -// const user = getUserFromToken(req); - -// // Fetch user-specific foods from the database -// const userFoods = await UserModel.getUserFoods(user.id); - -// // Create a map of user foods for quick lookup -// const userProductsMap = new Map( -// userFoods.products.map((product) => [product._id.toString(), product]) -// ); - -// // Fetch product data from OpenFoodFacts API endpoint -// const productData = await fetchOFFProductByBarcode(barcode); -// // Handle product not found scenario -// if (!productData) { -// return { products: [] }; -// } - -// // Format the product data from the external API -// const product = formatProductData(productData); - -// // Retrieve user-specific details using map lookup -// const userProduct = userProductsMap.get(product._id.toString()); - -// // Initialize user information object with fallback logic -// const userInformation = userProduct -// ? { -// added_at: userProduct.added_at || null, -// in_list: userProduct.in_list || null, -// my_serving_size: userProduct.my_serving_size || null, -// } -// : null; - -// // Format and return the product data -// return { -// products: [ -// { -// ...product.toObject(), -// user_information: userInformation, -// }, -// ], -// }; -// } catch (error) { -// console.error("Error displaying product by barcode:", error); -// throw new Error(`Error displaying product by barcode: ${error.message}`); -// } -// } - -// async function displayProductsBySearchTerm(searchTerm, req) { -// try { -// // Get the user ID from the JWT token in the request cookies -// const user = getUserFromToken(req); - -// // Fetch user-specific foods from the database -// const userFoods = await UserModel.getUserFoods(user.id); - -// // Create a map of user foods for quick lookup -// const userProductsMap = new Map( -// userFoods.products.map((product) => [product._id.toString(), product]) -// ); - -// // Fetch products data from OpenFoodFacts API endpoint -// const response = await fetchOFFProductsBySearch(searchTerm); -// // Handle product not found scenario -// if (!response) { -// return { products: [] }; -// } - -// // Format the response to local database standard -// response.data.products.forEach((productData, index) => { -// const product = formatProductData(productData); -// // Retrieve user-specific details using map lookup -// const userProduct = userProductsMap.get(product._id.toString()); -// // Initialize user information object with fallback logic -// const userInformation = userProduct -// ? { -// added_at: userProduct.added_at || null, -// in_list: userProduct.in_list || null, -// my_serving_size: userProduct.my_serving_size || null, -// } -// : null; -// response.data.products[index] = { -// ...product.toObject(), -// user_information: userInformation, -// }; -// if (index == 1) { -// console.log( -// `\n\nRESPONSE AT INDEX ${index} is:\n${JSON.stringify( -// response.data.products[index] -// )}` -// ); -// } -// }); - -// return response.data; -// } catch (error) { -// console.error("Error searching product by search term:", error); -// throw error; -// } -// } - async function searchAndDisplayProducts(req, res) { try { const { query: searchTerm } = req.query; @@ -186,7 +14,10 @@ async function searchAndDisplayProducts(req, res) { searchTerm.trim().length <= 14 ) { // Retrieve product by barcode - const product = await Products.displayProductByBarcode(searchTerm, req); + const product = await ProductsModel.displayProductByBarcode( + searchTerm, + req + ); if (Object.keys(product).length === 0) { return res.status(404).send("Product not found"); } else if (product.error) { @@ -196,7 +27,7 @@ async function searchAndDisplayProducts(req, res) { } } else { // Retrieve data by search term - const productsData = await Products.displayProductsBySearchTerm( + const productsData = await ProductsModel.displayProductsBySearchTerm( searchTerm, req ); @@ -218,14 +49,14 @@ async function addProductByBarcode(req, res) { try { const { barcode } = req.params; // Retrieve product data from OpenFoodFacts API endpoint - const productData = await fetchOFFProductByBarcode(barcode); + const productData = await ProductsModel.fetchOFFProductByBarcode(barcode); // Format and insert the response into the local database standard - const product = Products.formatProductData(productData); - await Products.InsertToProductsDB(product); + const product = ProductsModel.formatProductData(productData); + await ProductsModel.InsertToProductsDB(product); // Get the user ID from the JWT token in the request cookies const user = getUserFromToken(req); - await Products.InsertToUsersDB(user, product); + await ProductsModel.InsertToUsersDB(user, product); return res.status(200).json({ message: "Product updated/saved and added to user successfully", @@ -244,14 +75,14 @@ async function addProductBySelection(req, res) { const { productId, ...productData } = req.body; // - const product = new Products({ _id: productId, ...productData }); - await InsertToProductsDB(product); + const product = new ProductsModel({ _id: productId, ...productData }); + await ProductsModel.InsertToProductsDB(product); // Get the user ID from the JWT token in the request cookies const user = getUserFromToken(req); // - await Products.InsertToUsersDB(user, product); + await ProductsModel.InsertToUsersDB(user, product); return res.status(200).json({ message: "Product updated/saved and added to user successfully", @@ -279,7 +110,9 @@ async function getUserProductDetails(req, res) { // Fetch full product data for each product ID const productIds = userProducts.map((product) => product._id); - const products = await Products.find({ _id: { $in: productIds } }).lean(); + const products = await ProductsModel.find({ + _id: { $in: productIds }, + }).lean(); // Combine user-specific information with product details const combinedProducts = products.map((product) => {