refactor: repository create mixin
This commit is contained in:
@ -1,8 +1,9 @@
|
||||
from typing import Generic, TypeVar
|
||||
from typing import Generic, TypeVar, Type
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
EntityType = TypeVar("EntityType")
|
||||
CreateType = TypeVar("CreateType")
|
||||
|
||||
|
||||
class RepBaseMixin(Generic[EntityType]):
|
||||
@ -18,8 +19,20 @@ class RepDeleteMixin(RepBaseMixin[EntityType]):
|
||||
|
||||
if not hasattr(obj, "is_deleted"):
|
||||
raise AttributeError(
|
||||
f"{obj.__class__.__name__} does not support soft delete (missing `is_deleted` field)"
|
||||
f"{obj.__class__.__name__} does not support soft delete (missing is_deleted field)"
|
||||
)
|
||||
obj.is_deleted = True
|
||||
self.session.add(obj)
|
||||
await self.session.commit()
|
||||
|
||||
|
||||
class RepCreateMixin(Generic[EntityType, CreateType]):
|
||||
session: AsyncSession
|
||||
entity_class: Type[EntityType]
|
||||
|
||||
async def create(self, data: CreateType) -> int:
|
||||
obj = self.entity_class(**data.model_dump())
|
||||
self.session.add(obj)
|
||||
await self.session.commit()
|
||||
await self.session.refresh(obj)
|
||||
return obj.id
|
||||
|
||||
Reference in New Issue
Block a user