knowledge.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from __future__ import annotations
  2. from sqlalchemy import or_, select
  3. from sqlalchemy.orm import Session
  4. from app.db.models.knowledge import KnowledgeItem
  5. from app.db.repositories.base import paginate
  6. def list_knowledge(
  7. db: Session,
  8. *,
  9. mine_id: str | None = None,
  10. knowledge_type: str | None = None,
  11. category: str | None = None,
  12. keyword: str | None = None,
  13. page: int = 1,
  14. page_size: int = 20,
  15. ) -> tuple[list[KnowledgeItem], int]:
  16. statement = select(KnowledgeItem)
  17. if mine_id:
  18. statement = statement.where(
  19. or_(KnowledgeItem.mine_id == mine_id, KnowledgeItem.mine_id.is_(None))
  20. )
  21. if knowledge_type:
  22. statement = statement.where(KnowledgeItem.knowledge_type == knowledge_type)
  23. if category:
  24. statement = statement.where(KnowledgeItem.category == category)
  25. if keyword:
  26. query = f"%{keyword.strip()}%"
  27. statement = statement.where(
  28. or_(
  29. KnowledgeItem.title.like(query),
  30. KnowledgeItem.content.like(query),
  31. KnowledgeItem.summary.like(query),
  32. KnowledgeItem.code.like(query),
  33. )
  34. )
  35. statement = statement.order_by(KnowledgeItem.updated_at.desc())
  36. return paginate(db, statement, page, page_size)
  37. def get_knowledge(db: Session, knowledge_id: str) -> KnowledgeItem | None:
  38. return db.get(KnowledgeItem, knowledge_id)