"""뉴스/공시 목록 API.""" from __future__ import annotations from fastapi import APIRouter, HTTPException, Query from sqlalchemy import text from app.db.connection import get_engine router = APIRouter(prefix="/api/news", tags=["news"]) @router.get("/{code}") def list_news( code: str, limit: int = Query(default=20, ge=1, le=200), source: str | None = Query(default=None, description="naver_finance / google_rss / dart"), ) -> dict: eng = get_engine() with eng.connect() as conn: sym = conn.execute( text("SELECT code, name FROM symbols WHERE code = :c"), {"c": code}, ).first() if not sym: raise HTTPException(status_code=404, detail=f"unknown code: {code}") where = "code = :c" params: dict = {"c": code, "lim": limit} if source: where += " AND source = :src" params["src"] = source rows = conn.execute( text( f""" SELECT source, published_at, title, url, sentiment_score, sentiment_label FROM news WHERE {where} ORDER BY published_at DESC LIMIT :lim """ ), params, ).all() return { "code": sym[0], "name": sym[1], "count": len(rows), "items": [ { "source": r[0], "published_at": r[1].isoformat() if r[1] else None, "title": r[2], "url": r[3], "sentiment_score": float(r[4]) if r[4] is not None else None, "sentiment_label": r[5], } for r in rows ], }