Fix user delete flow 12

This commit is contained in:
Urtzi Alfaro
2025-08-03 14:42:33 +02:00
parent b35eb7c875
commit b0d83720fd
7 changed files with 341 additions and 54 deletions

View File

@@ -9,7 +9,7 @@ import structlog
import uuid
from datetime import datetime, timezone
from app.core.database import get_db
from app.core.database import get_db, get_background_db_session
from app.schemas.auth import UserResponse, PasswordChange
from app.schemas.users import UserUpdate
from app.services.user_service import UserService
@@ -171,8 +171,7 @@ async def delete_admin_user(
background_tasks.add_task(
execute_admin_user_deletion,
user_id=user_id,
requesting_user_id=current_user.id,
db_url=str(db.bind.url) # Pass DB connection string for background task
requesting_user_id=current_user["user_id"]
)
return {
@@ -186,52 +185,23 @@ async def delete_admin_user(
# Add this background task function to services/auth/app/api/users.py:
async def execute_admin_user_deletion(
user_id: str,
requesting_user_id: str,
db_url: str
):
async def execute_admin_user_deletion(user_id: str, requesting_user_id: str):
"""
Background task to execute complete admin user deletion
Background task using shared infrastructure
"""
# Create new database session for background task
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
engine = create_async_engine(db_url)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
try:
# Initialize deletion service with new session
deletion_service = AdminUserDeleteService(session)
# Perform the deletion
result = await deletion_service.delete_admin_user_complete(
user_id=user_id,
requesting_user_id=requesting_user_id
)
logger.info("Background admin user deletion completed successfully",
user_id=user_id,
requesting_user=requesting_user_id,
result=result)
except Exception as e:
logger.error("Background admin user deletion failed",
user_id=user_id,
requesting_user=requesting_user_id,
error=str(e))
# Attempt to publish failure event
try:
deletion_service = AdminUserDeleteService(session)
await deletion_service._publish_user_deletion_failed_event(user_id, str(e))
except:
pass
# ✅ Use the shared background session
async with get_background_db_session() as session:
deletion_service = AdminUserDeleteService(session)
finally:
await engine.dispose()
result = await deletion_service.delete_admin_user_complete(
user_id=user_id,
requesting_user_id=requesting_user_id
)
logger.info("Background admin user deletion completed successfully",
user_id=user_id,
requesting_user=requesting_user_id,
result=result)
@router.get("/delete/{user_id}/deletion-preview")