Add subcription feature

This commit is contained in:
Urtzi Alfaro
2026-01-13 22:22:38 +01:00
parent b931a5c45e
commit 6ddf608d37
61 changed files with 7915 additions and 1238 deletions

View File

@@ -1044,4 +1044,110 @@ async def delete_step_draft(
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to delete step draft"
)
@router.get("/api/v1/auth/me/onboarding/subscription-parameters", response_model=Dict[str, Any])
async def get_subscription_parameters(
current_user: Dict[str, Any] = Depends(get_current_user_dep),
db: AsyncSession = Depends(get_db)
):
"""
Get subscription parameters saved during onboarding for tenant creation
Returns all parameters needed for subscription processing: plan, billing cycle, coupon, etc.
"""
try:
user_id = current_user["user_id"]
is_demo = current_user.get("is_demo", False)
# DEMO FIX: Demo users get default subscription parameters
if is_demo or user_id.startswith("demo-user-"):
logger.info(f"Demo user {user_id} requesting subscription parameters - returning demo defaults")
return {
"subscription_plan": "professional",
"billing_cycle": "monthly",
"coupon_code": "DEMO2025",
"payment_method_id": "pm_demo_test_123",
"payment_customer_id": "cus_demo_test_123", # Demo payment customer ID
"saved_at": datetime.now(timezone.utc).isoformat(),
"demo_mode": True
}
# Get subscription parameters from onboarding progress
from app.repositories.onboarding_repository import OnboardingRepository
onboarding_repo = OnboardingRepository(db)
subscription_params = await onboarding_repo.get_subscription_parameters(user_id)
if not subscription_params:
logger.warning(f"No subscription parameters found for user {user_id} - returning defaults")
return {
"subscription_plan": "starter",
"billing_cycle": "monthly",
"coupon_code": None,
"payment_method_id": None,
"payment_customer_id": None,
"saved_at": datetime.now(timezone.utc).isoformat()
}
logger.info(f"Retrieved subscription parameters for user {user_id}",
subscription_plan=subscription_params["subscription_plan"],
billing_cycle=subscription_params["billing_cycle"],
coupon_code=subscription_params["coupon_code"])
return subscription_params
except Exception as e:
logger.error(f"Error getting subscription parameters for user {current_user.get('user_id')}: {e}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to retrieve subscription parameters"
)
@router.get("/api/v1/auth/users/{user_id}/onboarding/subscription-parameters", response_model=Dict[str, Any])
async def get_user_subscription_parameters(
user_id: str,
current_user: Dict[str, Any] = Depends(get_current_user_dep),
db: AsyncSession = Depends(get_db)
):
"""
Get subscription parameters for a specific user (admin/service access)
"""
try:
# Check permissions - only admins and services can access other users' data
requester_id = current_user["user_id"]
requester_roles = current_user.get("roles", [])
is_service = current_user.get("is_service", False)
if not is_service and "super_admin" not in requester_roles and requester_id != user_id:
logger.warning(f"Unauthorized access attempt to user {user_id} subscription parameters by {requester_id}")
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Insufficient permissions to access other users' subscription parameters"
)
# Get subscription parameters from onboarding progress
from app.repositories.onboarding_repository import OnboardingRepository
onboarding_repo = OnboardingRepository(db)
subscription_params = await onboarding_repo.get_subscription_parameters(user_id)
if not subscription_params:
logger.warning(f"No subscription parameters found for user {user_id} - returning defaults")
return {
"subscription_plan": "starter",
"billing_cycle": "monthly",
"coupon_code": None,
"payment_method_id": None,
"payment_customer_id": None,
"saved_at": datetime.now(timezone.utc).isoformat()
}
logger.info(f"Retrieved subscription parameters for user {user_id} by {requester_id}",
subscription_plan=subscription_params["subscription_plan"])
return subscription_params
except Exception as e:
logger.error(f"Error getting subscription parameters for user {user_id}: {e}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to retrieve subscription parameters"
)