Skip to content

Commit

Permalink
Merge pull request #15 from lenover12/format-food-information
Browse files Browse the repository at this point in the history
Fix correctly referencing ProductsModel
  • Loading branch information
lenover12 authored Jun 10, 2024
2 parents 4923c0b + cee7adb commit e5197bc
Showing 1 changed file with 16 additions and 183 deletions.
199 changes: 16 additions & 183 deletions server/controllers/products.controller.js
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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) {
Expand All @@ -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
);
Expand All @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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) => {
Expand Down

0 comments on commit e5197bc

Please sign in to comment.