refactor: Replace direct logger.error calls with capture_and_log in accounts services and conditionally pass error_id during ApplicationError creation.

This commit is contained in:
pacnpal
2026-01-04 18:36:23 -05:00
parent 95700c7d7b
commit bc4a3c7557
6 changed files with 40 additions and 27 deletions

View File

@@ -26,6 +26,7 @@ from django.utils.crypto import get_random_string
from django_forwardemail.services import EmailService
from .models import EmailVerification, User, UserDeletionRequest, UserProfile
from apps.core.utils import capture_and_log
logger = logging.getLogger(__name__)
@@ -130,7 +131,7 @@ class AccountService:
html=email_html,
)
except Exception as e:
logger.error(f"Failed to send password change confirmation email: {e}")
capture_and_log(e, 'Send password change confirmation email', source='service', severity='medium')
@staticmethod
def initiate_email_change(
@@ -206,7 +207,7 @@ class AccountService:
html=email_html,
)
except Exception as e:
logger.error(f"Failed to send email verification: {e}")
capture_and_log(e, 'Send email verification', source='service', severity='medium')
@staticmethod
def verify_email_change(*, token: str) -> dict[str, Any]:

View File

@@ -17,6 +17,7 @@ from django.utils import timezone
from django_forwardemail.services import EmailService
from apps.accounts.models import NotificationPreference, User, UserNotification
from apps.core.utils import capture_and_log
logger = logging.getLogger(__name__)
@@ -264,7 +265,7 @@ class NotificationService:
logger.info(f"Email notification sent to {user.email} for notification {notification.id}")
except Exception as e:
logger.error(f"Failed to send email notification {notification.id}: {str(e)}")
capture_and_log(e, f'Send email notification {notification.id}', source='service')
@staticmethod
def get_user_notifications(

View File

@@ -20,6 +20,8 @@ if TYPE_CHECKING:
else:
User = get_user_model()
from apps.core.utils import capture_and_log
logger = logging.getLogger(__name__)
@@ -62,7 +64,7 @@ class SocialProviderService:
return True, "Provider can be safely disconnected."
except Exception as e:
logger.error(f"Error checking disconnect permission for user {user.id}, provider {provider}: {e}")
capture_and_log(e, f'Check disconnect permission for user {user.id}, provider {provider}', source='service')
return False, "Unable to verify disconnection safety. Please try again."
@staticmethod
@@ -97,7 +99,7 @@ class SocialProviderService:
return connected_providers
except Exception as e:
logger.error(f"Error getting connected providers for user {user.id}: {e}")
capture_and_log(e, f'Get connected providers for user {user.id}', source='service')
return []
@staticmethod
@@ -140,7 +142,7 @@ class SocialProviderService:
return available_providers
except Exception as e:
logger.error(f"Error getting available providers: {e}")
capture_and_log(e, 'Get available providers', source='service')
return []
@staticmethod
@@ -177,7 +179,7 @@ class SocialProviderService:
return True, f"{provider.title()} account disconnected successfully."
except Exception as e:
logger.error(f"Error disconnecting {provider} for user {user.id}: {e}")
capture_and_log(e, f'Disconnect {provider} for user {user.id}', source='service')
return False, f"Failed to disconnect {provider} account. Please try again."
@staticmethod
@@ -210,7 +212,7 @@ class SocialProviderService:
}
except Exception as e:
logger.error(f"Error getting auth status for user {user.id}: {e}")
capture_and_log(e, f'Get auth status for user {user.id}', source='service')
return {"error": "Unable to retrieve authentication status"}
@staticmethod
@@ -236,5 +238,5 @@ class SocialProviderService:
return True, f"Provider '{provider}' is valid and available."
except Exception as e:
logger.error(f"Error validating provider {provider}: {e}")
capture_and_log(e, f'Validate provider {provider}', source='service')
return False, "Unable to validate provider."

View File

@@ -18,6 +18,8 @@ from django.db import transaction
from django.template.loader import render_to_string
from django.utils import timezone
from apps.core.utils import capture_and_log
logger = logging.getLogger(__name__)
User = get_user_model()
@@ -292,5 +294,5 @@ class UserDeletionService:
logger.info(f"Deletion verification email sent to {user.email}")
except Exception as e:
logger.error(f"Failed to send deletion verification email to {user.email}: {str(e)}")
capture_and_log(e, f'Send deletion verification email to {user.email}', source='service')
raise

View File

@@ -130,23 +130,28 @@ class ErrorService:
# Merge request_context into metadata
merged_metadata = {**(metadata or {}), "request_context": request_context}
# Build create kwargs, only including error_id if provided
create_kwargs = {
"error_type": error_type,
"error_message": error_message[:5000], # Limit message length
"error_stack": error_stack[:10000], # Limit stack length
"error_code": error_code,
"severity": severity,
"source": source,
"endpoint": endpoint,
"http_method": http_method,
"user_agent": user_agent[:1000],
"user": user,
"ip_address_hash": ip_address_hash,
"metadata": merged_metadata,
"environment": environment or {},
}
# Only include error_id if explicitly provided, else let model default
if error_id is not None:
create_kwargs["error_id"] = error_id
# Create and save error
app_error = ApplicationError.objects.create(
error_id=error_id or None, # Let model generate if not provided
error_type=error_type,
error_message=error_message[:5000], # Limit message length
error_stack=error_stack[:10000], # Limit stack length
error_code=error_code,
severity=severity,
source=source,
endpoint=endpoint,
http_method=http_method,
user_agent=user_agent[:1000],
user=user,
ip_address_hash=ip_address_hash,
metadata=merged_metadata,
environment=environment or {},
)
app_error = ApplicationError.objects.create(**create_kwargs)
logger.info(
f"Captured error {app_error.short_error_id}: {error_type} from {source}"

View File

@@ -14,6 +14,8 @@ from django.conf import settings
from django.core.files.uploadedfile import UploadedFile
from PIL import ExifTags, Image
from apps.core.utils import capture_and_log
logger = logging.getLogger(__name__)
@@ -193,5 +195,5 @@ class MediaService:
"available_space": "unknown",
}
except Exception as e:
logger.error(f"Failed to get storage stats: {str(e)}")
capture_and_log(e, 'Get storage stats', source='service', severity='low')
return {"error": str(e)}