Bing Analytics and Insights added, background jobs added, database setup updated, environment setup updated, frontend updated, backend updated.
Onboarding Manager and Router Manager refactored, analytics and background jobs added, database setup updated, environment setup updated, frontend updated, backend updated. Critical onboarding database migration implemented.
This commit is contained in:
@@ -6,6 +6,7 @@ Handles database initialization and table creation.
|
||||
from typing import List, Tuple
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from loguru import logger
|
||||
|
||||
|
||||
class DatabaseSetup:
|
||||
|
||||
@@ -173,11 +173,55 @@ class OnboardingManager:
|
||||
logger.error(f"Error in api_key_save: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@self.app.post("/api/onboarding/api-keys/validate")
|
||||
@self.app.get("/api/onboarding/api-keys/validate")
|
||||
async def api_key_validate():
|
||||
"""Validate all configured API keys."""
|
||||
"""Get API key validation status and configuration."""
|
||||
try:
|
||||
return await validate_api_keys()
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Load environment variables
|
||||
backend_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
env_path = os.path.join(backend_dir, ".env")
|
||||
load_dotenv(env_path, override=True)
|
||||
|
||||
# Check for required API keys (backend only)
|
||||
api_keys = {}
|
||||
required_keys = {
|
||||
'GEMINI_API_KEY': 'gemini',
|
||||
'EXA_API_KEY': 'exa'
|
||||
# Note: CopilotKit is frontend-only, validated separately
|
||||
}
|
||||
|
||||
missing_keys = []
|
||||
configured_providers = []
|
||||
|
||||
for env_var, provider in required_keys.items():
|
||||
key_value = os.getenv(env_var)
|
||||
if key_value and key_value.strip():
|
||||
api_keys[provider] = key_value.strip()
|
||||
configured_providers.append(provider)
|
||||
else:
|
||||
missing_keys.append(provider)
|
||||
|
||||
# Determine if all required keys are present
|
||||
required_providers = ['gemini', 'exa'] # Backend keys only
|
||||
all_required_present = all(provider in configured_providers for provider in required_providers)
|
||||
|
||||
result = {
|
||||
"api_keys": api_keys,
|
||||
"validation_results": {
|
||||
"gemini": {"valid": 'gemini' in configured_providers, "status": "configured" if 'gemini' in configured_providers else "missing"},
|
||||
"exa": {"valid": 'exa' in configured_providers, "status": "configured" if 'exa' in configured_providers else "missing"}
|
||||
},
|
||||
"all_valid": all_required_present,
|
||||
"total_providers": len(configured_providers),
|
||||
"configured_providers": configured_providers,
|
||||
"missing_keys": missing_keys
|
||||
}
|
||||
|
||||
logger.info(f"API Key Validation Result: {result}")
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error in api_key_validate: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
@@ -301,7 +345,7 @@ class OnboardingManager:
|
||||
|
||||
# Business Information endpoints
|
||||
@self.app.post("/api/onboarding/business-info")
|
||||
async def business_info_save(request: 'BusinessInfoRequest'):
|
||||
async def business_info_save(request: dict):
|
||||
"""Save business information for users without websites."""
|
||||
try:
|
||||
from models.business_info_request import BusinessInfoRequest
|
||||
@@ -329,7 +373,7 @@ class OnboardingManager:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@self.app.put("/api/onboarding/business-info/{business_info_id}")
|
||||
async def business_info_update(business_info_id: int, request: 'BusinessInfoRequest'):
|
||||
async def business_info_update(business_info_id: int, request: dict):
|
||||
"""Update business information."""
|
||||
try:
|
||||
from models.business_info_request import BusinessInfoRequest
|
||||
|
||||
@@ -64,6 +64,18 @@ class RouterManager:
|
||||
from routers.wordpress_oauth import router as wordpress_oauth_router
|
||||
self.include_router_safely(wordpress_oauth_router, "wordpress_oauth")
|
||||
|
||||
# Bing Webmaster router
|
||||
from routers.bing_oauth import router as bing_oauth_router
|
||||
self.include_router_safely(bing_oauth_router, "bing_oauth")
|
||||
|
||||
# Bing Analytics router
|
||||
from routers.bing_analytics import router as bing_analytics_router
|
||||
self.include_router_safely(bing_analytics_router, "bing_analytics")
|
||||
|
||||
# Bing Analytics Storage router
|
||||
from routers.bing_analytics_storage import router as bing_analytics_storage_router
|
||||
self.include_router_safely(bing_analytics_storage_router, "bing_analytics_storage")
|
||||
|
||||
# SEO tools router
|
||||
from routers.seo_tools import router as seo_tools_router
|
||||
self.include_router_safely(seo_tools_router, "seo_tools")
|
||||
@@ -112,6 +124,33 @@ class RouterManager:
|
||||
from routers.frontend_env_manager import router as frontend_env_router
|
||||
self.include_router_safely(frontend_env_router, "frontend_env_manager")
|
||||
|
||||
# Platform analytics router
|
||||
try:
|
||||
from routers.platform_analytics import router as platform_analytics_router
|
||||
self.include_router_safely(platform_analytics_router, "platform_analytics")
|
||||
logger.info("✅ Platform analytics router included successfully")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Failed to include platform analytics router: {e}")
|
||||
# Continue with other routers
|
||||
|
||||
# Bing insights router
|
||||
try:
|
||||
from routers.bing_insights import router as bing_insights_router
|
||||
self.include_router_safely(bing_insights_router, "bing_insights")
|
||||
logger.info("✅ Bing insights router included successfully")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Failed to include Bing insights router: {e}")
|
||||
# Continue with other routers
|
||||
|
||||
# Background jobs router
|
||||
try:
|
||||
from routers.background_jobs import router as background_jobs_router
|
||||
self.include_router_safely(background_jobs_router, "background_jobs")
|
||||
logger.info("✅ Background jobs router included successfully")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Failed to include Background jobs router: {e}")
|
||||
# Continue with other routers
|
||||
|
||||
logger.info("✅ Core routers included successfully")
|
||||
return True
|
||||
|
||||
|
||||
Reference in New Issue
Block a user