Fix user delete flow 11

This commit is contained in:
Urtzi Alfaro
2025-08-03 00:16:31 +02:00
parent a65386e138
commit b35eb7c875
5 changed files with 985 additions and 30 deletions

View File

@@ -28,13 +28,16 @@ from shared.auth.decorators import (
logger = structlog.get_logger()
router = APIRouter(tags=["users"])
@router.get("/me", response_model=UserResponse)
async def get_current_user_info(
current_user: Dict[str, Any] = Depends(get_current_user_dep),
db: AsyncSession = Depends(get_db)
):
"""Get current user information"""
"""Get current user information - FIXED VERSION"""
try:
logger.debug(f"Getting user info for: {current_user}")
# Handle both User object (direct auth) and dict (from gateway headers)
if isinstance(current_user, dict):
# Coming from gateway headers - need to fetch user from DB
@@ -45,19 +48,12 @@ async def get_current_user_info(
detail="Invalid user context"
)
# Fetch full user from database
from sqlalchemy import select
from app.models.users import User
# ✅ FIX: Fetch full user from database to get the real role
user = await UserService.get_user_by_id(user_id, db)
result = await db.execute(select(User).where(User.id == user_id))
user = result.scalar_one_or_none()
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found"
)
logger.debug(f"Fetched user from DB - Role: {user.role}, Email: {user.email}")
# ✅ FIX: Return role from database, not from JWT headers
return UserResponse(
id=str(user.id),
email=user.email,
@@ -65,13 +61,16 @@ async def get_current_user_info(
is_active=user.is_active,
is_verified=user.is_verified,
phone=user.phone,
language=user.language,
timezone=user.timezone,
language=user.language or "es",
timezone=user.timezone or "Europe/Madrid",
created_at=user.created_at,
last_login=user.last_login
last_login=user.last_login,
role=user.role, # ✅ CRITICAL: Use role from database, not headers
tenant_id=current_user.get("tenant_id")
)
else:
# Direct User object (when called directly)
# Direct User object (shouldn't happen in microservice architecture)
logger.debug(f"Direct user object received - Role: {current_user.role}")
return UserResponse(
id=str(current_user.id),
email=current_user.email,
@@ -79,13 +78,18 @@ async def get_current_user_info(
is_active=current_user.is_active,
is_verified=current_user.is_verified,
phone=current_user.phone,
language=current_user.language,
timezone=current_user.timezone,
language=current_user.language or "es",
timezone=current_user.timezone or "Europe/Madrid",
created_at=current_user.created_at,
last_login=current_user.last_login
last_login=current_user.last_login,
role=current_user.role, # ✅ Use role from database
tenant_id=None
)
except HTTPException:
raise
except Exception as e:
logger.error(f"Get current user error: {e}")
logger.error(f"Get user info error: {e}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to get user information"
@@ -99,7 +103,8 @@ async def update_current_user(
):
"""Update current user information"""
try:
updated_user = await UserService.update_user(current_user.id, user_update, db)
user_id = current_user.get("user_id") if isinstance(current_user, dict) else current_user.id
updated_user = await UserService.update_user(user_id, user_update, db)
return UserResponse(
id=str(updated_user.id),
email=updated_user.email,
@@ -110,7 +115,9 @@ async def update_current_user(
language=updated_user.language,
timezone=updated_user.timezone,
created_at=updated_user.created_at,
last_login=updated_user.last_login
last_login=updated_user.last_login,
role=updated_user.role, # ✅ Include role
tenant_id=current_user.get("tenant_id") if isinstance(current_user, dict) else None
)
except HTTPException:
raise
@@ -151,13 +158,6 @@ async def delete_admin_user(
detail="Invalid user ID format"
)
# Prevent self-deletion
if user_id == current_user.id:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Cannot delete your own account"
)
# Quick validation that user exists before starting background task
deletion_service = AdminUserDeleteService(db)
user_info = await deletion_service._validate_admin_user(user_id)