2024-07-21 21:44:22 +08:00
|
|
|
from typing import TypeVar, Generic, Any
|
2024-07-21 15:06:51 +08:00
|
|
|
|
|
|
|
from pydantic import BaseModel
|
2024-07-21 21:44:22 +08:00
|
|
|
from sqlalchemy.orm import DeclarativeBase
|
2024-07-21 15:06:51 +08:00
|
|
|
|
2024-07-24 04:30:01 +08:00
|
|
|
from felicity.apps.abstract.repository import BaseRepository
|
2024-07-21 15:06:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
E = TypeVar("E", bound=DeclarativeBase)
|
|
|
|
C = TypeVar("C", bound=BaseModel)
|
|
|
|
U = TypeVar("U", bound=BaseModel)
|
|
|
|
|
|
|
|
|
|
|
|
class BaseService(Generic[E, C, U]):
|
|
|
|
def __init__(self, repository: BaseRepository) -> None:
|
2024-07-24 04:30:01 +08:00
|
|
|
self.repository = repository()
|
|
|
|
|
2024-07-21 15:06:51 +08:00
|
|
|
async def paging_filter(
|
|
|
|
self,
|
|
|
|
page_size: int | None = None,
|
|
|
|
after_cursor: str | None = None,
|
|
|
|
before_cursor: str | None = None,
|
|
|
|
text: str | None = None,
|
|
|
|
sort_by: list[str] | None = None,
|
|
|
|
**kwargs
|
2024-07-21 21:44:22 +08:00
|
|
|
):
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.paginate_with_cursors(
|
|
|
|
page_size, after_cursor, before_cursor, text, sort_by, **kwargs
|
|
|
|
)
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def search(self, **kwargs) -> list[E]:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.search(**kwargs)
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def all(self) -> list[E]:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.all()
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def get(self, **kwargs) -> E:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.get(**kwargs)
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def get_by_uids(self, uids: list[str]) -> list[E]:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.get_by_uids(uids)
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def get_all(self, **kwargs) -> list[E]:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.get_all(**kwargs)
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def get_related(self, uid: str, related: list[str]) -> E:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.get_related(uid, related)
|
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def create(self, c: C | dict) -> E:
|
|
|
|
data = self._import(c)
|
|
|
|
return await self.repository.create(**data)
|
2024-07-21 15:06:51 +08:00
|
|
|
|
2024-07-24 04:30:01 +08:00
|
|
|
async def bulk_create(self, bulk: list[dict | C]) -> None:
|
|
|
|
return await self.repository.bulk_create([self._import(b) for b in bulk])
|
2024-07-21 15:06:51 +08:00
|
|
|
|
2024-07-24 04:30:01 +08:00
|
|
|
async def update(self, uid: str, update: U | dict) -> E:
|
|
|
|
return await self.repository.update(uid, **self._import(update))
|
2024-07-21 15:06:51 +08:00
|
|
|
|
2024-07-21 21:44:22 +08:00
|
|
|
async def bulk_update_with_mappings(self, mappings: list[dict]) -> list[E]:
|
2024-07-21 15:06:51 +08:00
|
|
|
return await self.repository.bulk_update_with_mappings(mappings)
|
|
|
|
|
|
|
|
async def delete(self, uid: str) -> None:
|
|
|
|
return await self.repository.delete(uid)
|
2024-07-21 21:44:22 +08:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def _import(cls, schema_in: C | U | dict) -> dict:
|
|
|
|
"""Convert Pydantic schema to dict"""
|
|
|
|
if isinstance(schema_in, dict):
|
|
|
|
return schema_in
|
|
|
|
return schema_in.model_dump(exclude_unset=True)
|