from apollo_utils.service.schemas.fields.list import SplitUniqueListField from marshmallow import fields, validate from server.constants import APPLE_MAX_IMAGE_SIZE, DSP_SPOTIFY_APPLE, DSP_SPOTIFY_APPLE_AMAZON from server.constants.playlists.v0.misc import DEFAULT_IMAGE_SIZE from server.schemas.base.pagination import PaginationMixin from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.clients.apollo_api import ApolloPaginationResponse class V1PlaylistsSearch: class Request(RequestSchema, PaginationMixin): """Playlists Search Request params Schema.""" dsp_list = SplitUniqueListField( fields.String(validate=validate.OneOf(DSP_SPOTIFY_APPLE_AMAZON.values())), data_key="vendor", default=DSP_SPOTIFY_APPLE.values(), missing=DSP_SPOTIFY_APPLE.values(), ) search_term = fields.String(validate=validate.Length(min=2, max=50), required=True, data_key="query") items_size = fields.Integer(validate=validate.Range(min=1, max=100), missing=30) image_size = fields.Int(missing=DEFAULT_IMAGE_SIZE, validate=validate.Range(max=APPLE_MAX_IMAGE_SIZE, min=1)) include_list = SplitUniqueListField( fields.String(validate=validate.OneOf(("users",))), data_key="include", missing=None ) users_limit = fields.Integer(missing=10) class Response(ApolloPaginationResponse): class PlaylistSearchItem(Schema): """Playlists Search Response Schema.""" owner = fields.String(allow_none=True) image_url = fields.Url() id = fields.String() country_code = fields.String(allow_none=True) personalized = fields.Boolean() vendor = fields.String() followers = fields.Integer() name = fields.String() class UserItem(Schema): name = fields.String() uri = fields.String() subscribers = fields.Integer() country_code = fields.String() image = fields.String() items = fields.List(fields.Nested(PlaylistSearchItem)) users = fields.List(fields.Nested(UserItem))