Files
ALwrity/backend/services/seo/advertools_task_manager.py

95 lines
3.8 KiB
Python

"""
Advertools Task Restoration Utility
Handles creation and restoration of Advertools intelligence tasks for users.
"""
from datetime import datetime, timedelta
from typing import Any
from loguru import logger
from sqlalchemy import func
from sqlalchemy.orm import Session
from models.onboarding import WebsiteAnalysis, OnboardingSession
from models.advertools_monitoring_models import AdvertoolsTask
from services.database import get_all_user_ids, get_session_for_user
async def restore_advertools_tasks(scheduler: Any) -> int:
"""
Restore/create Advertools tasks for all users who have completed Step 2.
Returns:
Number of tasks created/restored
"""
logger.info("Restoring Advertools intelligence tasks...")
total_created = 0
user_ids = get_all_user_ids()
for user_id in user_ids:
try:
db = get_session_for_user(user_id)
if not db:
continue
try:
# Check if user has completed Step 2 (has WebsiteAnalysis)
session = db.query(OnboardingSession).filter(OnboardingSession.user_id == user_id).first()
if not session:
continue
analysis = db.query(WebsiteAnalysis).filter(WebsiteAnalysis.session_id == session.id).first()
if not analysis or not analysis.website_url:
continue
# Check for existing Advertools tasks
existing_audit = db.query(AdvertoolsTask).filter(
AdvertoolsTask.user_id == user_id,
func.json_extract(AdvertoolsTask.payload, '$.type') == 'content_audit'
).first()
if not existing_audit:
# Create weekly content audit task
new_audit = AdvertoolsTask(
user_id=user_id,
website_url=analysis.website_url,
status='active',
next_execution=datetime.utcnow() + timedelta(days=1), # Start tomorrow
frequency_days=7,
payload={
"type": "content_audit",
"website_url": analysis.website_url
}
)
db.add(new_audit)
total_created += 1
logger.info(f"Created weekly content audit task for user {user_id}")
existing_health = db.query(AdvertoolsTask).filter(
AdvertoolsTask.user_id == user_id,
func.json_extract(AdvertoolsTask.payload, '$.type') == 'site_health'
).first()
if not existing_health:
# Create weekly site health task
new_health = AdvertoolsTask(
user_id=user_id,
website_url=analysis.website_url,
status='active',
next_execution=datetime.utcnow() + timedelta(days=2), # Start in 2 days
frequency_days=7,
payload={
"type": "site_health",
"website_url": analysis.website_url
}
)
db.add(new_health)
total_created += 1
logger.info(f"Created weekly site health task for user {user_id}")
db.commit()
finally:
db.close()
except Exception as e:
logger.error(f"Error restoring Advertools tasks for user {user_id}: {e}")
return total_created