from apollo_utils.core.constants.dsp import DSP from apollo_utils.service.legacy.schemas.mixins.vendor import RequiredAllVendorMixin from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.pagination import PaginationResponseMixin from marshmallow import Schema, ValidationError, fields, post_load from server.schemas.mixins import CreatedUpdatedAtMixin, IntOrNull from server.schemas.pagination import GetAllPaginationMixin class FavoritePlaylistsGetByAccount: class Request(GetAllPaginationMixin, RequestSchema): tag_id = SplitUniqueListField(IntOrNull(allow_none=True, null_to=None, required=True), default=[]) class Response(PaginationResponseMixin, Schema): class Item(CreatedUpdatedAtMixin, Schema): id = fields.Int(data_key="favorites_id") data_id = fields.Function(lambda o: o.data.get("id"), data_key="id") vendor = fields.Function(lambda o: o.data.get("vendor")) country_code = fields.Function(lambda o: o.data.get("country_code")) tag_id = fields.Int(default=None) items = fields.List(fields.Nested(Item)) class FavoritePlaylistCreateDeleteRequest(RequiredAllVendorMixin, RequestSchema): id = fields.String(required=True) country_code = fields.String(required=False) @post_load def validate_playlist(self, data, **kwargs): country_code = data.get("country_code") if country_code and data["vendor"] == DSP.SPOTIFY.value: raise ValidationError("Can not use country code for Spotify.") if country_code and data["vendor"] == DSP.AMAZON.value: raise ValidationError("Can not use country code for Amazon.") if not country_code and data["vendor"] == DSP.APPLE.value: raise ValidationError("Country code is required for Apple Music.") return data