long_articles_mcp.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import math
  2. from typing import Any, Dict, Optional
  3. from app.core.database import DatabaseManager
  4. from app.core.observability import LogService
  5. class LongArticleMCP:
  6. def __init__(self, pool: DatabaseManager, log_service: LogService):
  7. self.pool = pool
  8. self.log_service = log_service
  9. SORTABLE_FIELDS = {
  10. "read_cnt",
  11. "read_median_multiplier",
  12. "publish_time",
  13. }
  14. BASE_WHERE = "WHERE t1.status = 2"
  15. BASE_FROM = """
  16. FROM long_articles_decode_tasks t1
  17. JOIN ad_platform_accounts_daily_detail t2
  18. ON t1.wx_sn = t2.wx_sn
  19. """
  20. async def get_decode_response(self, params: Optional[Dict[str, Any]] = None):
  21. params = params or {}
  22. page = params.get("page", 1)
  23. page_size = params.get("page_size", 20)
  24. sort_by = params.get("sort_by")
  25. sort_order = params.get("sort_order", "asc")
  26. count_query = f"SELECT COUNT(*) AS total {self.BASE_FROM} {self.BASE_WHERE}"
  27. count_result = await self.pool.async_fetch(query=count_query)
  28. total = count_result[0]["total"] if count_result else 0
  29. total_pages = math.ceil(total / page_size) if total > 0 else 0
  30. data_query = f"""
  31. SELECT t2.gh_id,
  32. t2.account_name,
  33. t2.article_title,
  34. t2.article_link,
  35. t2.article_cover,
  36. t2.article_text,
  37. t2.read_cnt,
  38. t2.read_median_multiplier,
  39. from_unixtime(t2.publish_timestamp, '%%Y-%%m-%%d %%H:%%i:%%s') as publish_time,
  40. t1.result
  41. {self.BASE_FROM}
  42. {self.BASE_WHERE}
  43. """
  44. if sort_by and sort_by in self.SORTABLE_FIELDS:
  45. direction = "ASC" if sort_order == "asc" else "DESC"
  46. order_column = "t2.publish_timestamp" if sort_by == "publish_time" else f"t2.{sort_by}"
  47. data_query += f" ORDER BY {order_column} {direction}"
  48. offset = (page - 1) * page_size
  49. data_query += " LIMIT %s OFFSET %s"
  50. rows = await self.pool.async_fetch(query=data_query, params=(page_size, offset))
  51. return {
  52. "total": total,
  53. "page": page,
  54. "page_size": page_size,
  55. "total_pages": total_pages,
  56. "items": rows,
  57. }