Base code
This commit is contained in:
251
backend/services/progressive_setup_service.py
Normal file
251
backend/services/progressive_setup_service.py
Normal file
@@ -0,0 +1,251 @@
|
||||
"""
|
||||
Progressive Setup Service
|
||||
Handles progressive backend initialization based on user onboarding progress.
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
from typing import Dict, Any, Optional, List
|
||||
from datetime import datetime
|
||||
from loguru import logger
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import text
|
||||
|
||||
from services.user_workspace_manager import UserWorkspaceManager
|
||||
from services.onboarding.api_key_manager import get_onboarding_progress_for_user
|
||||
|
||||
class ProgressiveSetupService:
|
||||
"""Manages progressive backend setup based on user progress."""
|
||||
|
||||
def __init__(self, db_session: Session):
|
||||
self.db = db_session
|
||||
self.workspace_manager = UserWorkspaceManager(db_session)
|
||||
|
||||
def initialize_user_environment(self, user_id: str) -> Dict[str, Any]:
|
||||
"""Initialize user environment based on their onboarding progress."""
|
||||
try:
|
||||
logger.info(f"Initializing environment for user {user_id}")
|
||||
|
||||
# Get user's onboarding progress
|
||||
progress = get_onboarding_progress_for_user(user_id)
|
||||
current_step = progress.current_step
|
||||
|
||||
# Create or get user workspace
|
||||
workspace = self.workspace_manager.get_user_workspace(user_id)
|
||||
if not workspace:
|
||||
workspace = self.workspace_manager.create_user_workspace(user_id)
|
||||
|
||||
# Set up features progressively
|
||||
setup_status = self.workspace_manager.setup_progressive_features(user_id, current_step)
|
||||
|
||||
# Initialize user-specific services
|
||||
services_status = self._initialize_user_services(user_id, current_step)
|
||||
|
||||
return {
|
||||
"user_id": user_id,
|
||||
"onboarding_step": current_step,
|
||||
"workspace": workspace,
|
||||
"setup_status": setup_status,
|
||||
"services": services_status,
|
||||
"initialized_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error initializing user environment: {e}")
|
||||
raise
|
||||
|
||||
def _initialize_user_services(self, user_id: str, step: int) -> Dict[str, Any]:
|
||||
"""Initialize user-specific services based on onboarding step."""
|
||||
services = {
|
||||
"ai_services": {"enabled": False, "services": []},
|
||||
"content_services": {"enabled": False, "services": []},
|
||||
"research_services": {"enabled": False, "services": []},
|
||||
"integration_services": {"enabled": False, "services": []}
|
||||
}
|
||||
|
||||
try:
|
||||
# Step 1: AI Services
|
||||
if step >= 1:
|
||||
services["ai_services"]["enabled"] = True
|
||||
services["ai_services"]["services"] = ["gemini", "exa", "copilotkit"]
|
||||
self._setup_user_ai_services(user_id)
|
||||
|
||||
# Step 2: Content Services
|
||||
if step >= 2:
|
||||
services["content_services"]["enabled"] = True
|
||||
services["content_services"]["services"] = ["content_analysis", "style_detection"]
|
||||
self._setup_user_content_services(user_id)
|
||||
|
||||
# Step 3: Research Services
|
||||
if step >= 3:
|
||||
services["research_services"]["enabled"] = True
|
||||
services["research_services"]["services"] = ["web_research", "fact_checking"]
|
||||
self._setup_user_research_services(user_id)
|
||||
|
||||
# Step 5: Integration Services
|
||||
if step >= 5:
|
||||
services["integration_services"]["enabled"] = True
|
||||
services["integration_services"]["services"] = ["wix", "linkedin", "wordpress"]
|
||||
self._setup_user_integration_services(user_id)
|
||||
|
||||
return services
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error initializing user services: {e}")
|
||||
return services
|
||||
|
||||
def _setup_user_ai_services(self, user_id: str):
|
||||
"""Set up AI services for the user."""
|
||||
# Create user-specific AI service configuration
|
||||
user_config = {
|
||||
"gemini": {
|
||||
"enabled": True,
|
||||
"model": "gemini-pro",
|
||||
"max_tokens": 4000,
|
||||
"temperature": 0.7
|
||||
},
|
||||
"exa": {
|
||||
"enabled": True,
|
||||
"search_depth": "standard",
|
||||
"max_results": 10
|
||||
},
|
||||
"copilotkit": {
|
||||
"enabled": True,
|
||||
"assistant_type": "content",
|
||||
"context_window": 8000
|
||||
}
|
||||
}
|
||||
|
||||
# Store in user workspace
|
||||
self.workspace_manager.update_user_config(user_id, {
|
||||
"ai_services": user_config
|
||||
})
|
||||
|
||||
def _setup_user_content_services(self, user_id: str):
|
||||
"""Set up content services for the user."""
|
||||
# Create content analysis configuration
|
||||
content_config = {
|
||||
"style_analysis": {
|
||||
"enabled": True,
|
||||
"analysis_depth": "comprehensive"
|
||||
},
|
||||
"content_generation": {
|
||||
"enabled": True,
|
||||
"templates": ["blog", "social", "email"]
|
||||
},
|
||||
"quality_checking": {
|
||||
"enabled": True,
|
||||
"checks": ["grammar", "tone", "readability"]
|
||||
}
|
||||
}
|
||||
|
||||
self.workspace_manager.update_user_config(user_id, {
|
||||
"content_services": content_config
|
||||
})
|
||||
|
||||
def _setup_user_research_services(self, user_id: str):
|
||||
"""Set up research services for the user."""
|
||||
# Create research configuration
|
||||
research_config = {
|
||||
"web_research": {
|
||||
"enabled": True,
|
||||
"sources": ["exa", "serper"],
|
||||
"max_results": 20
|
||||
},
|
||||
"fact_checking": {
|
||||
"enabled": True,
|
||||
"verification_level": "standard"
|
||||
},
|
||||
"content_validation": {
|
||||
"enabled": True,
|
||||
"checks": ["accuracy", "relevance", "freshness"]
|
||||
}
|
||||
}
|
||||
|
||||
self.workspace_manager.update_user_config(user_id, {
|
||||
"research_services": research_config
|
||||
})
|
||||
|
||||
def _setup_user_integration_services(self, user_id: str):
|
||||
"""Set up integration services for the user."""
|
||||
# Create integration configuration
|
||||
integration_config = {
|
||||
"wix": {
|
||||
"enabled": False,
|
||||
"connected": False,
|
||||
"auto_publish": False
|
||||
},
|
||||
"linkedin": {
|
||||
"enabled": False,
|
||||
"connected": False,
|
||||
"auto_schedule": False
|
||||
},
|
||||
"wordpress": {
|
||||
"enabled": False,
|
||||
"connected": False,
|
||||
"auto_publish": False
|
||||
}
|
||||
}
|
||||
|
||||
self.workspace_manager.update_user_config(user_id, {
|
||||
"integration_services": integration_config
|
||||
})
|
||||
|
||||
def get_user_environment_status(self, user_id: str) -> Dict[str, Any]:
|
||||
"""Get current user environment status."""
|
||||
try:
|
||||
workspace = self.workspace_manager.get_user_workspace(user_id)
|
||||
if not workspace:
|
||||
return {"error": "User workspace not found"}
|
||||
|
||||
progress = get_onboarding_progress_for_user(user_id)
|
||||
|
||||
return {
|
||||
"user_id": user_id,
|
||||
"onboarding_step": progress.current_step,
|
||||
"workspace_exists": True,
|
||||
"workspace_path": workspace["workspace_path"],
|
||||
"config": workspace["config"],
|
||||
"last_updated": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting user environment status: {e}")
|
||||
return {"error": str(e)}
|
||||
|
||||
def upgrade_user_environment(self, user_id: str, new_step: int) -> Dict[str, Any]:
|
||||
"""Upgrade user environment when they progress in onboarding."""
|
||||
try:
|
||||
logger.info(f"Upgrading environment for user {user_id} to step {new_step}")
|
||||
|
||||
# Get current status
|
||||
current_status = self.get_user_environment_status(user_id)
|
||||
current_step = current_status.get("onboarding_step", 1)
|
||||
|
||||
if new_step <= current_step:
|
||||
return {"message": "No upgrade needed", "current_step": current_step}
|
||||
|
||||
# Set up new features
|
||||
setup_status = self.workspace_manager.setup_progressive_features(user_id, new_step)
|
||||
services_status = self._initialize_user_services(user_id, new_step)
|
||||
|
||||
return {
|
||||
"user_id": user_id,
|
||||
"upgraded_from_step": current_step,
|
||||
"upgraded_to_step": new_step,
|
||||
"new_features": setup_status["features_enabled"],
|
||||
"services": services_status,
|
||||
"upgraded_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error upgrading user environment: {e}")
|
||||
raise
|
||||
|
||||
def cleanup_user_environment(self, user_id: str) -> bool:
|
||||
"""Clean up user environment (for account deletion)."""
|
||||
try:
|
||||
return self.workspace_manager.cleanup_user_workspace(user_id)
|
||||
except Exception as e:
|
||||
logger.error(f"Error cleaning up user environment: {e}")
|
||||
return False
|
||||
Reference in New Issue
Block a user