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.
153 lines
5.3 KiB
Python
153 lines
5.3 KiB
Python
"""
|
|
Platform Connection Manager
|
|
|
|
Manages platform connection status checking and caching across all analytics platforms.
|
|
"""
|
|
|
|
from typing import Dict, Any, List
|
|
from loguru import logger
|
|
|
|
from ..analytics_cache_service import analytics_cache
|
|
from .handlers import (
|
|
GSCAnalyticsHandler,
|
|
BingAnalyticsHandler,
|
|
WordPressAnalyticsHandler,
|
|
WixAnalyticsHandler
|
|
)
|
|
from .models.platform_types import PlatformType
|
|
|
|
|
|
class PlatformConnectionManager:
|
|
"""Manages platform connection status across all analytics platforms"""
|
|
|
|
def __init__(self):
|
|
self.handlers = {
|
|
PlatformType.GSC: GSCAnalyticsHandler(),
|
|
PlatformType.BING: BingAnalyticsHandler(),
|
|
PlatformType.WORDPRESS: WordPressAnalyticsHandler(),
|
|
PlatformType.WIX: WixAnalyticsHandler()
|
|
}
|
|
|
|
async def get_platform_connection_status(self, user_id: str) -> Dict[str, Dict[str, Any]]:
|
|
"""
|
|
Check connection status for all platforms
|
|
|
|
Returns:
|
|
Dictionary with connection status for each platform
|
|
"""
|
|
# Check cache first - connection status doesn't change frequently
|
|
cached_status = analytics_cache.get('platform_status', user_id)
|
|
if cached_status:
|
|
logger.info("Using cached platform connection status for user {user_id}", user_id=user_id)
|
|
return cached_status
|
|
|
|
logger.info("Fetching fresh platform connection status for user {user_id}", user_id=user_id)
|
|
status = {}
|
|
|
|
# Check each platform connection
|
|
for platform_type, handler in self.handlers.items():
|
|
platform_name = platform_type.value
|
|
try:
|
|
status[platform_name] = handler.get_connection_status(user_id)
|
|
except Exception as e:
|
|
logger.error(f"Error checking {platform_name} connection status: {e}")
|
|
status[platform_name] = {
|
|
'connected': False,
|
|
'sites_count': 0,
|
|
'sites': [],
|
|
'error': str(e)
|
|
}
|
|
|
|
# Cache the connection status
|
|
analytics_cache.set('platform_status', user_id, status)
|
|
logger.info("Cached platform connection status for user {user_id}", user_id=user_id)
|
|
|
|
return status
|
|
|
|
def get_connected_platforms(self, user_id: str, status_data: Dict[str, Dict[str, Any]] = None) -> List[str]:
|
|
"""
|
|
Get list of connected platform names
|
|
|
|
Args:
|
|
user_id: User ID
|
|
status_data: Optional pre-fetched status data
|
|
|
|
Returns:
|
|
List of connected platform names
|
|
"""
|
|
if status_data is None:
|
|
# This would need to be async, but for now return empty list
|
|
# In practice, this method should be called with pre-fetched status
|
|
return []
|
|
|
|
connected_platforms = []
|
|
for platform_name, status in status_data.items():
|
|
if status.get('connected', False):
|
|
connected_platforms.append(platform_name)
|
|
|
|
return connected_platforms
|
|
|
|
def get_platform_sites_count(self, user_id: str, platform_name: str, status_data: Dict[str, Dict[str, Any]] = None) -> int:
|
|
"""
|
|
Get sites count for a specific platform
|
|
|
|
Args:
|
|
user_id: User ID
|
|
platform_name: Name of the platform
|
|
status_data: Optional pre-fetched status data
|
|
|
|
Returns:
|
|
Number of connected sites for the platform
|
|
"""
|
|
if status_data is None:
|
|
return 0
|
|
|
|
platform_status = status_data.get(platform_name, {})
|
|
return platform_status.get('sites_count', 0)
|
|
|
|
def is_platform_connected(self, user_id: str, platform_name: str, status_data: Dict[str, Dict[str, Any]] = None) -> bool:
|
|
"""
|
|
Check if a specific platform is connected
|
|
|
|
Args:
|
|
user_id: User ID
|
|
platform_name: Name of the platform
|
|
status_data: Optional pre-fetched status data
|
|
|
|
Returns:
|
|
True if platform is connected, False otherwise
|
|
"""
|
|
if status_data is None:
|
|
return False
|
|
|
|
platform_status = status_data.get(platform_name, {})
|
|
return platform_status.get('connected', False)
|
|
|
|
def get_platform_error(self, user_id: str, platform_name: str, status_data: Dict[str, Dict[str, Any]] = None) -> str:
|
|
"""
|
|
Get error message for a specific platform
|
|
|
|
Args:
|
|
user_id: User ID
|
|
platform_name: Name of the platform
|
|
status_data: Optional pre-fetched status data
|
|
|
|
Returns:
|
|
Error message if any, None otherwise
|
|
"""
|
|
if status_data is None:
|
|
return None
|
|
|
|
platform_status = status_data.get(platform_name, {})
|
|
return platform_status.get('error')
|
|
|
|
def invalidate_connection_cache(self, user_id: str):
|
|
"""
|
|
Invalidate connection status cache for a user
|
|
|
|
Args:
|
|
user_id: User ID to invalidate cache for
|
|
"""
|
|
analytics_cache.invalidate('platform_status', user_id)
|
|
logger.info("Invalidated platform connection status cache for user {user_id}", user_id=user_id)
|