giant massive dep upgrade and dialyxir-found error emporium (#371)
[akkoma] / lib / pleroma / search / elasticsearch.ex
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
4
5 defmodule Pleroma.Search.Elasticsearch do
6 @behaviour Pleroma.Search.SearchBackend
7
8 alias Pleroma.Activity
9 alias Pleroma.Object.Fetcher
10 alias Pleroma.Web.ActivityPub.Visibility
11 alias Pleroma.Search.Elasticsearch.Parsers
12
13 def es_query(:activity, query, offset, limit) do
14 must = Parsers.Activity.parse(query)
15
16 %{
17 size: limit,
18 from: offset,
19 terminate_after: 50,
20 timeout: "5s",
21 sort: [
22 "_score",
23 %{"_timestamp" => %{order: "desc", format: "basic_date_time"}}
24 ],
25 query: %{
26 bool: %{
27 must: must
28 }
29 }
30 }
31 end
32
33 defp maybe_fetch(:activity, search_query) do
34 with true <- Regex.match?(~r/https?:/, search_query),
35 {:ok, object} <- Fetcher.fetch_object_from_id(search_query),
36 %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]) do
37 activity
38 else
39 _ -> nil
40 end
41 end
42
43 def search(user, query, options) do
44 limit = Enum.min([Keyword.get(options, :limit), 40])
45 offset = Keyword.get(options, :offset, 0)
46
47 parsed_query =
48 query
49 |> String.trim()
50 |> SearchParser.parse!()
51
52 activity_fetch_task =
53 Task.async(fn ->
54 maybe_fetch(:activity, String.trim(query))
55 end)
56
57 activity_task =
58 Task.async(fn ->
59 q = es_query(:activity, parsed_query, offset, limit)
60
61 :activities
62 |> Pleroma.Search.Elasticsearch.Store.search(q)
63 |> Enum.filter(fn x ->
64 x.data["type"] == "Create" && x.object.data["type"] == "Note" &&
65 Visibility.visible_for_user?(x, user)
66 end)
67 end)
68
69 activity_results = Task.await(activity_task)
70 direct_activity = Task.await(activity_fetch_task)
71
72 activity_results =
73 if direct_activity == nil do
74 activity_results
75 else
76 [direct_activity | activity_results]
77 end
78
79 activity_results
80 end
81
82 @impl true
83 def add_to_index(activity) do
84 Elasticsearch.put_document(Pleroma.Search.Elasticsearch.Cluster, activity, "activities")
85 end
86
87 @impl true
88 def remove_from_index(object) do
89 Elasticsearch.delete_document(Pleroma.Search.Elasticsearch.Cluster, object, "activities")
90 end
91 end