summaryrefslogtreecommitdiffstats
path: root/api/views/search.py
diff options
context:
space:
mode:
Diffstat (limited to 'api/views/search.py')
-rw-r--r--api/views/search.py42
1 files changed, 42 insertions, 0 deletions
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