"""Joint API to get aggregated data from this one and another external services.""" from aiohttp import web from aiohttp_apispec import docs, querystring_schema from apollo_utils.service.clients.aiohttp.clients.constants import Service from apollo_utils.service.clients.aiohttp.utils.response import dump_response_schema from apollo_utils.service.exceptions import UnprocessableEntity from server.clients import services from server.constants.core import LEGACY_API_PREFIX, ApolloEntityType from server.db.models import Favorites from server.schemas.joint import FavoritesGet, MilestonesResponse router = web.RouteTableDef() @router.get(LEGACY_API_PREFIX + "/joint/favorites/") @docs( tags=["joint", "favorites", "legacy"], summary="Get favorite entities for various applications.", ) @querystring_schema(FavoritesGet.Request) @dump_response_schema(FavoritesGet.Response, apply=False) async def get_joint_favorites(request: web.Request) -> web.Response: params = request["querystring"] app, entity_type = params["application"], params["type"] if app == Service.APOLLO_API: if entity_type == ApolloEntityType.PLAYLIST: playlists, _ = await Favorites.list_by_params(app_slug=app.value, entity_type_list=[entity_type.value]) return web.json_response({"playlists": [p.entity_id for p in playlists]}) service = services.apollo elif app == Service.RTI_API: service = services.rti else: raise UnprocessableEntity("The method or operation is not implemented") tracks = await service.get_favorites() return web.json_response(tracks) @router.get(LEGACY_API_PREFIX + "/joint/favorites/rti/milestone/v2/") @docs( tags=["joint", "favorites", "milestone", "legacy"], summary="Get milestones.", ) @dump_response_schema(MilestonesResponse, apply=False) async def get_favorites_rti_milestone_v2(request: web.Request) -> web.Response: data = await services.rti.get_milestones() return web.json_response(data)