from apollo_utils.core.constants.dsp import DSP_SPOTIFY_APPLE from apollo_utils.core.constants.market import Market from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.enum import EnumListField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.market import MarketField from marshmallow import Schema, ValidationError, fields, post_load, validate from server.constants.distributors import DISTRIBUTORS from server.schemas.base.prefix import CheckPrefixString class DistributorsCheck: class Request(RequestSchema): distributors = EnumListField(DISTRIBUTORS, unify=True, missing=None, as_enum=True) country_code = MarketField(validate=validate.Length(max=10, min=2), gl=Market.GLOBAL, required=True) upc = SplitUniqueListField( fields.String(required=True, validate=validate.Length(max=15)), missing=None, validate=validate.Length(max=100), ) track_id = SplitUniqueListField( CheckPrefixString(prefixes=DSP_SPOTIFY_APPLE.values(), required=True), missing=None, validate=validate.Length(max=100), ) @post_load def check_upc_track_id(self, data, **kwargs): track_id, upc = data.get("track_id"), data.get("upc") if not (bool(upc) ^ bool(track_id)): raise ValidationError( f"You should specify one and only one of upc or track_id.\n" f"Received: track_id={track_id}, upc={upc}" ) return data class Response(Schema): upc = fields.String() track_id = fields.String(default=None) distributed_by = fields.String()