Improve the frontend 2

This commit is contained in:
Urtzi Alfaro
2025-10-29 06:58:05 +01:00
parent 858d985c92
commit 36217a2729
98 changed files with 6652 additions and 4230 deletions

View File

@@ -97,16 +97,18 @@ class DatabaseManager:
logger.debug("Database session created for request")
yield session
except Exception as e:
await session.rollback()
# Don't wrap HTTPExceptions - let them pass through
if hasattr(e, 'status_code') and hasattr(e, 'detail'):
# This is likely an HTTPException - don't wrap it
await session.rollback()
# Check by type name to avoid import dependencies
exception_type = type(e).__name__
if exception_type in ('HTTPException', 'StarletteHTTPException'):
logger.debug(f"Re-raising HTTPException: {e}", service=self.service_name)
raise
error_msg = str(e) if str(e) else f"{type(e).__name__}: {repr(e)}"
logger.error(f"Database session error: {error_msg}", service=self.service_name)
await session.rollback()
# Handle specific ASGI stream issues more gracefully
if "EndOfStream" in str(type(e)) or "WouldBlock" in str(type(e)):
raise DatabaseError(f"Session error: Request stream disconnected ({type(e).__name__})")
@@ -149,6 +151,13 @@ class DatabaseManager:
yield session
except Exception as e:
await session.rollback()
# Don't wrap HTTPExceptions - let them pass through
exception_type = type(e).__name__
if exception_type in ('HTTPException', 'StarletteHTTPException'):
logger.debug(f"Re-raising HTTPException: {e}", service=self.service_name)
raise
logger.error(f"Session error: {e}", service=self.service_name)
raise DatabaseError(f"Session error: {str(e)}")
finally:

View File

@@ -152,8 +152,19 @@ def create_audit_log_model(Base):
class AuditLogger:
"""Service for logging audit events"""
def __init__(self, service_name: str):
def __init__(self, service_name: str, audit_log_model):
"""
Initialize AuditLogger with service-specific AuditLog model
Args:
service_name: Name of the service (e.g., "production-service")
audit_log_model: The service-specific AuditLog model class created via create_audit_log_model()
"""
if not audit_log_model:
raise ValueError(f"audit_log_model is required for AuditLogger in {service_name}")
self.service_name = service_name
self.audit_log_model = audit_log_model
self.logger = logger.bind(service=service_name)
async def log_event(
@@ -193,7 +204,7 @@ class AuditLogger:
user_agent: Client user agent
"""
try:
audit_log = AuditLog(
audit_log = self.audit_log_model(
tenant_id=uuid.UUID(tenant_id) if isinstance(tenant_id, str) else tenant_id,
user_id=uuid.UUID(user_id) if isinstance(user_id, str) else user_id,
action=action,
@@ -312,6 +323,21 @@ class AuditLogger:
)
def create_audit_logger(service_name: str) -> AuditLogger:
"""Factory function to create audit logger for a service"""
return AuditLogger(service_name)
def create_audit_logger(service_name: str, audit_log_model) -> AuditLogger:
"""
Factory function to create audit logger for a service
Args:
service_name: Name of the service (e.g., "production-service")
audit_log_model: The service-specific AuditLog model class (REQUIRED - created via create_audit_log_model)
Returns:
Configured AuditLogger instance
Example:
from app.models import AuditLog
from shared.security import create_audit_logger
audit_logger = create_audit_logger("production-service", AuditLog)
"""
return AuditLogger(service_name, audit_log_model)