import json import logging from dataclasses import dataclass import httpx import pydantic from audience_common.owsclient import AsyncOwsClient from campaigns.connectors.ows_product.dtos import Product logger = logging.getLogger(__name__) @dataclass class OwsProduct: ows_client: AsyncOwsClient async def get_product_by_id(self, product_id: int) -> Product | None: response = await self.ows_client.get( "ows-product", path=f"/product/{product_id}" ) try: response.raise_for_status() except httpx.HTTPStatusError as exc: logger.error("Invalid product response status.", exc_info=exc) return None try: return pydantic.parse_obj_as(Product, response.json()) except (pydantic.ValidationError, json.JSONDecodeError) as exc: logger.error("Failed to parse product.", exc_info=exc) return None