diff --git a/mealie/core/dependencies/__init__.py b/mealie/core/dependencies/__init__.py new file mode 100644 index 000000000..83e0bad84 --- /dev/null +++ b/mealie/core/dependencies/__init__.py @@ -0,0 +1,2 @@ +from .dependencies import * +from .grouped import * diff --git a/mealie/routes/deps.py b/mealie/core/dependencies/dependencies.py similarity index 100% rename from mealie/routes/deps.py rename to mealie/core/dependencies/dependencies.py diff --git a/mealie/core/dependencies/grouped.py b/mealie/core/dependencies/grouped.py new file mode 100644 index 000000000..05b8999d7 --- /dev/null +++ b/mealie/core/dependencies/grouped.py @@ -0,0 +1,48 @@ +from fastapi import BackgroundTasks, Depends +from sqlalchemy.orm.session import Session + +from .dependencies import generate_session, get_current_user, is_logged_in + + +class ReadDeps: + """ + ReadDeps contains the common dependencies for all read operations through the API. + Note: The user object is used to definer what assets the user has access to. + + Args: + background_tasks: BackgroundTasks + session: Session + user: bool + """ + + def __init__( + self, + background_tasks: BackgroundTasks, + session: Session = Depends(generate_session), + user=Depends(is_logged_in), + ): + self.session = session + self.background_tasks = background_tasks + self.user = user + + +class WriteDeps: + """ + WriteDeps contains the common dependencies for all read operations through the API. + Note: The user must be logged in or the route will return a 401 error. + + Args: + background_tasks: BackgroundTasks + session: Session + user: bool + """ + + def __init__( + self, + background_tasks: BackgroundTasks, + session: Session = Depends(generate_session), + user=Depends(get_current_user), + ): + self.session = session + self.background_tasks = background_tasks + self.user = user diff --git a/mealie/routes/auth/auth.py b/mealie/routes/auth/auth.py index 7813ee154..f4994ee6d 100644 --- a/mealie/routes/auth/auth.py +++ b/mealie/routes/auth/auth.py @@ -4,9 +4,9 @@ from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm.session import Session from mealie.core import security +from mealie.core.dependencies import get_current_user from mealie.core.security import authenticate_user from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.schema.user import UserInDB from mealie.services.events import create_user_event diff --git a/mealie/routes/categories/categories.py b/mealie/routes/categories/categories.py index 331135a5d..94fae7a50 100644 --- a/mealie/routes/categories/categories.py +++ b/mealie/routes/categories/categories.py @@ -3,7 +3,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import is_logged_in +from mealie.core.dependencies import is_logged_in from mealie.routes.routers import AdminAPIRouter, UserAPIRouter from mealie.schema.recipe import CategoryIn, RecipeCategoryResponse diff --git a/mealie/routes/groups/crud.py b/mealie/routes/groups/crud.py index cf11a7a37..9ef1fe888 100644 --- a/mealie/routes/groups/crud.py +++ b/mealie/routes/groups/crud.py @@ -3,7 +3,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import AdminAPIRouter, UserAPIRouter from mealie.schema.user import GroupBase, GroupInDB, UpdateGroup, UserInDB from mealie.services.events import create_group_event diff --git a/mealie/routes/mealplans/crud.py b/mealie/routes/mealplans/crud.py index a26a1dc9a..ae08855a0 100644 --- a/mealie/routes/mealplans/crud.py +++ b/mealie/routes/mealplans/crud.py @@ -4,7 +4,7 @@ from starlette.responses import FileResponse from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.schema.meal_plan import MealPlanIn, MealPlanOut from mealie.schema.user import GroupInDB, UserInDB diff --git a/mealie/routes/mealplans/helpers.py b/mealie/routes/mealplans/helpers.py index c70c705ee..7fadb452a 100644 --- a/mealie/routes/mealplans/helpers.py +++ b/mealie/routes/mealplans/helpers.py @@ -4,7 +4,7 @@ from sqlalchemy.orm.session import Session from mealie.core.root_logger import get_logger from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.schema.meal_plan import ListItem, MealPlanOut, ShoppingListIn, ShoppingListOut from mealie.schema.recipe import Recipe diff --git a/mealie/routes/recipe/comments.py b/mealie/routes/recipe/comments.py index 1a38a0e7a..1c0d51f24 100644 --- a/mealie/routes/recipe/comments.py +++ b/mealie/routes/recipe/comments.py @@ -5,7 +5,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.schema.recipe import CommentOut, CreateComment, SaveComment from mealie.schema.user import UserInDB diff --git a/mealie/routes/recipe/recipe_crud_routes.py b/mealie/routes/recipe/recipe_crud_routes.py index 4622845e7..49cc9f23f 100644 --- a/mealie/routes/recipe/recipe_crud_routes.py +++ b/mealie/routes/recipe/recipe_crud_routes.py @@ -12,7 +12,7 @@ from mealie.core.config import settings from mealie.core.root_logger import get_logger from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user, temporary_zip_path +from mealie.core.dependencies import get_current_user, temporary_zip_path from mealie.routes.routers import UserAPIRouter from mealie.schema.recipe import CreateRecipeByURL, Recipe, RecipeImageTypes from mealie.schema.recipe.recipe import CreateRecipe diff --git a/mealie/routes/routers.py b/mealie/routes/routers.py index 607bec490..d08a64583 100644 --- a/mealie/routes/routers.py +++ b/mealie/routes/routers.py @@ -2,7 +2,7 @@ from typing import List, Optional from fastapi import APIRouter, Depends -from mealie.routes.deps import get_admin_user, get_current_user +from mealie.core.dependencies import get_admin_user, get_current_user class AdminAPIRouter(APIRouter): diff --git a/mealie/routes/shopping_lists/__init__.py b/mealie/routes/shopping_lists/__init__.py index 73c23ed08..56270e43a 100644 --- a/mealie/routes/shopping_lists/__init__.py +++ b/mealie/routes/shopping_lists/__init__.py @@ -3,7 +3,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.schema.meal_plan import ShoppingListIn, ShoppingListOut from mealie.schema.user import UserInDB diff --git a/mealie/routes/site_settings/site_settings.py b/mealie/routes/site_settings/site_settings.py index 491827577..5acfbdd4c 100644 --- a/mealie/routes/site_settings/site_settings.py +++ b/mealie/routes/site_settings/site_settings.py @@ -3,7 +3,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import AdminAPIRouter from mealie.schema.admin import SiteSettings from mealie.schema.user import GroupInDB, UserInDB diff --git a/mealie/routes/tags/tags.py b/mealie/routes/tags/tags.py index 6c1c66165..c4e52964f 100644 --- a/mealie/routes/tags/tags.py +++ b/mealie/routes/tags/tags.py @@ -3,7 +3,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import is_logged_in +from mealie.core.dependencies import is_logged_in from mealie.routes.routers import AdminAPIRouter, UserAPIRouter from mealie.schema.recipe import RecipeTagResponse, TagIn diff --git a/mealie/routes/users/api_tokens.py b/mealie/routes/users/api_tokens.py index bb5285bee..426b50938 100644 --- a/mealie/routes/users/api_tokens.py +++ b/mealie/routes/users/api_tokens.py @@ -7,7 +7,7 @@ from sqlalchemy.orm.session import Session from mealie.core.security import create_access_token from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.schema.user import CreateToken, LoingLiveTokenIn, LongLiveTokenInDB, UserInDB diff --git a/mealie/routes/users/crud.py b/mealie/routes/users/crud.py index 4a7dc4acb..28cb185fd 100644 --- a/mealie/routes/users/crud.py +++ b/mealie/routes/users/crud.py @@ -5,7 +5,7 @@ from mealie.core import security from mealie.core.security import get_password_hash from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import AdminAPIRouter, UserAPIRouter from mealie.routes.users._helpers import assert_user_change_allowed from mealie.schema.user import UserBase, UserIn, UserInDB, UserOut diff --git a/mealie/routes/users/favorites.py b/mealie/routes/users/favorites.py index 0e5457599..bccaeef67 100644 --- a/mealie/routes/users/favorites.py +++ b/mealie/routes/users/favorites.py @@ -3,7 +3,7 @@ from sqlalchemy.orm.session import Session from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.routes.users._helpers import assert_user_change_allowed from mealie.schema.user import UserFavorites, UserInDB diff --git a/mealie/routes/users/images.py b/mealie/routes/users/images.py index 48ab6d07a..902ed64ef 100644 --- a/mealie/routes/users/images.py +++ b/mealie/routes/users/images.py @@ -5,7 +5,7 @@ from fastapi.responses import FileResponse from fastapi.routing import APIRouter from mealie.core.config import app_dirs -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.routes.users._helpers import assert_user_change_allowed from mealie.schema.user import UserInDB diff --git a/mealie/routes/users/passwords.py b/mealie/routes/users/passwords.py index c9902e266..161f08006 100644 --- a/mealie/routes/users/passwords.py +++ b/mealie/routes/users/passwords.py @@ -5,7 +5,7 @@ from mealie.core.config import settings from mealie.core.security import get_password_hash, verify_password from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user +from mealie.core.dependencies import get_current_user from mealie.routes.routers import UserAPIRouter from mealie.routes.users._helpers import assert_user_change_allowed from mealie.schema.user import ChangePassword, UserInDB diff --git a/mealie/routes/users/sign_up.py b/mealie/routes/users/sign_up.py index 559b30f6b..caeead30e 100644 --- a/mealie/routes/users/sign_up.py +++ b/mealie/routes/users/sign_up.py @@ -6,7 +6,7 @@ from sqlalchemy.orm.session import Session from mealie.core.security import get_password_hash from mealie.db.database import db from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_admin_user +from mealie.core.dependencies import get_admin_user from mealie.routes.routers import AdminAPIRouter from mealie.schema.user import SignUpIn, SignUpOut, SignUpToken, UserIn, UserInDB from mealie.services.events import create_user_event diff --git a/mealie/routes/utility_routes.py b/mealie/routes/utility_routes.py index 7ef1188c7..441ab8ee4 100644 --- a/mealie/routes/utility_routes.py +++ b/mealie/routes/utility_routes.py @@ -4,7 +4,7 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException, status from starlette.responses import FileResponse -from mealie.routes.deps import validate_file_token +from mealie.core.dependencies import validate_file_token router = APIRouter(prefix="/api/utils", tags=["Utils"], include_in_schema=True) diff --git a/mealie/services/recipe/all_recipes.py b/mealie/services/recipe/all_recipes.py index 281230c3c..bbf1e942f 100644 --- a/mealie/services/recipe/all_recipes.py +++ b/mealie/services/recipe/all_recipes.py @@ -8,7 +8,7 @@ from sqlalchemy.orm.session import Session from mealie.core.root_logger import get_logger from mealie.db.database import db from mealie.db.db_setup import SessionLocal, generate_session -from mealie.routes.deps import is_logged_in +from mealie.core.dependencies import is_logged_in from mealie.schema.recipe import RecipeSummary logger = get_logger() diff --git a/mealie/services/recipe/common_deps.py b/mealie/services/recipe/common_deps.py index a5b31950b..ae0577bde 100644 --- a/mealie/services/recipe/common_deps.py +++ b/mealie/services/recipe/common_deps.py @@ -5,7 +5,7 @@ from pydantic import BaseModel from sqlalchemy.orm.session import Session from mealie.db.db_setup import generate_session -from mealie.routes.deps import get_current_user, is_logged_in +from mealie.core.dependencies import get_current_user, is_logged_in class CommonDeps(BaseModel): @@ -17,7 +17,7 @@ class CommonDeps(BaseModel): arbitrary_types_allowed = True -def _read_deps( +def read_deps( background_tasks: BackgroundTasks, session: Session = Depends(generate_session), current_user=Depends(is_logged_in), @@ -29,7 +29,7 @@ def _read_deps( ) -def _write_deps( +def write_deps( background_tasks: BackgroundTasks, session: Session = Depends(generate_session), current_user=Depends(get_current_user), diff --git a/mealie/services/recipe/recipe_service.py b/mealie/services/recipe/recipe_service.py index 67a93920b..818d57085 100644 --- a/mealie/services/recipe/recipe_service.py +++ b/mealie/services/recipe/recipe_service.py @@ -3,6 +3,8 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.session import Session from mealie.core.config import get_settings +from mealie.core.dependencies import ReadDeps +from mealie.core.dependencies.grouped import WriteDeps from mealie.db.database import get_database from mealie.db.db_setup import SessionLocal from mealie.schema.recipe.recipe import CreateRecipe, Recipe @@ -10,8 +12,6 @@ from mealie.schema.user.user import UserInDB from mealie.services.events import create_recipe_event from mealie.services.recipe.media import delete_assets -from .common_deps import CommonDeps, _read_deps, _write_deps - class RecipeService: recipe: Recipe @@ -27,7 +27,7 @@ class RecipeService: self.settings = get_settings() @classmethod - def read_existing(cls, slug: str, local_deps: CommonDeps = Depends(_read_deps)): + def read_existing(cls, slug: str, deps: ReadDeps = Depends()): """ Used for dependency injection for routes that require an existing recipe. If the recipe doesn't exist or the user doens't not have the required permissions, the proper HTTP Status code will be raised. @@ -44,12 +44,12 @@ class RecipeService: Returns: RecipeService: The Recipe Service class with a populated recipe attribute """ - new_class = cls(local_deps.session, local_deps.user, local_deps.background_tasks) + new_class = cls(deps.session, deps.user, deps.background_tasks) new_class.assert_existing(slug) return new_class @classmethod - def write_existing(cls, slug: str, local_deps: CommonDeps = Depends(_write_deps)): + def write_existing(cls, slug: str, deps: WriteDeps = Depends()): """ Used for dependency injection for routes that require an existing recipe. The only difference between read_existing and write_existing is that the user is required to be logged in on write_existing method. @@ -66,19 +66,19 @@ class RecipeService: Returns: RecipeService: The Recipe Service class with a populated recipe attribute """ - new_class = cls(local_deps.session, local_deps.user, local_deps.background_tasks) + new_class = cls(deps.session, deps.user, deps.background_tasks) new_class.assert_existing(slug) return new_class @classmethod - def base(cls, local_deps: CommonDeps = Depends(_write_deps)) -> Recipe: + def base(cls, deps: WriteDeps = Depends()) -> Recipe: """A Base instance to be used as a router dependency Raises: HTTPException: 400 Bad Request """ - return cls(local_deps.session, local_deps.user, local_deps.background_tasks) + return cls(deps.session, deps.user, deps.background_tasks) def pupulate_recipe(self, slug: str) -> Recipe: """Populates the recipe attribute with the recipe from the database. diff --git a/tests/unit_tests/test_security.py b/tests/unit_tests/test_security.py index f5b71d77e..c544bf498 100644 --- a/tests/unit_tests/test_security.py +++ b/tests/unit_tests/test_security.py @@ -1,7 +1,7 @@ from pathlib import Path from mealie.core import security -from mealie.routes.deps import validate_file_token +from mealie.core.dependencies import validate_file_token def test_create_file_token():