Files
mealie/mealie/routes/categories/categories.py

74 lines
2.6 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm.session import Session
from mealie.db.database import db
from mealie.db.db_setup import generate_session
from mealie.core.dependencies import is_logged_in
from mealie.routes.routers import AdminAPIRouter, UserAPIRouter
from mealie.schema.recipe import CategoryIn, RecipeCategoryResponse
public_router = APIRouter()
user_router = UserAPIRouter()
admin_router = AdminAPIRouter()
@public_router.get("")
async def get_all_recipe_categories(session: Session = Depends(generate_session)):
""" Returns a list of available categories in the database """
return db.categories.get_all_limit_columns(session, ["slug", "name"])
@public_router.get("/empty")
def get_empty_categories(session: Session = Depends(generate_session)):
""" Returns a list of categories that do not contain any recipes"""
return db.categories.get_empty(session)
@public_router.get("/{category}", response_model=RecipeCategoryResponse)
def get_all_recipes_by_category(
category: str, session: Session = Depends(generate_session), is_user: bool = Depends(is_logged_in)
):
""" Returns a list of recipes associated with the provided category. """
category_obj = db.categories.get(session, category)
category_obj = RecipeCategoryResponse.from_orm(category_obj)
if not is_user:
category_obj.recipes = [x for x in category_obj.recipes if x.settings.public]
return category_obj
@user_router.post("")
async def create_recipe_category(category: CategoryIn, session: Session = Depends(generate_session)):
""" Creates a Category in the database """
try:
return db.categories.create(session, category.dict())
except Exception:
raise HTTPException(status.HTTP_400_BAD_REQUEST)
@admin_router.put("/{category}", response_model=RecipeCategoryResponse)
async def update_recipe_category(category: str, new_category: CategoryIn, session: Session = Depends(generate_session)):
""" Updates an existing Tag in the database """
try:
return db.categories.update(session, category, new_category.dict())
except Exception:
raise HTTPException(status.HTTP_400_BAD_REQUEST)
@admin_router.delete("/{category}")
async def delete_recipe_category(category: str, session: Session = Depends(generate_session)):
"""
Removes a recipe category from the database. Deleting a
category does not impact a recipe. The category will be removed
from any recipes that contain it
"""
try:
db.categories.delete(session, category)
except Exception:
raise HTTPException(status.HTTP_400_BAD_REQUEST)