from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.country_code import DelphiCountryCodeMixin from apollo_utils.service.schemas.mixins.date import DateRangeMixin from apollo_utils.service.schemas.mixins.isrc import get_isrc_list_mixin from marshmallow import ValidationError, fields, validate, validates_schema from server.constants import dsp from server.constants.delphi.streams.aggregate import StreamsAggBy from server.constants.delphi.streams.group_by import StreamsGroupBy from server.constants.delphi.streams.include import StreamsInclude from server.constants.delphi.streams.subset import StreamsSubset from server.schemas.delphi.mixins.cursor import DelphiCursorMixin from server.schemas.delphi.mixins.offset_limit import DelphiOffsetLimitMixin from server.schemas.delphi.mixins.sorting import DelphiSortingMixin class DelphiStreamsV3: class Base( DateRangeMixin, get_isrc_list_mixin(required=False), DelphiOffsetLimitMixin, DelphiSortingMixin, DelphiCountryCodeMixin, DelphiCursorMixin, RequestSchema, ): playlist_id_list = SplitUniqueListField(fields.String(required=True), data_key="playlist_id") artist_id = fields.String(required=False) track_id_list = SplitUniqueListField(fields.String(required=True), data_key="track_id") dsp_list = SplitUniqueListField( fields.String(required=True, validate=validate.OneOf(dsp.ALL_VENDORS)), required=False, validate=validate.Length(min=1, max=len(dsp.ALL_VENDORS)), data_key="dsp", ) subset = fields.String(required=False, validate=validate.OneOf(StreamsSubset.ALL_FIELDS)) agg_by = fields.String(required=False, validate=validate.OneOf(StreamsAggBy.ALL_FIELDS)) group_by = SplitUniqueListField( fields.String(required=False, validate=validate.OneOf(StreamsGroupBy.ALL_FIELDS)), required=False ) include = SplitUniqueListField( fields.String(required=True, validate=validate.OneOf(StreamsInclude.ALL_FIELDS)), required=False ) @validates_schema def validate_data(self, data: dict, *args, **kwargs): id_fields = {"track_id_list", "isrc_list", "playlist_id_list", "artist_id"} if id_fields.isdisjoint(set(data.keys())): raise ValidationError( "Missing at least one identifying parameter from set: artist_id, playlist_id, track_id, isrc." ) class Request(Base): request_per_dsp = fields.Boolean(missing=True)