1 # Akkoma: A lightweight social networking server
2 # Copyright © 2022-2022 Akkoma Authors <https://git.ihatebeinga.live/IHBAGang/akkoma/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Search.Elasticsearch do
6 @behaviour Pleroma.Search
9 alias Pleroma.Object.Fetcher
10 alias Pleroma.Web.MastodonAPI.StatusView
11 alias Pleroma.Web.MastodonAPI.AccountView
12 alias Pleroma.Web.ActivityPub.Visibility
13 alias Pleroma.Search.Elasticsearch.Parsers
14 alias Pleroma.Web.Endpoint
16 def es_query(:activity, query) do
17 must = Parsers.Activity.parse(query)
28 %{_timestamp: %{order: "desc", format: "basic_date_time"}}
39 def es_query(:user, query) do
40 must = Parsers.User.parse(query)
61 def es_query(:hashtag, query) do
62 must = Parsers.Hashtag.parse(query)
76 must: Parsers.Hashtag.parse(query)
83 defp maybe_fetch(:activity, search_query) do
84 with true <- Regex.match?(~r/https?:/, search_query),
85 {:ok, object} <- Fetcher.fetch_object_from_id(search_query),
86 %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]) do
94 def search(%{assigns: %{user: user}} = _conn, %{q: query} = _params, _options) do
98 |> SearchParser.parse!()
100 activity_fetch_task =
102 maybe_fetch(:activity, String.trim(query))
107 q = es_query(:activity, parsed_query)
109 Pleroma.Elasticsearch.search(:activities, q)
110 |> Enum.filter(fn x -> Visibility.visible_for_user?(x, user) end)
115 q = es_query(:user, parsed_query)
117 Pleroma.Elasticsearch.search(:users, q)
118 |> Enum.filter(fn x -> Pleroma.User.visible_for(x, user) == :visible end)
123 q = es_query(:hashtag, parsed_query)
125 Pleroma.Elasticsearch.search(:hashtags, q)
128 activity_results = Task.await(activity_task)
129 user_results = Task.await(user_task)
130 hashtag_results = Task.await(hashtag_task)
131 direct_activity = Task.await(activity_fetch_task)
134 if direct_activity == nil do
137 [direct_activity | activity_results]
142 AccountView.render("index.json",
147 Enum.map(hashtag_results, fn x ->
149 url: Endpoint.url() <> "/tag/" <> x,
154 StatusView.render("index.json",
155 activities: activity_results,