149 lines
5.1 KiB
JavaScript
149 lines
5.1 KiB
JavaScript
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
|
|
};
|