mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-04 15:03:10 -05:00
refactor(backend): ♻️ refactor backend services (#669)
* refactor(backend): ♻️ refactor backend services * refactor(backend): ♻️ move user model folder into own directory for future expansion * fix overriding results Co-authored-by: hay-kot <hay-kot@pm.me>
This commit is contained in:
@@ -96,8 +96,8 @@ class BaseAccessModel(Generic[T, D]):
|
||||
if any_case:
|
||||
search_attr = getattr(self.sql_model, key)
|
||||
result = session.query(self.sql_model).filter(func.lower(search_attr) == key.lower()).one_or_none()
|
||||
|
||||
result = session.query(self.sql_model).filter_by(**{key: value}).one_or_none()
|
||||
else:
|
||||
result = session.query(self.sql_model).filter_by(**{key: value}).one_or_none()
|
||||
|
||||
if not result:
|
||||
return
|
||||
|
||||
@@ -3,9 +3,10 @@ from logging import getLogger
|
||||
from sqlalchemy.orm.session import Session
|
||||
|
||||
from mealie.db.data_access_layer.group_access_model import GroupDataAccessModel
|
||||
from mealie.db.models.cookbook import CookBook
|
||||
from mealie.db.models.event import Event, EventNotification
|
||||
from mealie.db.models.group import Group
|
||||
from mealie.db.models.group.cookbook import CookBook
|
||||
from mealie.db.models.group.shopping_list import ShoppingList
|
||||
from mealie.db.models.group.webhooks import GroupWebhooksModel
|
||||
from mealie.db.models.mealplan import MealPlan
|
||||
from mealie.db.models.recipe.category import Category
|
||||
@@ -13,7 +14,6 @@ from mealie.db.models.recipe.comment import RecipeComment
|
||||
from mealie.db.models.recipe.ingredient import IngredientFoodModel, IngredientUnitModel
|
||||
from mealie.db.models.recipe.recipe import RecipeModel, Tag
|
||||
from mealie.db.models.settings import SiteSettings
|
||||
from mealie.db.models.shopping_list import ShoppingList
|
||||
from mealie.db.models.sign_up import SignUp
|
||||
from mealie.db.models.users import LongLiveToken, User
|
||||
from mealie.schema.admin import SiteSettings as SiteSettingsSchema
|
||||
@@ -39,7 +39,9 @@ from .user_access_model import UserDataAccessModel
|
||||
logger = getLogger()
|
||||
|
||||
|
||||
DEFAULT_PK = "id"
|
||||
pk_id = "id"
|
||||
pk_slug = "slug"
|
||||
pk_token = "token"
|
||||
|
||||
|
||||
class CategoryDataAccessModel(BaseAccessModel):
|
||||
@@ -53,38 +55,37 @@ class TagsDataAccessModel(BaseAccessModel):
|
||||
|
||||
|
||||
class DatabaseAccessLayer:
|
||||
"""
|
||||
`DatabaseAccessLayer` class is the data access layer for all database actions within
|
||||
Mealie. Database uses composition from classes derived from BaseAccessModel. These
|
||||
can be substantiated from the BaseAccessModel class or through inheritance when
|
||||
additional methods are required.
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""
|
||||
`DatabaseAccessLayer` class is the data access layer for all database actions within
|
||||
Mealie. Database uses composition from classes derived from BaseAccessModel. These
|
||||
can be substantiated from the BaseAccessModel class or through inheritance when
|
||||
additional methods are required.
|
||||
"""
|
||||
|
||||
# Recipes
|
||||
self.recipes = RecipeDataAccessModel("slug", RecipeModel, Recipe)
|
||||
self.ingredient_foods = BaseAccessModel(DEFAULT_PK, IngredientFoodModel, IngredientFood)
|
||||
self.ingredient_units = BaseAccessModel(DEFAULT_PK, IngredientUnitModel, IngredientUnit)
|
||||
self.comments = BaseAccessModel(DEFAULT_PK, RecipeComment, CommentOut)
|
||||
self.recipes = RecipeDataAccessModel(pk_slug, RecipeModel, Recipe)
|
||||
self.ingredient_foods = BaseAccessModel(pk_id, IngredientFoodModel, IngredientFood)
|
||||
self.ingredient_units = BaseAccessModel(pk_id, IngredientUnitModel, IngredientUnit)
|
||||
self.comments = BaseAccessModel(pk_id, RecipeComment, CommentOut)
|
||||
|
||||
# Tags and Categories
|
||||
self.categories = CategoryDataAccessModel("slug", Category, RecipeCategoryResponse)
|
||||
self.tags = TagsDataAccessModel("slug", Tag, RecipeTagResponse)
|
||||
self.categories = CategoryDataAccessModel(pk_slug, Category, RecipeCategoryResponse)
|
||||
self.tags = TagsDataAccessModel(pk_slug, Tag, RecipeTagResponse)
|
||||
|
||||
# Site
|
||||
self.settings = BaseAccessModel(DEFAULT_PK, SiteSettings, SiteSettingsSchema)
|
||||
self.sign_ups = BaseAccessModel("token", SignUp, SignUpOut)
|
||||
self.event_notifications = BaseAccessModel(DEFAULT_PK, EventNotification, EventNotificationIn)
|
||||
self.events = BaseAccessModel(DEFAULT_PK, Event, EventSchema)
|
||||
self.settings = BaseAccessModel(pk_id, SiteSettings, SiteSettingsSchema)
|
||||
self.sign_ups = BaseAccessModel(pk_token, SignUp, SignUpOut)
|
||||
self.event_notifications = BaseAccessModel(pk_id, EventNotification, EventNotificationIn)
|
||||
self.events = BaseAccessModel(pk_id, Event, EventSchema)
|
||||
|
||||
# Users
|
||||
self.users = UserDataAccessModel(DEFAULT_PK, User, PrivateUser)
|
||||
self.api_tokens = BaseAccessModel(DEFAULT_PK, LongLiveToken, LongLiveTokenInDB)
|
||||
self.users = UserDataAccessModel(pk_id, User, PrivateUser)
|
||||
self.api_tokens = BaseAccessModel(pk_id, LongLiveToken, LongLiveTokenInDB)
|
||||
|
||||
# Group Data
|
||||
self.groups = GroupDataAccessModel(DEFAULT_PK, Group, GroupInDB)
|
||||
self.meals = BaseAccessModel(DEFAULT_PK, MealPlan, MealPlanOut)
|
||||
self.webhooks = BaseAccessModel(DEFAULT_PK, GroupWebhooksModel, ReadWebhook)
|
||||
self.shopping_lists = BaseAccessModel(DEFAULT_PK, ShoppingList, ShoppingListOut)
|
||||
self.cookbooks = BaseAccessModel(DEFAULT_PK, CookBook, ReadCookBook)
|
||||
self.groups = GroupDataAccessModel(pk_id, Group, GroupInDB)
|
||||
self.meals = BaseAccessModel(pk_id, MealPlan, MealPlanOut)
|
||||
self.webhooks = BaseAccessModel(pk_id, GroupWebhooksModel, ReadWebhook)
|
||||
self.shopping_lists = BaseAccessModel(pk_id, ShoppingList, ShoppingListOut)
|
||||
self.cookbooks = BaseAccessModel(pk_id, CookBook, ReadCookBook)
|
||||
|
||||
@@ -3,6 +3,5 @@ from .group import *
|
||||
from .mealplan import *
|
||||
from .recipe.recipe import *
|
||||
from .settings import *
|
||||
from .shopping_list import *
|
||||
from .sign_up import *
|
||||
from .users import *
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import Column, DateTime, Integer
|
||||
@@ -7,22 +6,11 @@ from sqlalchemy.orm import declarative_base
|
||||
from sqlalchemy.orm.session import Session
|
||||
|
||||
|
||||
def get_uuid_as_hex() -> str:
|
||||
"""
|
||||
Generate a UUID as a hex string.
|
||||
:return: UUID as a hex string.
|
||||
"""
|
||||
return uuid.uuid4().hex
|
||||
|
||||
|
||||
@as_declarative()
|
||||
class Base:
|
||||
id = Column(Integer, primary_key=True)
|
||||
created_at = Column(DateTime, default=datetime.now())
|
||||
|
||||
# @declared_attr
|
||||
# def __tablename__(cls):
|
||||
# return cls.__name__.lower()
|
||||
update_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
|
||||
|
||||
|
||||
class BaseMixins:
|
||||
|
||||
@@ -2,6 +2,8 @@ from sqlalchemy import Boolean, Column, DateTime, Integer, String
|
||||
|
||||
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
|
||||
|
||||
from ._model_utils import auto_init
|
||||
|
||||
|
||||
class EventNotification(SqlAlchemyBase, BaseMixins):
|
||||
__tablename__ = "event_notifications"
|
||||
@@ -19,19 +21,9 @@ class EventNotification(SqlAlchemyBase, BaseMixins):
|
||||
group = Column(Boolean, default=False)
|
||||
user = Column(Boolean, default=False)
|
||||
|
||||
def __init__(
|
||||
self, name, notification_url, type, general, recipe, backup, scheduled, migration, group, user, **_
|
||||
) -> None:
|
||||
self.name = name
|
||||
self.notification_url = notification_url
|
||||
self.type = type
|
||||
self.general = general
|
||||
self.recipe = recipe
|
||||
self.backup = backup
|
||||
self.scheduled = scheduled
|
||||
self.migration = migration
|
||||
self.group = group
|
||||
self.user = user
|
||||
@auto_init()
|
||||
def __init__(self, **_) -> None:
|
||||
pass
|
||||
|
||||
|
||||
class Event(SqlAlchemyBase, BaseMixins):
|
||||
@@ -42,8 +34,6 @@ class Event(SqlAlchemyBase, BaseMixins):
|
||||
time_stamp = Column(DateTime)
|
||||
category = Column(String)
|
||||
|
||||
def __init__(self, title, text, time_stamp, category, **_) -> None:
|
||||
self.title = title
|
||||
self.text = text
|
||||
self.time_stamp = time_stamp
|
||||
self.category = category
|
||||
@auto_init()
|
||||
def __init__(self, **_) -> None:
|
||||
pass
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
from .group import *
|
||||
from .shopping_list import *
|
||||
from .webhooks import *
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from sqlalchemy import Column, ForeignKey, Integer, String, orm
|
||||
|
||||
from ._model_base import BaseMixins, SqlAlchemyBase
|
||||
from ._model_utils import auto_init
|
||||
from .recipe.category import Category, cookbooks_to_categories
|
||||
from .._model_base import BaseMixins, SqlAlchemyBase
|
||||
from .._model_utils import auto_init
|
||||
from ..recipe.category import Category, cookbooks_to_categories
|
||||
|
||||
|
||||
class CookBook(SqlAlchemyBase, BaseMixins):
|
||||
@@ -3,12 +3,12 @@ import sqlalchemy.orm as orm
|
||||
from sqlalchemy.orm.session import Session
|
||||
|
||||
from mealie.core.config import settings
|
||||
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
|
||||
from mealie.db.models.cookbook import CookBook
|
||||
from mealie.db.models.group.webhooks import GroupWebhooksModel
|
||||
from mealie.db.models.recipe.category import Category, group2categories
|
||||
|
||||
from .._model_base import BaseMixins, SqlAlchemyBase
|
||||
from .._model_utils import auto_init
|
||||
from ..group.webhooks import GroupWebhooksModel
|
||||
from ..recipe.category import Category, group2categories
|
||||
from .cookbook import CookBook
|
||||
|
||||
|
||||
class Group(SqlAlchemyBase, BaseMixins):
|
||||
|
||||
@@ -3,8 +3,8 @@ from requests import Session
|
||||
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
|
||||
from sqlalchemy.ext.orderinglist import ordering_list
|
||||
|
||||
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
|
||||
from mealie.db.models.group import Group
|
||||
from .._model_base import BaseMixins, SqlAlchemyBase
|
||||
from .group import Group
|
||||
|
||||
|
||||
class ShoppingListItem(SqlAlchemyBase, BaseMixins):
|
||||
@@ -5,7 +5,8 @@ from sqlalchemy.ext.orderinglist import ordering_list
|
||||
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
|
||||
from mealie.db.models.group import Group
|
||||
from mealie.db.models.recipe.recipe import RecipeModel
|
||||
from mealie.db.models.shopping_list import ShoppingList
|
||||
|
||||
from .group.shopping_list import ShoppingList
|
||||
|
||||
|
||||
class Meal(SqlAlchemyBase):
|
||||
|
||||
@@ -2,6 +2,8 @@ from sqlalchemy import Boolean, Column, Integer, String
|
||||
|
||||
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
|
||||
|
||||
from ._model_utils import auto_init
|
||||
|
||||
|
||||
class SignUp(SqlAlchemyBase, BaseMixins):
|
||||
__tablename__ = "sign_ups"
|
||||
@@ -10,13 +12,6 @@ class SignUp(SqlAlchemyBase, BaseMixins):
|
||||
name = Column(String, index=True)
|
||||
admin = Column(Boolean, default=False)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
session,
|
||||
token,
|
||||
name,
|
||||
admin,
|
||||
) -> None:
|
||||
self.token = token
|
||||
self.name = name
|
||||
self.admin = admin
|
||||
@auto_init()
|
||||
def __init__(self, **_) -> None:
|
||||
pass
|
||||
|
||||
1
mealie/db/models/users/__init__.py
Normal file
1
mealie/db/models/users/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .users import *
|
||||
@@ -27,9 +27,11 @@ class User(SqlAlchemyBase, BaseMixins):
|
||||
username = Column(String, index=True, unique=True)
|
||||
email = Column(String, unique=True, index=True)
|
||||
password = Column(String)
|
||||
admin = Column(Boolean, default=False)
|
||||
|
||||
group_id = Column(Integer, ForeignKey("groups.id"))
|
||||
group = orm.relationship("Group", back_populates="users")
|
||||
admin = Column(Boolean, default=False)
|
||||
|
||||
tokens: list[LongLiveToken] = orm.relationship(
|
||||
LongLiveToken, back_populates="user", cascade="all, delete, delete-orphan", single_parent=True
|
||||
)
|
||||
Reference in New Issue
Block a user