1 defmodule Pleroma.Search.Elasticsearch do
2 @behaviour Pleroma.Search
4 alias Pleroma.Web.MastodonAPI.StatusView
5 alias Pleroma.Web.MastodonAPI.AccountView
6 alias Pleroma.Web.ActivityPub.Visibility
7 alias Pleroma.Search.Elasticsearch.Parsers
8 alias Pleroma.Web.Endpoint
10 defp es_query(:activity, query) do
14 must: Parsers.Activity.parse(query)
20 defp es_query(:user, query) do
24 must: Parsers.User.parse(query)
30 defp es_query(:hashtag, query) do
34 must: Parsers.Hashtag.parse(query)
41 def search(%{assigns: %{user: user}} = _conn, %{q: query} = _params, _options) do
45 |> SearchParser.parse!()
49 q = es_query(:activity, parsed_query)
51 Pleroma.Elasticsearch.search(:activities, q)
52 |> Enum.filter(fn x -> Visibility.visible_for_user?(x, user) end)
57 q = es_query(:user, parsed_query)
59 Pleroma.Elasticsearch.search(:users, q)
60 |> Enum.filter(fn x -> Pleroma.User.visible_for(x, user) == :visible end)
65 q = es_query(:hashtag, parsed_query)
67 Pleroma.Elasticsearch.search(:hashtags, q)
70 activity_results = Task.await(activity_task)
71 user_results = Task.await(user_task)
72 hashtag_results = Task.await(hashtag_task)
76 AccountView.render("index.json",
81 Enum.map(hashtag_results, fn x ->
83 url: Endpoint.url() <> "/tag/" <> x,
88 StatusView.render("index.json",
89 activities: activity_results,