const axios = require('axios'); /** * Realiza una búsqueda de recetas usando combinaciones de palabras. * @param {String} name - Nombre de la receta a buscar. * @returns {Array} - Lista de recetas encontradas. * @throws {Error} - Si no se encuentran recetas o hay un error en la solicitud. */ const searchMealByName = async (name) => { const words = name.split(' '); let recipes = []; // Intenta la búsqueda completa primero try { recipes = await performSearch(name); if (recipes.length > 0) return recipes; } catch (error) { console.log(`No se encontraron recetas para "${name}", probando combinaciones...`); } // Si no encuentra con el nombre completo, intenta con combinaciones for (let i = 0; i < words.length; i++) { const partialName = words.slice(i).join(' '); try { recipes = await performSearch(partialName); if (recipes.length > 0) return recipes; } catch (error) { console.log(`No se encontraron recetas para "${partialName}"`); } } // Si no encuentra nada, intenta con cada palabra individualmente for (const word of words) { try { recipes = await performSearch(word); if (recipes.length > 0) return recipes; } catch (error) { console.log(`No se encontraron recetas para "${word}"`); } } // Si no se encontraron resultados, lanza un error throw new Error('No se encontraron recetas para tu búsqueda.'); }; /** * Realiza la búsqueda en la API de TheMealDB. * @param {String} query - Consulta de búsqueda. * @returns {Array} - Lista de recetas encontradas. */ const performSearch = async (query) => { const response = await axios.get('https://www.themealdb.com/api/json/v1/1/search.php', { params: { s: query } }); // console.log('Request URL:', response.config.url); // console.log('Response:', response.data); return response.data.meals || []; }; /** * Obtiene una receta aleatoria utilizando la API de TheMealDB. * @returns {Object} - Objeto de receta aleatoria. * @throws {Error} - Si hay un error en la solicitud. */ const getRandomMeal = async () => { try { const response = await axios.get('https://www.themealdb.com/api/json/v1/1/random.php'); if (!response.data.meals) { throw new Error('No se pudo obtener una receta aleatoria.'); } return response.data.meals[0]; } catch (error) { throw new Error(`Error al obtener una receta aleatoria: ${error.message}`); } }; /** * Filtra recetas por ingrediente principal utilizando la API de TheMealDB. * @param {String} ingredient - Ingrediente principal para filtrar recetas. * @returns {Array} - Lista de recetas que contienen el ingrediente especificado. * @throws {Error} - Si no se encuentran recetas o hay un error en la solicitud. */ const filterByIngredient = async (ingredient) => { try { const response = await axios.get('https://www.themealdb.com/api/json/v1/1/filter.php', { params: { i: ingredient } }); if (!response.data.meals) { throw new Error('No se encontraron recetas con ese ingrediente.'); } return response.data.meals; } catch (error) { throw new Error(`Error al filtrar por ingrediente: ${error.message}`); } }; /* * Categorías saludables para filtrar recetas. */ const healthyCategories = ['Salad', 'Chicken', 'Eggs', 'Fish', 'Seafood', 'Pasta', 'Rice', 'Beef', 'Pork', 'Lamb']; /** * Obtiene una receta aleatoria de categorías saludables. * @returns {Object} - Objeto de receta aleatoria saludable. * @throws {Error} - Si no se encuentra una receta o hay un error en la solicitud. */ const getRandomHealthyMeal = async () => { try { const randomCategory = healthyCategories[Math.floor(Math.random() * healthyCategories.length)]; const response = await axios.get('https://www.themealdb.com/api/json/v1/1/filter.php', { params: { c: randomCategory } }); if (!response.data.meals || response.data.meals.length === 0) { throw new Error('No se encontraron recetas saludables.'); } const randomMeal = response.data.meals[Math.floor(Math.random() * response.data.meals.length)]; return await lookupMealById(randomMeal.idMeal); } catch (error) { throw new Error(`Error al obtener una receta saludable: ${error.message}`); } }; /** * Busca los detalles completos de una receta por ID. * @param {String} id - ID de la receta. * @returns {Object} - Objeto de receta con detalles completos. */ const lookupMealById = async (id) => { try { const response = await axios.get(`https://www.themealdb.com/api/json/v1/1/lookup.php?i=${id}`); if (!response.data.meals) { throw new Error('No se encontraron detalles para la receta.'); } return response.data.meals[0]; } catch (error) { throw new Error(`Error al obtener detalles de la receta: ${error.message}`); } }; module.exports = { searchMealByName, getRandomMeal, filterByIngredient, getRandomHealthyMeal, lookupMealById };