From fc8a21fc5c6809ea115092eeec57e09e984cdd76 Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Sun, 11 Dec 2022 11:22:06 -0700 Subject: More API read coverage --- api/views/search.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 api/views/search.py (limited to 'api/views/search.py') diff --git a/api/views/search.py b/api/views/search.py new file mode 100644 index 0000000..7735a65 --- /dev/null +++ b/api/views/search.py @@ -0,0 +1,42 @@ +from typing import Literal + +from ninja import Field + +from activities.search import Searcher +from api import schemas +from api.decorators import identity_required +from api.views.base import api_router + + +@api_router.get("/v2/search", response=schemas.Search) +@identity_required +def search( + request, + q: str, + type: Literal["accounts", "hashtags", "statuses"] | None = None, + fetch_identities: bool = Field(False, alias="resolve"), + following: bool = False, + exclude_unreviewed: bool = False, + account_id: str | None = None, + max_id: str | None = None, + since_id: str | None = None, + min_id: str | None = None, + limit: int = 20, + offset: int = 0, +): + if limit > 40: + limit = 40 + result: dict[str, list] = {"accounts": [], "statuses": [], "hashtags": []} + # We don't support pagination for searches yet + if max_id or since_id or min_id or offset: + return result + # Run search + searcher = Searcher(q, request.identity) + search_result = searcher.search_all() + if type is None or type == "accounts": + result["accounts"] = [i.to_mastodon_json() for i in search_result["identities"]] + if type is None or type == "hashtag": + result["hashtag"] = [h.to_mastodon_json() for h in search_result["hashtags"]] + if type is None or type == "statuses": + result["statuses"] = [p.to_mastodon_json() for p in search_result["posts"]] + return result -- cgit v1.2.3