Skip to content

Commit

Permalink
feat: implemented "order by" API parameters for recipe, food, and uni…
Browse files Browse the repository at this point in the history
…t queries (#1356)

* Added API params to order by different properties

* fix for incorrect var name

* removed invalid default order_by

* implemented fallback for invalid user input
  • Loading branch information
michael-genson committed Jun 11, 2022
1 parent 932f4a7 commit 7541175
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 8 deletions.
17 changes: 14 additions & 3 deletions mealie/repos/repository_generic.py
Expand Up @@ -56,7 +56,9 @@ def _filter_builder(self, **kwargs) -> dict[str, Any]:

return {**dct, **kwargs}

def get_all(self, limit: int = None, order_by: str = None, start=0, override=None) -> list[Schema]:
def get_all(
self, limit: int = None, order_by: str = None, order_descending: bool = True, start=0, override=None
) -> list[Schema]:
# sourcery skip: remove-unnecessary-cast
eff_schema = override or self.schema

Expand All @@ -65,10 +67,19 @@ def get_all(self, limit: int = None, order_by: str = None, start=0, override=Non
q = self._query().filter_by(**fltr)

if order_by:
if order_attr := getattr(self.model, str(order_by)):
order_attr = order_attr.desc()
try:
order_attr = getattr(self.model, str(order_by))
if order_descending:
order_attr = order_attr.desc()

else:
order_attr = order_attr.asc()

q = q.order_by(order_attr)

except AttributeError:
self.logger.info(f'Attempted to sort by unknown sort property "{order_by}"; ignoring')

return [eff_schema.from_orm(x) for x in q.offset(start).limit(limit).all()]

def multi_query(
Expand Down
22 changes: 20 additions & 2 deletions mealie/repos/repository_recipes.py
Expand Up @@ -90,7 +90,9 @@ def count_untagged(self, count=True, override_schema=None):
override_schema=override_schema,
)

def summary(self, group_id, start=0, limit=99999, load_foods=False) -> Any:
def summary(
self, group_id, start=0, limit=99999, load_foods=False, order_by="date_added", order_descending=True
) -> Any:
args = [
joinedload(RecipeModel.recipe_category),
joinedload(RecipeModel.tags),
Expand All @@ -100,11 +102,27 @@ def summary(self, group_id, start=0, limit=99999, load_foods=False) -> Any:
if load_foods:
args.append(joinedload(RecipeModel.recipe_ingredient).options(joinedload(RecipeIngredient.food)))

try:
if order_by:
order_attr = getattr(RecipeModel, order_by)
else:
order_attr = RecipeModel.date_added

except AttributeError:
self.logger.info(f'Attempted to sort by unknown sort property "{order_by}"; ignoring')
order_attr = RecipeModel.date_added

if order_descending:
order_attr = order_attr.desc()

else:
order_attr = order_attr.asc()

return (
self.session.query(RecipeModel)
.options(*args)
.filter(RecipeModel.group_id == group_id)
.order_by(RecipeModel.date_added.desc())
.order_by(order_attr)
.offset(start)
.limit(limit)
.all()
Expand Down
9 changes: 8 additions & 1 deletion mealie/routes/recipe/recipe_crud_routes.py
Expand Up @@ -194,7 +194,14 @@ def create_recipe_from_zip(self, temp_path=Depends(temporary_zip_path), archive:

@router.get("", response_model=list[RecipeSummary])
def get_all(self, q: RecipeGetAll = Depends(RecipeGetAll)):
items = self.repo.summary(self.user.group_id, start=q.start, limit=q.limit, load_foods=q.load_food)
items = self.repo.summary(
self.user.group_id,
start=q.start,
limit=q.limit,
load_foods=q.load_food,
order_by=q.order_by,
order_descending=q.order_descending,
)

new_items = []
for item in items:
Expand Down
2 changes: 1 addition & 1 deletion mealie/routes/unit_and_foods/foods.py
Expand Up @@ -39,7 +39,7 @@ def merge_one(self, data: MergeFood):

@router.get("", response_model=list[IngredientFood])
def get_all(self, q: GetAll = Depends(GetAll)):
return self.repo.get_all(start=q.start, limit=q.limit)
return self.repo.get_all(start=q.start, limit=q.limit, order_by=q.order_by, order_descending=q.order_descending)

@router.post("", response_model=IngredientFood, status_code=201)
def create_one(self, data: CreateIngredientFood):
Expand Down
2 changes: 1 addition & 1 deletion mealie/routes/unit_and_foods/units.py
Expand Up @@ -39,7 +39,7 @@ def merge_one(self, data: MergeUnit):

@router.get("", response_model=list[IngredientUnit])
def get_all(self, q: GetAll = Depends(GetAll)):
return self.repo.get_all(start=q.start, limit=q.limit)
return self.repo.get_all(start=q.start, limit=q.limit, order_by=q.order_by, order_descending=q.order_descending)

@router.post("", response_model=IngredientUnit, status_code=201)
def create_one(self, data: CreateIngredientUnit):
Expand Down
4 changes: 4 additions & 0 deletions mealie/schema/query.py
@@ -1,6 +1,10 @@
from typing import Optional

from mealie.schema._mealie import MealieModel


class GetAll(MealieModel):
start: int = 0
limit: int = 999
order_by: Optional[str]
order_descending: Optional[bool] = True

0 comments on commit 7541175

Please sign in to comment.