card_service.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. # app/services/card_service.py
  2. from typing import Optional
  3. from sqlalchemy import select
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from app.models.card import Card
  6. from app.schemas.card import CardCreate
  7. from app.utils.search import apply_keyword_search_stmt
  8. from app.utils.pagination import paginate
  9. from app.core.biz_exception import BizLogicError
  10. class CardService:
  11. # =========================
  12. # 创建 Card
  13. # =========================
  14. @staticmethod
  15. async def create(
  16. db: AsyncSession,
  17. obj_in: CardCreate,
  18. ) -> Card:
  19. db_obj = Card(**obj_in.dict())
  20. db.add(db_obj)
  21. await db.commit()
  22. await db.refresh(db_obj)
  23. return db_obj
  24. # =========================
  25. # 关键字分页查询
  26. # =========================
  27. @staticmethod
  28. async def list_by_keyword(
  29. db: AsyncSession,
  30. keyword: Optional[str] = None,
  31. page: int = 0,
  32. size: int = 10,
  33. culture: str = "english",
  34. ):
  35. stmt = select(Card).where(Card.culture == culture)
  36. stmt = apply_keyword_search_stmt(
  37. stmt=stmt,
  38. model=Card,
  39. keyword=keyword,
  40. fields=["title", "content", "label"],
  41. )
  42. return await paginate(db, stmt, page, size)