Refactor #8 removed data.js
This commit is contained in:
parent
661d5f4840
commit
3be1027154
1 changed files with 0 additions and 390 deletions
390
src/data.js
390
src/data.js
|
|
@ -1,390 +0,0 @@
|
||||||
const BASE_URL = window.location.href.replace(/^(https?:\/\/[^/]+).*/, '$1/api')
|
|
||||||
|
|
||||||
const datesToFix = {
|
|
||||||
Meal: { fields: ['suggested_date', 'purchase_date', 'consumed_date'] },
|
|
||||||
CurrentShoppingList: {
|
|
||||||
dependants: (l) => ({
|
|
||||||
ShoppingListItem: [l.outstanding_items, l.requested_meals, l.purchased_items],
|
|
||||||
Meal: Object.values(l.meals_lookup),
|
|
||||||
Recipe: Object.values(l.recipes_lookup),
|
|
||||||
Ingredient: Object.values(l.ingredients_lookup),
|
|
||||||
ShoppingList: Object.values(l.shopping_list_lookup),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
PurchasedShoppingList: {
|
|
||||||
dependants: (l) => ({
|
|
||||||
ShoppingListItem: l.items,
|
|
||||||
Meal: Object.values(l.meals_lookup),
|
|
||||||
Recipe: Object.values(l.recipes_lookup),
|
|
||||||
Ingredient: Object.values(l.ingredients_lookup),
|
|
||||||
ShoppingList: l.list,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
ShoppingList: { fields: ['created_date'], dependants: (l) => ({ ShoppingListItem: l.items }) },
|
|
||||||
ShoppingListItem: {
|
|
||||||
fields: ['created_date'],
|
|
||||||
dependants: (r) => ({
|
|
||||||
Meal: r.meal,
|
|
||||||
Recipe: r.recipe,
|
|
||||||
Ingredient: r.ingredient,
|
|
||||||
ShoppingList: r.list,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
Recipe: { fields: ['date_created', 'date_hidden'] },
|
|
||||||
}
|
|
||||||
|
|
||||||
const fixDates = (obj, type) => {
|
|
||||||
if (!obj) return
|
|
||||||
|
|
||||||
if (Array.isArray(obj)) {
|
|
||||||
for (const item of obj) {
|
|
||||||
fixDates(item, type)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const toFix = datesToFix[type]
|
|
||||||
if (!toFix) return
|
|
||||||
|
|
||||||
if (toFix.fields) {
|
|
||||||
for (const field of toFix.fields) {
|
|
||||||
if (obj[field]) {
|
|
||||||
obj[field] = new Date(obj[field])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (toFix.dependants) {
|
|
||||||
for (const [key, value] of Object.entries(toFix.dependants(obj))) {
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
for (const item of value) {
|
|
||||||
fixDates(item, key)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fixDates(value, key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const setPurchasedShoppingListReferences = (purchasedShoppingList) => {
|
|
||||||
if (!purchasedShoppingList) return
|
|
||||||
const { ingredients_lookup, meals_lookup, recipes_lookup } = purchasedShoppingList
|
|
||||||
const shopping_list_lookup = { [purchasedShoppingList.list.id]: purchasedShoppingList.list }
|
|
||||||
setShoppingListItemReferences(
|
|
||||||
purchasedShoppingList.list.items,
|
|
||||||
ingredients_lookup,
|
|
||||||
meals_lookup,
|
|
||||||
recipes_lookup,
|
|
||||||
shopping_list_lookup
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const setCurrentShoppingListReferences = (currentShoppingList) => {
|
|
||||||
if (!currentShoppingList) return
|
|
||||||
const { ingredients_lookup, meals_lookup, recipes_lookup, shopping_list_lookup } =
|
|
||||||
currentShoppingList
|
|
||||||
const allShoppingListItems = [
|
|
||||||
...currentShoppingList.outstanding_items,
|
|
||||||
...currentShoppingList.requested_meals,
|
|
||||||
...currentShoppingList.purchased_items,
|
|
||||||
]
|
|
||||||
|
|
||||||
setShoppingListItemReferences(
|
|
||||||
allShoppingListItems,
|
|
||||||
ingredients_lookup,
|
|
||||||
meals_lookup,
|
|
||||||
recipes_lookup,
|
|
||||||
shopping_list_lookup
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const setShoppingListItemReferences = (
|
|
||||||
shoppingListItems,
|
|
||||||
ingredients_lookup,
|
|
||||||
meals_lookup,
|
|
||||||
recipes_lookup,
|
|
||||||
shopping_list_lookup
|
|
||||||
) => {
|
|
||||||
if (!shoppingListItems) return
|
|
||||||
|
|
||||||
for (const item of shoppingListItems) {
|
|
||||||
if (item.ingredient_id) {
|
|
||||||
item.ingredient = ingredients_lookup[item.ingredient_id]
|
|
||||||
}
|
|
||||||
if (item.meal_id) {
|
|
||||||
item.meal = meals_lookup[item.meal_id]
|
|
||||||
}
|
|
||||||
if (item.list_id) {
|
|
||||||
item.list = shopping_list_lookup[item.list_id]
|
|
||||||
}
|
|
||||||
if (item.recipe_id) {
|
|
||||||
item.recipe = recipes_lookup[item.recipe_id]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let user = null
|
|
||||||
export default {
|
|
||||||
async markMealConsumed(meal_id) {
|
|
||||||
const response = await fetch(BASE_URL + `/meals/${encodeURIComponent(meal_id)}/consumed`, {
|
|
||||||
method: 'POST',
|
|
||||||
credentials: 'include',
|
|
||||||
})
|
|
||||||
|
|
||||||
const meal = await response.json()
|
|
||||||
fixDates(meal, 'Meal')
|
|
||||||
|
|
||||||
return meal
|
|
||||||
},
|
|
||||||
async getUpcomingMeals(from, to) {
|
|
||||||
const response = await fetch(
|
|
||||||
BASE_URL + '/meals/upcoming?from=' + from.toISOString() + '&to=' + to.toISOString()
|
|
||||||
)
|
|
||||||
const meals = await response.json()
|
|
||||||
fixDates(meals, 'Meal')
|
|
||||||
|
|
||||||
return meals.sort((a, b) => a.suggested_date - b.suggested_date)
|
|
||||||
},
|
|
||||||
async getMeal(id) {
|
|
||||||
var response = await fetch(BASE_URL + `/meals/${encodeURIComponent(id)}`)
|
|
||||||
const meal = await response.json()
|
|
||||||
fixDates(meal, 'Meal')
|
|
||||||
|
|
||||||
return meal
|
|
||||||
},
|
|
||||||
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))
|
|
||||||
const recipes = await response.json()
|
|
||||||
fixDates(recipes, 'Recipe')
|
|
||||||
|
|
||||||
return recipes
|
|
||||||
},
|
|
||||||
async parseRecipe(url) {
|
|
||||||
const response = await fetch(BASE_URL + `/recipes/parse?url=${encodeURIComponent(url)}`, {
|
|
||||||
credentials: 'include',
|
|
||||||
})
|
|
||||||
const recipe = await response.json()
|
|
||||||
fixDates(recipe, 'Recipe')
|
|
||||||
|
|
||||||
return recipe
|
|
||||||
},
|
|
||||||
async getRecipe(id) {
|
|
||||||
const response = await fetch(BASE_URL + `/recipes/${encodeURIComponent(id)}`)
|
|
||||||
const recipe = await response.json()
|
|
||||||
fixDates(recipe, 'Recipe')
|
|
||||||
|
|
||||||
return recipe
|
|
||||||
},
|
|
||||||
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),
|
|
||||||
})
|
|
||||||
|
|
||||||
const saved = await response.json()
|
|
||||||
fixDates(saved, 'Recipe')
|
|
||||||
|
|
||||||
return saved
|
|
||||||
},
|
|
||||||
async saveMeal(meal) {
|
|
||||||
let response = null
|
|
||||||
if (meal.id >= 0) {
|
|
||||||
response = await fetch(BASE_URL + `/meals/${encodeURIComponent(meal.id)}`, {
|
|
||||||
method: 'PUT',
|
|
||||||
credentials: 'include',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
body: JSON.stringify(meal),
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
response = await fetch(BASE_URL + '/meals', {
|
|
||||||
method: 'POST',
|
|
||||||
credentials: 'include',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
body: JSON.stringify(meal),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const saved = await response.json()
|
|
||||||
fixDates(saved, 'Meal')
|
|
||||||
|
|
||||||
return saved
|
|
||||||
},
|
|
||||||
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',
|
|
||||||
})
|
|
||||||
|
|
||||||
const recipe = await response.json()
|
|
||||||
fixDates(recipe, 'Recipe')
|
|
||||||
return recipe
|
|
||||||
},
|
|
||||||
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',
|
|
||||||
})
|
|
||||||
const ingredients = await response.json()
|
|
||||||
fixDates(ingredients, 'Ingredient')
|
|
||||||
|
|
||||||
return ingredients
|
|
||||||
},
|
|
||||||
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),
|
|
||||||
})
|
|
||||||
|
|
||||||
const ingredients = await response.json()
|
|
||||||
fixDates(ingredients, 'Ingredient')
|
|
||||||
|
|
||||||
return ingredients
|
|
||||||
},
|
|
||||||
async getShoppingList(id) {
|
|
||||||
const response = await fetch(BASE_URL + `/shopping/${encodeURIComponent(id)}`)
|
|
||||||
|
|
||||||
const purchasedShoppingList = await response.json()
|
|
||||||
fixDates(purchasedShoppingList, 'PurchasedShoppingList')
|
|
||||||
setPurchasedShoppingListReferences(purchasedShoppingList)
|
|
||||||
|
|
||||||
return purchasedShoppingList.list
|
|
||||||
},
|
|
||||||
async getCurrentShoppingList() {
|
|
||||||
const response = await fetch(BASE_URL + '/shopping/current')
|
|
||||||
|
|
||||||
const lst = await response.json()
|
|
||||||
fixDates(lst, 'CurrentShoppingList')
|
|
||||||
setCurrentShoppingListReferences(lst)
|
|
||||||
|
|
||||||
return lst
|
|
||||||
},
|
|
||||||
async purchaseShoppingList(completed_requests) {
|
|
||||||
const response = await fetch(BASE_URL + '/shopping/', {
|
|
||||||
method: 'POST',
|
|
||||||
credentials: 'include',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ items: completed_requests }),
|
|
||||||
})
|
|
||||||
|
|
||||||
const purchasedShoppingList = await response.json()
|
|
||||||
fixDates(purchasedShoppingList, 'PurchasedShoppingList')
|
|
||||||
setPurchasedShoppingListReferences(purchasedShoppingList)
|
|
||||||
|
|
||||||
return purchasedShoppingList.list
|
|
||||||
},
|
|
||||||
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 requests = await response.json()
|
|
||||||
fixDates(requests, 'ShoppingListItem')
|
|
||||||
|
|
||||||
return requests
|
|
||||||
},
|
|
||||||
async unrequestMeal(meal_id) {
|
|
||||||
const response = await fetch(
|
|
||||||
BASE_URL + `/shopping/current/meals/${encodeURIComponent(meal_id)}`,
|
|
||||||
{
|
|
||||||
method: 'DELETE',
|
|
||||||
credentials: 'include',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Failed to unrequest meal')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getPersonsInHome() {
|
|
||||||
const response = await fetch(BASE_URL + '/persons')
|
|
||||||
return await response.json()
|
|
||||||
},
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue