Improve the frontend 2
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user