summaryrefslogtreecommitdiffstats
path: root/api/views/search.py
blob: 7735a65a293ed27273badda53fae5cf8959fe21c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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