from aiohttp import web from aiohttp_apispec import docs, headers_schema, json_schema, querystring_schema from apollo_utils.service.clients.aiohttp.utils.response import dump_response_schema from apollo_utils.service.schemas.headers import AppHeader from server.constants.core import BASE_API_PREFIX, LEGACY_API_PREFIX from server.constants.favorites import Include as FavoritesInclude from server.db.models import Favorites from server.db.users import favorites as db_favorites from server.domains.users import favorites as domains_favorites from server.schemas.favorites.list import FavoritesGetByParams, FavoritesPostList from server.utils.pagination import paginate router = web.RouteTableDef() @router.post(LEGACY_API_PREFIX + "/favorites/by-params/bulk/") @docs( tags=["favorites", "bulk", "legacy"], summary="Get multiple favorites entities by parameters (legacy version).", ) @headers_schema(AppHeader) @json_schema(FavoritesGetByParams.RequestData) @querystring_schema(FavoritesGetByParams.RequestParams) @dump_response_schema(FavoritesGetByParams.Response, apply=True) @paginate() async def get_favorites_by_parameters(request: web.Request) -> web.Response: app_slug, params, data = request["headers"]["app"], request["querystring"], request["json"] return await Favorites.list_by_params( app_slug=app_slug, user_list=data.get("user_list"), entity_type_list=data.get("entity_type_list"), dsp_list=data.get("vendor_list"), limit=params.get("limit"), offset=params.get("offset"), ) @router.post(BASE_API_PREFIX + "/service/users/favorites/list/") @docs(tags=["favorites", "list"], summary="List favorites.") @headers_schema(AppHeader) @json_schema(FavoritesPostList.Request) @dump_response_schema(FavoritesPostList.Response, apply=False) async def post_favorites_list(request: web.Request) -> web.Response: headers, params = request["headers"], request["json"] favorites_list = await db_favorites.get_favorites_with_accounts_include(headers["app"], **params) result = domains_favorites.sum_accounts(favorites_list) include = params["include"] exclude = [] if not include or FavoritesInclude.SETTINGS.value not in include: exclude.append("data.accounts.settings") else: domains_favorites.set_single_settings(result) if not include or FavoritesInclude.DEVICES.value not in include: exclude.append("data.accounts.devices") return FavoritesPostList.Response(exclude=exclude).dump({"data": result})