diff --git a/mealie/core/dependencies/__init__.py b/mealie/core/dependencies/__init__.py new file mode 100644 index 000000000000..83e0bad84a33 --- /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 000000000000..05b8999d7c7a --- /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 7813ee154f5b..f4994ee6d812 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 331135a5d6ec..94fae7a50bb3 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 cf11a7a37771..9ef1fe888e94 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 a26a1dc9a3c6..ae08855a0dae 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 c70c705eeef3..7fadb452a0b8 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 1a38a0e7a3c1..1c0d51f24809 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 4622845e76d3..49cc9f23fcea 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 607bec4909ec..d08a6458392b 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 73c23ed087a5..56270e43a015 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 491827577d35..5acfbdd4cb81 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 6c1c6616561c..c4e52964f87f 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 bb5285bee22a..426b50938989 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 4a7dc4acb883..28cb185fd0ac 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 0e5457599691..bccaeef6770b 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 48ab6d07a785..902ed64ef7da 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 c9902e266782..161f08006c35 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 559b30f6bc0d..caeead30ed61 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 7ef1188c7238..441ab8ee4889 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 281230c3c092..bbf1e942f802 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 a5b31950be91..ae0577bdeaa6 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 67a93920b8f8..818d570858a7 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 f5b71d77e026..c544bf4986b5 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():