import asyncio from aiohttp import web from aiohttp_apispec import docs, querystring_schema from apollo_utils.core.constants.dsp import DSP_SPOTIFY_APPLE from server.client import services from server.constants import BASE_API_PREFIX, cache_keys from server.domains.playlists.search import escape_elastic_query from server.scenarios.playlists.get_playlists_search import get_playlists_search from server.schemas.playlists.search import V1PlaylistsSearch from server.utils.pagination import paginate from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/v1/playlists/search/") @docs(tags=["playlists", "search"], summary="V1 (ElasticSearch) Playlists global search view.") @querystring_schema(V1PlaylistsSearch.Request) @dump_response_schema(V1PlaylistsSearch.Response) @paginate(cache_keys.V1_PLAYLISTS_SEARCH, extend_original_dict=True) async def get(request: web.Request): params = request["querystring"] dsp_list, search_term, include_list = params["dsp_list"], params["search_term"], params["include_list"] task_list = [ get_playlists_search(dsp_list, escape_elastic_query(search_term), params["image_size"], params["items_size"]) ] if include_list: task_list.append( services.apollo.get_users_search( term=search_term + "*", dsp_list=[i for i in dsp_list if i in DSP_SPOTIFY_APPLE.values()], include_list=["name", "uri", "subscribers", "country_code", "image"], sort_by="subscribers", sort_order="desc", limit=params["users_limit"], ) ) response_list = await asyncio.gather(*task_list) return {"items": response_list[0], **({"users": response_list[1]} if include_list else {})}