from functools import cached_property from typing import Any from pydantic import ValidationError from fansifter_common.adapters.sendgrid.models import ErrorResponse from fansifter_common.httpclient.exceptions import HTTPClientError class SendGridClientError(HTTPClientError): name = "sendgrid_client_" @cached_property def response_obj(self) -> ErrorResponse | None: if self.response: try: return ErrorResponse.model_validate_json(self.response.content) except ValidationError: pass return None @cached_property def response_data(self) -> dict[str, Any]: if self.response_obj: return self.response_obj.model_dump() return {} @property def log_extra(self) -> dict[str, Any]: extra: dict[str, Any] = {} if self.request: extra["sendgrid_request_method"] = self.request.method extra["sendgrid_request_path"] = self.request.url.path if self.response: extra["sendgrid_response_status_code"] = self.response.status_code if self.response_obj: extra["sendgrid_response_error"] = self.response_data return extra @property def code(self) -> str: return f"{self.name}error" class SendGridClientTimeoutError(SendGridClientError): pass