from functools import cached_property from typing import Any from fansifter_common.httpclient import HTTPClientError from pydantic import ValidationError from app.adapters.facebook.types import Error, ErrorResponse class FacebookClientError(HTTPClientError): name = "fb_client_" @cached_property def fb_error(self) -> Error | None: if self.response: try: error_response = ErrorResponse.model_validate_json( self.response.content ) except ValidationError: pass else: return error_response.error return None @cached_property def fb_error_data(self) -> dict[str, Any]: if self.fb_error: return self.fb_error.model_dump( exclude_none=True, exclude_unset=True, ) return {} @property def log_msg(self) -> str: if self.fb_error: return self.fb_error.error_user_msg or self.fb_error.message or self.message return self.message @property def log_extra(self) -> dict[str, Any]: extra = super().log_extra if self.response: extra[f"{self.name}response_error"] = self.fb_error_data return extra