from fansifter_common import context from fansifter_common.constants import PROD_ENVIRONMENT, QA_ENVIRONMENT from fansifter_common.m2m_token import M2MTokenManager from fansifter_common.utils.functional import lazy_proxy from owsclient import OwsClient from pydantic import BaseModel, Field from app.adapters.aws import secrets_manager from app.config import settings class UpsertAudienceFansResponse(BaseModel): fan_count: int = Field(alias="fanCount") class OwsDmpClient: service_name = "ows-dmp" def __init__(self, ows_client: OwsClient) -> None: self.ows_client = ows_client def upsert_audience_fans(self, audience_id: str) -> int: response = self.ows_client.post( self.service_name, f"/audiences/{audience_id}/fans/upsert", timeout=15.0 ) response_obj = UpsertAudienceFansResponse.model_validate_json(response.content) return response_obj.fan_count def get_ows_dmp_client() -> OwsDmpClient: if settings.environment in [QA_ENVIRONMENT, PROD_ENVIRONMENT]: m2m_token_manager: M2MTokenManager | None = M2MTokenManager( secrets_manager=secrets_manager, secret_name_key=settings.m2m_token_secret_key_name, secret_expire_name_key=settings.m2m_token_secret_expiry_key_name, ) else: m2m_token_manager = None ows_client = OwsClient( environment=settings.environment, service_name=settings.service_name, m2m_token_manager=m2m_token_manager, correlation_id_getter=context.get_correlation_id, request_context_getter=context.get_request_context, ) return OwsDmpClient(ows_client=ows_client) ows_dmp_client = lazy_proxy(get_ows_dmp_client)