const BASE_URL = window.location.href.replace(/^(http:\/\/[^/:]+).*/, "$1:8000") function fixMealDates(meals) { for (const meal of meals) { meal.meal_date = new Date(meal.meal_date); } } let user = null; export default { async getMeals(from, to) { const response = await fetch(BASE_URL + "/meals?from=" + from.toISOString() + "&to=" + to.toISOString()); const meals = await response.json(); fixMealDates(meals); return meals.sort((a, b) => a.meal_date - b.meal_date); }, async getMeal(id) { var response = await fetch(BASE_URL + `/meals/${encodeURIComponent(id)}`); return await response.json(); }, async deleteMeal(id) { var response = await fetch(BASE_URL + `/meals/${encodeURIComponent(id)}`, { method: "DELETE", }); return await response.json(); }, async searchRecipes(query) { const response = await fetch(BASE_URL + "/recipes?q=" + encodeURIComponent(query)); return await response.json(); }, async parseRecipe(url) { const response = await fetch(BASE_URL + `/recipes/parse?url=${encodeURIComponent(url)}`); return await response.json(); }, async getRecipe(id) { const response = await fetch(BASE_URL + `/recipes/${encodeURIComponent(id)}`); return await response.json(); }, async parseProduct(ingredient, url) { const body = { url, tags: [ingredient.name, ingredient.line], }; const response = await fetch(BASE_URL + "/products", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); return await response.json(); }, async parseIngredients(lines) { const params = lines.map(line => "ingredients=" + encodeURIComponent(line)).join("&"); const response = await fetch(BASE_URL + "/recipes/ingredients/parse?" + params); return await response.json(); }, async saveRecipe(recipe) { const response = await fetch(BASE_URL + "/recipes", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify(recipe), }); return await response.json(); }, async saveMeal(meal) { if (meal.id) { const response = await fetch(BASE_URL + `/meals/${encodeURIComponent(meal.id)}`, { method: "PUT", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify(meal), }); return await response.json(); } const response = await fetch(BASE_URL + "/meals", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify(meal), }); return await response.json(); }, async currentUser() { if (user) { return user; } var cookie = decodeURIComponent(document.cookie).split(";").find(cookie => cookie.trimStart().startsWith("user_id=")); if (cookie) { const response = await fetch(BASE_URL + "/auth/refresh", { method: "POST", credentials: "include", }); if (response.ok) { user = await response.json(); } } return user; }, async login(username) { const response = await fetch(BASE_URL + "/auth/login", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ username }), }); if (response.ok) { user = await response.json(); } return user; }, async deleteRecipe(id) { var response = await fetch(BASE_URL + `/recipes/${encodeURIComponent(id)}`, { method: "DELETE", credentials: "include", }); return await response.json(); }, async searchPerson(name) { const response = await fetch(BASE_URL + "/persons?q=" + encodeURIComponent(name)); return await response.json(); }, async getMyShoppingList() { const response = await fetch(BASE_URL + "/shopping/current/me/ingredients", { credentials: "include" }); return await response.json(); }, async saveMyShoppingList(list) { const response = await fetch(BASE_URL + "/shopping/current/me/ingredients", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify(list), }); return await response.json(); }, async getShoppingList(id) { const response = await fetch(BASE_URL + `/shopping/${encodeURIComponent(id)}`); return await response.json(); }, async getCurrentShoppingList() { const response = await fetch(BASE_URL + "/shopping/current"); const lst = await response.json(); fixMealDates(lst.requests.map(request => request.meal).filter(meal => meal)); return lst; }, async requestMeal(meal_id) { const response = await fetch(BASE_URL + `/shopping/current/meals/me`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ meal_id }), }); const result = await response.json(); fixMealDates([result.meal]); return result; }, async unrequestMeal(meal_id) { const response = await fetch(BASE_URL + `/shopping/current/meals/${encodeURIComponent(meal_id)}`, { method: "DELETE", credentials: "include", }); return await response.json(); }, async markFound(ingredients) { const response = await fetch(BASE_URL + "/shopping/current/found", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify(ingredients), }); return await response.json(); }, async markNotFound(product_id) { const response = await fetch(BASE_URL + `/shopping/current/found/${product_id}`, { method: "DELETE", credentials: "include", }); return await response.json(); } }