import re from typing import Any, Optional from apollo_utils.core.constants import AMAZON_DESERIALIZE_INTO from apollo_utils.core.constants.dsp import DSP from apollo_utils.service.schemas.fields.playlists import PlaylistIdField from apollo_utils.service.utils.amazon import AmazonId class AmazonPlaylistIdField(PlaylistIdField): def __init__(self, deserialize_into: Optional[AMAZON_DESERIALIZE_INTO] = AMAZON_DESERIALIZE_INTO.INT_MARKET_ID, *args, **kwargs): self._deserialize_into = deserialize_into super().__init__(*args, **kwargs) def _deserialize(self, value, attr, data, **kwargs) -> Any: amazon_id = AmazonId.parse_from(value) if self._deserialize_into == AMAZON_DESERIALIZE_INTO.INT_MARKET_ID: result = amazon_id.int_market_id elif self._deserialize_into == AMAZON_DESERIALIZE_INTO.GROUP_ID: result = amazon_id.group_id elif self._deserialize_into == AMAZON_DESERIALIZE_INTO.INT_ID: result = amazon_id.int_id elif self._deserialize_into == AMAZON_DESERIALIZE_INTO.FULL_ID: result = amazon_id.full_id elif self._deserialize_into == AMAZON_DESERIALIZE_INTO.LIST: return [amazon_id.group_id, amazon_id.int_id, amazon_id.market] return super()._deserialize(result, attr, data, **kwargs) def _serialize(self, value, attr, data, **kwargs) -> str: if not isinstance(value, str): value = AmazonId(*value).full_id if isinstance(value, str): if not re.match(r"\w*:\d*_\w{2}", value): raise ValueError(f"Not a valid amazon playlist id string is passed: value - {value}") value = value.replace(f"{DSP.AMAZON.value}_", "") return super()._serialize(value, attr, data, **kwargs)