95 lines
3.8 KiB
Python
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
|