takahe/api/views/search.py

56 lines
1.8 KiB
Python
Raw Normal View History

2022-12-11 10:22:06 -08:00
from typing import Literal
from hatchway import Field, api_view
2022-12-11 11:37:28 -08:00
from activities.models import PostInteraction
from activities.services.search import SearchService
2022-12-11 10:22:06 -08:00
from api import schemas
2023-02-19 10:37:02 -08:00
from api.decorators import scope_required
2022-12-11 10:22:06 -08:00
2023-02-19 10:37:02 -08:00
@scope_required("read")
@api_view.get
2022-12-11 10:22:06 -08:00
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,
) -> schemas.Search:
2022-12-11 10:22:06 -08:00
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 schemas.Search(**result)
2022-12-11 10:22:06 -08:00
# Run search
searcher = SearchService(q, request.identity)
2022-12-11 10:22:06 -08:00
search_result = searcher.search_all()
if type is None or type == "accounts":
result["accounts"] = [
schemas.Account.from_identity(i, include_counts=False)
for i in search_result["identities"]
]
2022-12-11 10:22:06 -08:00
if type is None or type == "hashtag":
result["hashtags"] = [
schemas.Tag.from_hashtag(h) for h in search_result["hashtags"]
]
2022-12-11 10:22:06 -08:00
if type is None or type == "statuses":
2022-12-11 11:37:28 -08:00
interactions = PostInteraction.get_post_interactions(
search_result["posts"], request.identity
)
result["statuses"] = [
schemas.Status.from_post(
p, interactions=interactions, identity=request.identity
)
2022-12-11 11:37:28 -08:00
for p in search_result["posts"]
]
return schemas.Search(**result)