| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import math
- from typing import Any, Dict, Optional
- from app.core.database import DatabaseManager
- from app.core.observability import LogService
- class LongArticleMCP:
- def __init__(self, pool: DatabaseManager, log_service: LogService):
- self.pool = pool
- self.log_service = log_service
- SORTABLE_FIELDS = {
- "read_cnt",
- "read_median_multiplier",
- "publish_time",
- }
- BASE_WHERE = "WHERE t1.status = 2"
- BASE_FROM = """
- FROM long_articles_decode_tasks t1
- JOIN ad_platform_accounts_daily_detail t2
- ON t1.wx_sn = t2.wx_sn
- """
- async def get_decode_response(self, params: Optional[Dict[str, Any]] = None):
- params = params or {}
- page = params.get("page", 1)
- page_size = params.get("page_size", 20)
- sort_by = params.get("sort_by")
- sort_order = params.get("sort_order", "asc")
- count_query = f"SELECT COUNT(*) AS total {self.BASE_FROM} {self.BASE_WHERE}"
- count_result = await self.pool.async_fetch(query=count_query)
- total = count_result[0]["total"] if count_result else 0
- total_pages = math.ceil(total / page_size) if total > 0 else 0
- data_query = f"""
- SELECT t2.gh_id,
- t2.account_name,
- t2.article_title,
- t2.article_link,
- t2.article_cover,
- t2.article_text,
- t2.read_cnt,
- t2.read_median_multiplier,
- from_unixtime(t2.publish_timestamp, '%%Y-%%m-%%d %%H:%%i:%%s') as publish_time,
- t1.result
- {self.BASE_FROM}
- {self.BASE_WHERE}
- """
- if sort_by and sort_by in self.SORTABLE_FIELDS:
- direction = "ASC" if sort_order == "asc" else "DESC"
- order_column = "t2.publish_timestamp" if sort_by == "publish_time" else f"t2.{sort_by}"
- data_query += f" ORDER BY {order_column} {direction}"
- offset = (page - 1) * page_size
- data_query += " LIMIT %s OFFSET %s"
- rows = await self.pool.async_fetch(query=data_query, params=(page_size, offset))
- return {
- "total": total,
- "page": page,
- "page_size": page_size,
- "total_pages": total_pages,
- "items": rows,
- }
|