Files
ALwrity/backend/api/onboarding_utils/endpoints_core.py
2025-10-08 10:13:14 +05:30

121 lines
4.9 KiB
Python

from typing import Dict, Any
from datetime import datetime
from loguru import logger
from fastapi import HTTPException, Depends
from middleware.auth_middleware import get_current_user
from .endpoint_models import (
get_onboarding_progress_for_user,
)
def health_check():
return {"status": "healthy", "timestamp": datetime.now().isoformat()}
async def initialize_onboarding(current_user: Dict[str, Any] = Depends(get_current_user)):
try:
user_id = str(current_user.get('id'))
progress = get_onboarding_progress_for_user(user_id)
steps_data = []
for step in progress.steps:
# Include step data for completed steps, especially persona data (step 4) and research data (step 3)
step_data = None
if step.data:
if step.step_number == 4: # Personalization step with persona data
# Include persona data for step 4 to ensure it's available for step 5
step_data = step.data
logger.info(f"Including persona data for step 4: {len(str(step_data))} chars")
elif step.step_number == 3: # Research step with research preferences
# Include research preferences for step 3 to ensure it's available for step 4
step_data = step.data
logger.info(f"Including research data for step 3: {len(str(step_data))} chars")
steps_data.append({
"step_number": step.step_number,
"title": step.title,
"description": step.description,
"status": step.status.value,
"completed_at": step.completed_at,
"has_data": step.data is not None and len(step.data) > 0 if step.data else False,
"data": step_data, # Include actual data for critical steps
})
next_step = progress.get_next_incomplete_step()
response_data = {
"user": {
"id": user_id,
"email": current_user.get('email'),
"first_name": current_user.get('first_name'),
"last_name": current_user.get('last_name'),
"clerk_user_id": user_id,
},
"onboarding": {
"is_completed": progress.is_completed,
"current_step": progress.current_step,
"completion_percentage": progress.get_completion_percentage(),
"next_step": next_step,
"started_at": progress.started_at,
"last_updated": progress.last_updated,
"completed_at": progress.completed_at,
"can_proceed_to_final": progress.can_complete_onboarding(),
"steps": steps_data,
},
"session": {
"session_id": user_id,
"initialized_at": datetime.now().isoformat(),
},
}
logger.info(
f"Batch init successful for user {user_id}: step {progress.current_step}/{len(progress.steps)}"
)
return response_data
except Exception as e:
logger.error(f"Error in initialize_onboarding: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Failed to initialize onboarding: {str(e)}")
async def get_onboarding_status(current_user: Dict[str, Any]):
try:
from api.onboarding_utils.step_management_service import StepManagementService
step_service = StepManagementService()
return await step_service.get_onboarding_status(current_user)
except Exception as e:
from fastapi import HTTPException
from loguru import logger
logger.error(f"Error getting onboarding status: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error")
async def get_onboarding_progress_full(current_user: Dict[str, Any]):
try:
from api.onboarding_utils.step_management_service import StepManagementService
step_service = StepManagementService()
return await step_service.get_onboarding_progress_full(current_user)
except Exception as e:
from fastapi import HTTPException
from loguru import logger
logger.error(f"Error getting onboarding progress: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error")
async def get_step_data(step_number: int, current_user: Dict[str, Any]):
try:
from api.onboarding_utils.step_management_service import StepManagementService
step_service = StepManagementService()
return await step_service.get_step_data(step_number, current_user)
except Exception as e:
from fastapi import HTTPException
from loguru import logger
logger.error(f"Error getting step data: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error")
__all__ = [name for name in globals().keys() if not name.startswith('_')]