from apollo_utils.core.constants.dsp import DSP_SPOTIFY_APPLE from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.enum import EnumField, EnumListField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from marshmallow import Schema, fields, validate from src.constants.order import SortOrder from src.constants.users.search import UsersSearchInclude, UsersSearchSortBy class UsersSearch: class Request(RequestSchema): search_term = fields.String(data_key="term", missing=None) dsp_list = EnumListField(DSP_SPOTIFY_APPLE, as_enum=True, data_key="dsp", missing=None) country_code_list = SplitUniqueListField( fields.String(required=True, validate=validate.Length(min=2, max=10)), data_key="country_code", missing=None ) category_id_list = SplitUniqueListField(fields.Integer(required=True), data_key="category_id", missing=None) music_service_list = SplitUniqueListField(fields.Integer(required=True), data_key="music_service", missing=None) service_type_list = SplitUniqueListField(fields.Integer(required=True), data_key="service_type", missing=None) include_list = EnumListField( UsersSearchInclude, as_enum=True, data_key="include", allow_all=True, missing=list(UsersSearchInclude), validate=validate.Length(min=1), ) sort_by = EnumField(UsersSearchSortBy, missing=UsersSearchSortBy.USER_NAME) sort_order = EnumField(SortOrder, missing=SortOrder.ASC) limit = fields.Integer(missing=None) class Response(Schema): class UserItem(Schema): id = fields.Integer() user_name = fields.String() display_name = fields.String() country_code = fields.String() subscribers = fields.Integer() playlist_subscribers = fields.Integer() image = fields.String() category_id = fields.Integer() music_service = fields.Integer() service_type = fields.Integer() name = fields.String() uri = fields.String() items = fields.List(fields.Nested(UserItem))