from sqlmodel import BIGINT, Field, select, func, column from sqlmodel.ext.asyncio.session import AsyncSession from .bot_entity import BotEntity from .descriptors import EntityField from .user import UserBase from . import session_dep class OwnedBotEntity(BotEntity, table = False): user_id: int | None = EntityField( sm_descriptor = Field(sa_type = BIGINT, foreign_key = "user.id", ondelete="SET NULL"), is_visible = False) @classmethod @session_dep async def get_multi_by_user(cls, *, session: AsyncSession | None = None, user_id: int, filter: str = None, order_by = None, skip: int = 0, limit: int = None): select_statement = select(cls).where(cls.user_id == user_id).offset(skip) if filter: select_statement = select_statement.where(column("name").ilike(f"%{filter}%")) if limit: select_statement = select_statement.limit(limit) if order_by: select_statement = select_statement.order_by(order_by) return (await session.exec(select_statement)).all() @classmethod @session_dep async def get_count_by_user(cls, *, session: AsyncSession | None = None, user_id: int, filter: str = None) -> int: select_statement = select(func.count()).select_from(cls).where(cls.user_id == user_id) if filter: select_statement = select_statement.where(column("name").ilike(f"%{filter}%")) return await session.scalar(select_statement)