|
|
"""Trending topics endpoints.""" |
|
|
|
|
|
from typing import Literal |
|
|
from fastapi import APIRouter, Depends |
|
|
|
|
|
from services.auth_dependency import get_current_user |
|
|
from services.trend_monitor import trend_monitor |
|
|
from services.current_occasions import get_current_occasions |
|
|
|
|
|
router = APIRouter(tags=["trends"]) |
|
|
|
|
|
|
|
|
@router.get("/api/trends/{niche}") |
|
|
async def get_trends( |
|
|
niche: Literal["home_insurance", "glp1", "auto_insurance"], |
|
|
username: str = Depends(get_current_user), |
|
|
): |
|
|
""" |
|
|
Get current trending topics for a niche: date-based occasions (e.g. Valentine's Week) |
|
|
plus niche-specific news. Topics are analyzed from the current date so they stay timely. |
|
|
""" |
|
|
try: |
|
|
data = await trend_monitor.get_relevant_trends_for_niche(niche) |
|
|
raw = data.get("relevant_trends") or [] |
|
|
|
|
|
trends = [ |
|
|
{ |
|
|
"title": t.get("title", ""), |
|
|
"description": t.get("summary", t.get("description", "")), |
|
|
"category": t.get("category", "General"), |
|
|
"url": t.get("url"), |
|
|
} |
|
|
for t in raw |
|
|
] |
|
|
return { |
|
|
"status": "ok", |
|
|
"niche": niche, |
|
|
"trends": trends, |
|
|
"count": len(trends), |
|
|
} |
|
|
except Exception as e: |
|
|
|
|
|
occasions = await get_current_occasions() |
|
|
trends = [ |
|
|
{ |
|
|
"title": o["title"], |
|
|
"description": o["summary"], |
|
|
"category": o.get("category", "Occasion"), |
|
|
} |
|
|
for o in occasions |
|
|
] |
|
|
return { |
|
|
"status": "ok", |
|
|
"niche": niche, |
|
|
"trends": trends, |
|
|
"count": len(trends), |
|
|
"message": "Showing current occasions (news temporarily unavailable).", |
|
|
} |
|
|
|
|
|
|
|
|
@router.get("/api/trends/angles/{niche}") |
|
|
async def get_trending_angles( |
|
|
niche: Literal["home_insurance", "glp1", "auto_insurance"], |
|
|
username: str = Depends(get_current_user), |
|
|
): |
|
|
""" |
|
|
Get auto-generated angle suggestions based on current trends and occasions. |
|
|
""" |
|
|
try: |
|
|
angles = await trend_monitor.get_trending_angles(niche) |
|
|
return { |
|
|
"status": "ok", |
|
|
"niche": niche, |
|
|
"trending_angles": angles, |
|
|
"count": len(angles), |
|
|
} |
|
|
except Exception as e: |
|
|
return { |
|
|
"status": "ok", |
|
|
"niche": niche, |
|
|
"trending_angles": [], |
|
|
"count": 0, |
|
|
"message": "Angle suggestions temporarily unavailable.", |
|
|
} |
|
|
|