from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.date import DateRangeMixin from marshmallow import Schema, fields, validate from server.constants import dsp from server.constants.delphi.chart import ChartAnalyticsGroupBy from server.schemas.delphi.mixins.list import ListParamsMixin from server.schemas.delphi.mixins.skippers import SkipEmptyDataMixin from server.schemas.delphi.mixins.track_id import TrackIdISRCListsRequiredMixin class DelphiChartsAnalytics: class DelphiRequest( DateRangeMixin, TrackIdISRCListsRequiredMixin, SkipEmptyDataMixin, ListParamsMixin, RequestSchema ): chart_id = fields.String(required=True) track_id_list = SplitUniqueListField(fields.String(required=True), data_key="track_id") metrics = SplitUniqueListField(fields.String(required=True), required=True, validate=validate.Length(min=1)) class Request(DelphiRequest): dsp = fields.String(required=True, validate=validate.OneOf((dsp.APPLE, dsp.SPOTIFY))) group_by = fields.String( validate=validate.OneOf(ChartAnalyticsGroupBy.ALL_FIELDS), missing=ChartAnalyticsGroupBy.TRACK_ID, ) class Response(Schema): class Metrics(Schema): positions = fields.List(fields.Integer()) track_id = fields.String() min_date = fields.Date() max_date = fields.Date() min_position = fields.Integer() max_position = fields.Integer() metrics = fields.Nested(Metrics)