108 lines
2.9 KiB
Python
108 lines
2.9 KiB
Python
"""Audit service."""
|
|
from flask import request, g
|
|
from gatehouse_app.models.audit_log import AuditLog
|
|
from gatehouse_app.utils.constants import AuditAction
|
|
|
|
|
|
class AuditService:
|
|
"""Service for audit logging."""
|
|
|
|
@staticmethod
|
|
def log_action(
|
|
action,
|
|
user_id=None,
|
|
organization_id=None,
|
|
resource_type=None,
|
|
resource_id=None,
|
|
metadata=None,
|
|
description=None,
|
|
success=True,
|
|
error_message=None,
|
|
):
|
|
"""
|
|
Create an audit log entry.
|
|
|
|
Args:
|
|
action: AuditAction enum value
|
|
user_id: ID of user performing the action
|
|
organization_id: ID of related organization
|
|
resource_type: Type of resource being acted upon
|
|
resource_id: ID of resource being acted upon
|
|
metadata: Additional metadata dictionary
|
|
description: Human-readable description
|
|
success: Whether the action succeeded
|
|
error_message: Error message if action failed
|
|
|
|
Returns:
|
|
AuditLog instance
|
|
"""
|
|
# Get request details if available
|
|
ip_address = None
|
|
user_agent = None
|
|
request_id = None
|
|
|
|
try:
|
|
if request:
|
|
ip_address = request.remote_addr
|
|
user_agent = request.headers.get("User-Agent")
|
|
request_id = g.get("request_id")
|
|
except RuntimeError:
|
|
# No request context
|
|
pass
|
|
|
|
log_entry = AuditLog(
|
|
action=action,
|
|
user_id=user_id,
|
|
organization_id=organization_id,
|
|
resource_type=resource_type,
|
|
resource_id=resource_id,
|
|
ip_address=ip_address,
|
|
user_agent=user_agent,
|
|
request_id=request_id,
|
|
metadata=metadata,
|
|
description=description,
|
|
success=success,
|
|
error_message=error_message,
|
|
)
|
|
log_entry.save()
|
|
|
|
return log_entry
|
|
|
|
@staticmethod
|
|
def get_user_activity(user_id, limit=50):
|
|
"""
|
|
Get recent activity for a user.
|
|
|
|
Args:
|
|
user_id: User ID
|
|
limit: Maximum number of records to return
|
|
|
|
Returns:
|
|
List of AuditLog instances
|
|
"""
|
|
return (
|
|
AuditLog.query.filter_by(user_id=user_id)
|
|
.order_by(AuditLog.created_at.desc())
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
@staticmethod
|
|
def get_organization_activity(organization_id, limit=50):
|
|
"""
|
|
Get recent activity for an organization.
|
|
|
|
Args:
|
|
organization_id: Organization ID
|
|
limit: Maximum number of records to return
|
|
|
|
Returns:
|
|
List of AuditLog instances
|
|
"""
|
|
return (
|
|
AuditLog.query.filter_by(organization_id=organization_id)
|
|
.order_by(AuditLog.created_at.desc())
|
|
.limit(limit)
|
|
.all()
|
|
)
|