from apollo_utils.core.utils.multikeysort import multikeysort from flask import Blueprint, Response from flask_apispec import doc, marshal_with, use_kwargs from http import HTTPStatus from src.constants.http_status import HTTP_202_ACCEPTED from src.db.search.recent import add_users_recent_search, get_users_recent_search_query from src.legacy.core.pagination import paginate from src.schemas.search.recent import RecentSearch from src.utils import auth as auth_util blueprint = Blueprint("recent_search", __name__) @blueprint.route("search/recent/", methods=["GET"]) @doc("Get users recent search") @use_kwargs(RecentSearch.Request, location="query") @marshal_with(RecentSearch.Response(many=True), code=HTTPStatus.OK, description="Latest recent searches", apply=False) @marshal_with(None, code=HTTPStatus.UNAUTHORIZED, description="Authentication failed.") @marshal_with(None, code=400, description="Bad request") @paginate(full_data=True, response_kwargs=True) def get_recent_search(**data): user_id = auth_util.get_user().user_id type_list, dsp_list = data["type_list"], data["vendors"] query = get_users_recent_search_query(user_id=user_id, type_list=type_list, dsp_list=dsp_list) items = RecentSearch.Response.NestedItem(many=True, context={"type_list": type_list}).dump(query.all()) items = multikeysort(items, data["order_by"]) return items, dict(user_id=user_id) @blueprint.route("search/recent/", methods=["POST"]) @doc("Add users chosen search result") @use_kwargs(RecentSearch.PostRequestBody, location="json") @marshal_with( RecentSearch.PostResponse, code=HTTPStatus.ACCEPTED, description="Save search result user tapped on to be shown later in recent searches", apply=False, ) @marshal_with(None, code=HTTPStatus.UNAUTHORIZED, description="Authentication failed.") @marshal_with(None, code=400, description="Bad request") def post_recent_search(**data): add_users_recent_search(user_id=auth_util.get_user().user_id, **data) return Response(status=HTTP_202_ACCEPTED)