import re from apollo_utils.service.exceptions import QueryParamsValidationError from apollo_utils.service.schemas.fields.playlists import PlaylistIdField from apollo_utils.service.schemas.mixins.misc import get_only_one_field_mixin from marshmallow import fields, post_load, validate, validates_schema from server.constants import DSP, SPOTIFY_PLAYLIST_URI_PREFIX from server.schemas.base.schemas import RequestSchema, Schema class URIPlaylistIdMixin(get_only_one_field_mixin(("playlist_id", "playlisturi"))): playlist_id = PlaylistIdField(dsp=DSP.SPOTIFY, validate=validate.Length(max=50), data_key="playlistid") playlisturi = fields.String(validate=validate.Length(max=50)) @validates_schema(skip_on_field_errors=True) def validate_uri(self, data, **kwargs): uri = data.get("playlisturi") if uri and not re.compile(r"^spotify:playlist:\d{1}\w{21}$").match(uri): raise QueryParamsValidationError(detail="playlisturi should match: 'spotify:playlist:{playlist_id}'") @post_load def parse_playlisturi_if_passed(self, data, *args, **kwargs): key = "playlisturi" uri = data.get(key) if uri: clean_id = uri.replace(SPOTIFY_PLAYLIST_URI_PREFIX, "") data[key] = f"{DSP.SPOTIFY.value}_{clean_id}" return data class PlaylistSpotifyDates: class Request(RequestSchema, URIPlaylistIdMixin): has_history = fields.Bool(missing=False) class Response(Schema): # TODO create schema for no usage but just to show response in swagger # TODO Response example: # { # "2022-12-14": "2022-12-14T21:58:16Z", # "2022-12-13": "2022-12-13T22:00:09Z", # "2022-11-18": "2022-11-18T18:28:06Z" # } pass