From fbd8d49880195cc2cc99ffd339466074b266f16d Mon Sep 17 00:00:00 2001 From: hay-kot Date: Fri, 2 Apr 2021 22:26:20 -0800 Subject: [PATCH] new recipe summary route --- frontend/src/api/recipe.js | 6 +++++ frontend/src/store/index.js | 18 +++++++-------- mealie/db/db_base.py | 13 +++-------- mealie/routes/recipe/all_recipe_routes.py | 13 ++++++++++- mealie/schema/recipe.py | 27 ++++++++++++++++++----- 5 files changed, 51 insertions(+), 26 deletions(-) diff --git a/frontend/src/api/recipe.js b/frontend/src/api/recipe.js index 5eef791ac..50e45e593 100644 --- a/frontend/src/api/recipe.js +++ b/frontend/src/api/recipe.js @@ -8,6 +8,7 @@ const prefix = baseURL + "recipes/"; const recipeURLs = { allRecipes: baseURL + "recipes", + summary: baseURL + "recipes" + "/summary", allRecipesByCategory: prefix + "category", create: prefix + "create", createByURL: prefix + "create-url", @@ -86,6 +87,11 @@ export const recipeAPI = { return response.data; }, + async allSummary() { + const response = await apiReq.get(recipeURLs.summary); + return response.data; + }, + recipeImage(recipeSlug) { return `/api/recipes/${recipeSlug}/image?image_type=original`; }, diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 8b0b4cc51..f8f17282e 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -54,15 +54,15 @@ const store = new Vuex.Store({ actions: { async requestRecentRecipes() { - const keys = [ - "name", - "slug", - "image", - "description", - "dateAdded", - "rating", - ]; - const payload = await api.recipes.allByKeys(keys); + // const keys = [ + // "name", + // "slug", + // "image", + // "description", + // "dateAdded", + // "rating", + // ]; + const payload = await api.recipes.allSummary(); this.commit("setRecentRecipes", payload); }, diff --git a/mealie/db/db_base.py b/mealie/db/db_base.py index 6aef2b24d..f9e9a03a9 100644 --- a/mealie/db/db_base.py +++ b/mealie/db/db_base.py @@ -15,17 +15,10 @@ class BaseDocument: self.schema: BaseModel # TODO: Improve Get All Query Functionality - def get_all(self, session: Session, limit: int = None, order_by: str = None) -> List[dict]: + def get_all(self, session: Session, limit: int = None, order_by: str = None, override_schema=None) -> List[dict]: + eff_schema = override_schema or self.schema - if self.orm_mode: - return [self.schema.from_orm(x) for x in session.query(self.sql_model).limit(limit).all()] - - # list = [x.dict() for x in session.query(self.sql_model).limit(limit).all()] - - # if limit == 1: - # return list[0] - - # return list + return [eff_schema.from_orm(x) for x in session.query(self.sql_model).limit(limit).all()] def get_all_limit_columns(self, session: Session, fields: List[str], limit: int = None) -> List[SqlAlchemyBase]: """Queries the database for the selected model. Restricts return responses to the diff --git a/mealie/routes/recipe/all_recipe_routes.py b/mealie/routes/recipe/all_recipe_routes.py index 659905483..42dd6940b 100644 --- a/mealie/routes/recipe/all_recipe_routes.py +++ b/mealie/routes/recipe/all_recipe_routes.py @@ -3,13 +3,24 @@ from typing import List, Optional from fastapi import APIRouter, Depends, Query from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.schema.recipe import AllRecipeRequest +from mealie.schema.recipe import AllRecipeRequest, RecipeSummary from slugify import slugify from sqlalchemy.orm.session import Session router = APIRouter(tags=["Query All Recipes"]) +@router.get("/api/recipes/summary") +async def get_recipe_summary( + skip=0, + end=9999, + session: Session = Depends(generate_session), +): + """ Returns the summary data for recipes in the database """ + + return db.recipes.get_all(session, limit=end, override_schema=RecipeSummary) + + @router.get("/api/recipes") def get_all_recipes( keys: Optional[List[str]] = Query(...), diff --git a/mealie/schema/recipe.py b/mealie/schema/recipe.py index be1df086e..3ea0b9aee 100644 --- a/mealie/schema/recipe.py +++ b/mealie/schema/recipe.py @@ -34,12 +34,30 @@ class Nutrition(BaseModel): orm_mode = True -class Recipe(BaseModel): +class RecipeSummary(BaseModel): name: str - description: Optional[str] + slug: Optional[str] = "" image: Optional[Any] - recipeYield: Optional[str] + + description: Optional[str] recipeCategory: Optional[List[str]] = [] + tags: Optional[List[str]] = [] + rating: Optional[int] + + class Config: + orm_mode = True + + @classmethod + def getter_dict(_cls, name_orm: RecipeModel): + return { + **GetterDict(name_orm), + "recipeCategory": [x.name for x in name_orm.recipeCategory], + "tags": [x.name for x in name_orm.tags], + } + + +class Recipe(RecipeSummary): + recipeYield: Optional[str] recipeIngredient: Optional[list[str]] recipeInstructions: Optional[list[RecipeStep]] nutrition: Optional[Nutrition] @@ -50,11 +68,8 @@ class Recipe(BaseModel): performTime: Optional[str] = None # Mealie Specific - slug: Optional[str] = "" - tags: Optional[List[str]] = [] dateAdded: Optional[datetime.date] notes: Optional[List[RecipeNote]] = [] - rating: Optional[int] orgURL: Optional[str] extras: Optional[dict] = {}