Base code
This commit is contained in:
219
backend/routers/bing_insights.py
Normal file
219
backend/routers/bing_insights.py
Normal file
@@ -0,0 +1,219 @@
|
||||
"""
|
||||
Bing Insights API Routes
|
||||
|
||||
Provides endpoints for accessing Bing Webmaster insights and recommendations.
|
||||
"""
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from typing import Optional, Dict, Any
|
||||
from datetime import datetime, timedelta
|
||||
from loguru import logger
|
||||
import os
|
||||
|
||||
from services.analytics.insights.bing_insights_service import BingInsightsService
|
||||
from middleware.auth_middleware import get_current_user
|
||||
|
||||
router = APIRouter(prefix="/api/bing-insights", tags=["Bing Insights"])
|
||||
|
||||
# Initialize insights service
|
||||
DATABASE_URL = os.getenv('DATABASE_URL', 'sqlite:///./bing_analytics.db')
|
||||
insights_service = BingInsightsService(DATABASE_URL)
|
||||
|
||||
|
||||
@router.get("/performance")
|
||||
async def get_performance_insights(
|
||||
site_url: str = Query(..., description="Site URL to analyze"),
|
||||
days: int = Query(30, description="Number of days to analyze"),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get performance insights including trends and patterns for a Bing Webmaster site.
|
||||
"""
|
||||
try:
|
||||
user_id = current_user.get("id") or current_user.get("user_id")
|
||||
if not user_id:
|
||||
raise HTTPException(status_code=401, detail="User not authenticated")
|
||||
|
||||
logger.info(f"Getting performance insights for user {user_id}, site: {site_url}")
|
||||
|
||||
insights = insights_service.get_performance_insights(user_id, site_url, days)
|
||||
|
||||
if 'error' in insights:
|
||||
raise HTTPException(status_code=404, detail=insights['error'])
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": insights,
|
||||
"site_url": site_url,
|
||||
"analysis_period": f"{days} days",
|
||||
"generated_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting performance insights: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/seo")
|
||||
async def get_seo_insights(
|
||||
site_url: str = Query(..., description="Site URL to analyze"),
|
||||
days: int = Query(30, description="Number of days to analyze"),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get SEO-specific insights and opportunities for a Bing Webmaster site.
|
||||
"""
|
||||
try:
|
||||
user_id = current_user.get("id") or current_user.get("user_id")
|
||||
if not user_id:
|
||||
raise HTTPException(status_code=401, detail="User not authenticated")
|
||||
|
||||
logger.info(f"Getting SEO insights for user {user_id}, site: {site_url}")
|
||||
|
||||
insights = insights_service.get_seo_insights(user_id, site_url, days)
|
||||
|
||||
if 'error' in insights:
|
||||
raise HTTPException(status_code=404, detail=insights['error'])
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": insights,
|
||||
"site_url": site_url,
|
||||
"analysis_period": f"{days} days",
|
||||
"generated_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting SEO insights: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/competitive")
|
||||
async def get_competitive_insights(
|
||||
site_url: str = Query(..., description="Site URL to analyze"),
|
||||
days: int = Query(30, description="Number of days to analyze"),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get competitive analysis and market insights for a Bing Webmaster site.
|
||||
"""
|
||||
try:
|
||||
user_id = current_user.get("id") or current_user.get("user_id")
|
||||
if not user_id:
|
||||
raise HTTPException(status_code=401, detail="User not authenticated")
|
||||
|
||||
logger.info(f"Getting competitive insights for user {user_id}, site: {site_url}")
|
||||
|
||||
insights = insights_service.get_competitive_insights(user_id, site_url, days)
|
||||
|
||||
if 'error' in insights:
|
||||
raise HTTPException(status_code=404, detail=insights['error'])
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": insights,
|
||||
"site_url": site_url,
|
||||
"analysis_period": f"{days} days",
|
||||
"generated_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting competitive insights: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/recommendations")
|
||||
async def get_actionable_recommendations(
|
||||
site_url: str = Query(..., description="Site URL to analyze"),
|
||||
days: int = Query(30, description="Number of days to analyze"),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get actionable recommendations for improving search performance.
|
||||
"""
|
||||
try:
|
||||
user_id = current_user.get("id") or current_user.get("user_id")
|
||||
if not user_id:
|
||||
raise HTTPException(status_code=401, detail="User not authenticated")
|
||||
|
||||
logger.info(f"Getting actionable recommendations for user {user_id}, site: {site_url}")
|
||||
|
||||
recommendations = insights_service.get_actionable_recommendations(user_id, site_url, days)
|
||||
|
||||
if 'error' in recommendations:
|
||||
raise HTTPException(status_code=404, detail=recommendations['error'])
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": recommendations,
|
||||
"site_url": site_url,
|
||||
"analysis_period": f"{days} days",
|
||||
"generated_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting actionable recommendations: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/comprehensive")
|
||||
async def get_comprehensive_insights(
|
||||
site_url: str = Query(..., description="Site URL to analyze"),
|
||||
days: int = Query(30, description="Number of days to analyze"),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get comprehensive insights including performance, SEO, competitive, and recommendations.
|
||||
"""
|
||||
try:
|
||||
user_id = current_user.get("id") or current_user.get("user_id")
|
||||
if not user_id:
|
||||
raise HTTPException(status_code=401, detail="User not authenticated")
|
||||
|
||||
logger.info(f"Getting comprehensive insights for user {user_id}, site: {site_url}")
|
||||
|
||||
# Get all types of insights
|
||||
performance = insights_service.get_performance_insights(user_id, site_url, days)
|
||||
seo = insights_service.get_seo_insights(user_id, site_url, days)
|
||||
competitive = insights_service.get_competitive_insights(user_id, site_url, days)
|
||||
recommendations = insights_service.get_actionable_recommendations(user_id, site_url, days)
|
||||
|
||||
# Check for errors
|
||||
errors = []
|
||||
if 'error' in performance:
|
||||
errors.append(f"Performance insights: {performance['error']}")
|
||||
if 'error' in seo:
|
||||
errors.append(f"SEO insights: {seo['error']}")
|
||||
if 'error' in competitive:
|
||||
errors.append(f"Competitive insights: {competitive['error']}")
|
||||
if 'error' in recommendations:
|
||||
errors.append(f"Recommendations: {recommendations['error']}")
|
||||
|
||||
if errors:
|
||||
logger.warning(f"Some insights failed: {errors}")
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": {
|
||||
"performance": performance,
|
||||
"seo": seo,
|
||||
"competitive": competitive,
|
||||
"recommendations": recommendations
|
||||
},
|
||||
"site_url": site_url,
|
||||
"analysis_period": f"{days} days",
|
||||
"generated_at": datetime.now().isoformat(),
|
||||
"warnings": errors if errors else None
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting comprehensive insights: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||
Reference in New Issue
Block a user