from fastapi import APIRouter, Query, Depends, HTTPException from app.mongodb import chat_logs from datetime import datetime from app.verify_access import verify_access router = APIRouter(prefix="/api/analytics", tags=["Analytics"]) @router.get("/overview") async def get_analytics_overview( chatbot_id: str, start_date: str | None = Query(None, description="Start date YYYY-MM-DD"), end_date: str | None = Query(None, description="End date YYYY-MM-DD"), access=Depends(verify_access) ): """ Returns aggregated analytics data for charts: - sessions_per_day - requests_per_day - avg_latency_per_day """ # --- Build match filter --- match_filter = {"chatbot_id": chatbot_id} if start_date: try: match_filter["timestamp"] = match_filter.get("timestamp", {}) match_filter["timestamp"]["$gte"] = datetime.strptime(start_date, "%Y-%m-%d") except ValueError: raise HTTPException(status_code=400, detail="Invalid start_date format. Use YYYY-MM-DD") if end_date: try: match_filter["timestamp"] = match_filter.get("timestamp", {}) match_filter["timestamp"]["$lte"] = datetime.strptime(end_date, "%Y-%m-%d") except ValueError: raise HTTPException(status_code=400, detail="Invalid end_date format. Use YYYY-MM-DD") # --- Sessions per day --- pipeline_sessions = [ {"$match": match_filter}, { "$group": { "_id": { "$dateToString": {"format": "%Y-%m-%d", "date": "$timestamp", "timezone": "America/Los_Angeles"} }, "unique_sessions": {"$addToSet": "$session_id"} } }, {"$project": {"date": "$_id", "count": {"$size": "$unique_sessions"}, "_id": 0}}, {"$sort": {"date": 1}} ] sessions_per_day = await chat_logs.aggregate(pipeline_sessions).to_list(length=None) # --- Requests per day --- pipeline_requests = [ {"$match": match_filter}, { "$group": { "_id": { "$dateToString": {"format": "%Y-%m-%d", "date": "$timestamp", "timezone": "America/Los_Angeles"} }, "count": {"$sum": 1} } }, {"$project": {"date": "$_id", "count": 1, "_id": 0}}, {"$sort": {"date": 1}} ] requests_per_day = await chat_logs.aggregate(pipeline_requests).to_list(length=None) # --- Average latency per day --- latency_filter = match_filter.copy() latency_filter["latency_ms"] = {"$exists": True} pipeline_latency = [ {"$match": latency_filter}, { "$group": { "_id": { "$dateToString": {"format": "%Y-%m-%d", "date": "$timestamp", "timezone": "America/Los_Angeles"} }, "avg_latency": {"$avg": "$latency_ms"} } }, {"$project": {"date": "$_id", "avg_latency": {"$divide": ["$avg_latency", 1000]}, "_id": 0}}, {"$sort": {"date": 1}} ] avg_latency_per_day = await chat_logs.aggregate(pipeline_latency).to_list(length=None) return { "sessions_per_day": sessions_per_day, "requests_per_day": requests_per_day, "avg_latency_per_day": avg_latency_per_day }