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.datetime import DateStringField from apollo_utils.service.schemas.fields.enum import EnumField from apollo_utils.service.schemas.fields.isrc import IsrcField from apollo_utils.service.schemas.fields.market import MarketField from apollo_utils.service.schemas.mixins.date import get_date_range_mixin from apollo_utils.service.schemas.mixins.dsp import get_dsp_mixin from marshmallow import Schema, fields, validate from server.constants.charts import ChartBreakdown class TracksPositions: class Request(RequestSchema, get_dsp_mixin(DSP_SPOTIFY_APPLE, required=True), get_date_range_mixin(required=False)): isrc = IsrcField(required=True) country_code = MarketField(validate=validate.Length(max=10, min=2), gl=Market.WORLDWIDE, required=True) chart_breakdown = EnumField(ChartBreakdown, missing=ChartBreakdown.DAILY, data_key="type") with_null = fields.Boolean(missing=True) force_dates = fields.Boolean(missing=False) class Response(Schema): class PositionItem(Schema): date = DateStringField() position = fields.Integer() start_date = DateStringField() end_date = DateStringField() days_on_chart = fields.Integer() peak_position = fields.Integer() min_position = fields.Integer() items = fields.List(fields.Nested(PositionItem))