Files
ALwrity/backend/services/platform_insights_monitoring_service.py

137 lines
3.9 KiB
Python

"""
Platform Insights Monitoring Service
Creates and manages platform insights (GSC/Bing) fetch tasks.
"""
from datetime import datetime, timedelta
from typing import Dict, Any, Optional, List
from sqlalchemy.orm import Session
from models.platform_insights_monitoring_models import PlatformInsightsTask
from utils.logger_utils import get_service_logger
logger = get_service_logger("platform_insights_monitoring")
def create_platform_insights_task(
user_id: str,
platform: str, # 'gsc' or 'bing'
site_url: Optional[str] = None,
db: Session = None
) -> Dict[str, Any]:
"""
Create a platform insights fetch task for a user.
This should be called when user connects GSC or Bing in Step 5.
Args:
user_id: Clerk user ID (string)
platform: Platform name ('gsc' or 'bing')
site_url: Optional site URL (for GSC/Bing specific site)
db: Database session
Returns:
Dictionary with success status and task details
"""
try:
logger.info(
f"[Platform Insights] Creating {platform} insights task for user: {user_id}"
)
# Check if task already exists
existing = db.query(PlatformInsightsTask).filter(
PlatformInsightsTask.user_id == user_id,
PlatformInsightsTask.platform == platform
).first()
if existing:
logger.info(
f"[Platform Insights] Task already exists for user {user_id}, platform {platform}"
)
return {
'success': True,
'task_id': existing.id,
'message': 'Task already exists',
'existing': True
}
# Calculate next check (7 days from now, weekly schedule)
next_check = datetime.utcnow() + timedelta(days=7)
# Create new task
task = PlatformInsightsTask(
user_id=user_id,
platform=platform,
site_url=site_url,
status='active',
next_check=next_check,
created_at=datetime.utcnow(),
updated_at=datetime.utcnow()
)
db.add(task)
db.commit()
db.refresh(task)
logger.info(
f"[Platform Insights] Created {platform} insights task {task.id} for user {user_id}, "
f"next_check: {next_check}"
)
return {
'success': True,
'task_id': task.id,
'platform': platform,
'next_check': next_check.isoformat(),
'message': f'{platform.upper()} insights task created successfully'
}
except Exception as e:
logger.error(
f"Error creating {platform} insights task for user {user_id}: {e}",
exc_info=True
)
db.rollback()
return {
'success': False,
'error': str(e)
}
def get_user_insights_tasks(
user_id: str,
platform: Optional[str] = None,
db: Session = None
) -> List[PlatformInsightsTask]:
"""
Get all platform insights tasks for a user.
Args:
user_id: Clerk user ID (string)
platform: Optional platform filter ('gsc' or 'bing')
db: Database session
Returns:
List of PlatformInsightsTask instances
"""
try:
query = db.query(PlatformInsightsTask).filter(
PlatformInsightsTask.user_id == user_id
)
if platform:
query = query.filter(PlatformInsightsTask.platform == platform)
tasks = query.all()
logger.debug(
f"[Platform Insights] Found {len(tasks)} insights tasks for user {user_id}"
)
return tasks
except Exception as e:
logger.error(f"Error getting insights tasks for user {user_id}: {e}", exc_info=True)
return []