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:
Hayden
2021-09-04 12:28:49 -08:00
committed by GitHub
parent b550dae593
commit 3d87ffc3a5
23 changed files with 188 additions and 181 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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 *

View File

@@ -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:

View File

@@ -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

View File

@@ -1 +1,3 @@
from .group import *
from .shopping_list import *
from .webhooks import *

View File

@@ -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):

View File

@@ -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):

View File

@@ -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):

View File

@@ -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):

View File

@@ -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

View File

@@ -0,0 +1 @@
from .users import *

View File

@@ -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
)