from typing import Any, cast import httpx from campaigns.core.exceptions import OwsError class FacebookClientError(OwsError): default_code = "facebook_client_error" default_message = "Facebook client error" def __init__( self, message: str | None = None, *, code: str | None = None, context: dict[str, Any] | None = None, request: httpx.Request | None = None, response: httpx.Response | None = None, ): super().__init__(message, code=code, context=context) self.request = request self.response = response @property def fb_error(self) -> dict[str, Any]: try: return cast(dict[str, Any], self.context["fb_error"]) except KeyError: return {} @property def fb_code(self) -> int | None: return cast(int | None, self.fb_error.get("code")) @property def fb_message(self) -> str | None: return cast(str | None, self.fb_error.get("message")) @property def fb_error_user_msg(self) -> str | None: return cast(str | None, self.fb_error.get("error_user_msg")) @property def fb_error_user_title(self) -> str | None: return cast(str | None, self.fb_error.get("error_user_title")) @property def fb_error_data(self) -> str | None: return cast(str | None, self.fb_error.get("error_data")) def get_log_extra(self) -> dict[str, Any]: extra: dict[str, Any] = {} if self.request: extra["fb_request_method"] = self.request.method extra["fb_request_path"] = self.request.url.path if self.response: extra["fb_response"] = self.response.status_code if self.fb_code: extra["fb_code"] = self.fb_code if self.fb_message: extra["fb_message"] = self.fb_message if self.fb_error_user_msg: extra["fb_error_user_msg"] = self.fb_error_user_msg if self.fb_code: extra["fb_error_user_title"] = self.fb_error_user_title if self.fb_error_data: extra["fb_error_data"] = self.fb_error_data return extra