Skip posts in indexer where publish date is nil
[akkoma] / lib / pleroma / search / elasticsearch / document_mappings / activity.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 defimpl Elasticsearch.Document, for: Pleroma.Activity do
6 alias Pleroma.Object
7 require Pleroma.Constants
8
9 def id(obj), do: obj.id
10 def routing(_), do: false
11
12 def object_to_search_data(object) do
13 # Only index public or unlisted Notes
14 if not is_nil(object) and object.data["type"] == "Note" and
15 not is_nil(object.data["content"]) and
16 (Pleroma.Constants.as_public() in object.data["to"] or
17 Pleroma.Constants.as_public() in object.data["cc"]) and
18 String.length(object.data["content"]) > 1 do
19 data = object.data
20
21 content_str =
22 case data["content"] do
23 [nil | rest] -> to_string(rest)
24 str -> str
25 end
26
27 content =
28 with {:ok, scrubbed} <- FastSanitize.strip_tags(content_str),
29 trimmed <- String.trim(scrubbed) do
30 trimmed
31 end
32
33 if String.length(content) > 1 and not is_nil(data["published"]) do
34 {:ok, published, _} = DateTime.from_iso8601(data["published"])
35
36 %{
37 _timestamp: published,
38 content: content,
39 instance: URI.parse(object.data["actor"]).host,
40 hashtags: Object.hashtags(object),
41 user: Pleroma.User.get_cached_by_ap_id(object.data["actor"]).nickname
42 }
43 else
44 %{}
45 end
46 else
47 %{}
48 end
49 end
50
51 def encode(activity) do
52 object = Pleroma.Object.normalize(activity)
53 object_to_search_data(object)
54 end
55 end
56
57 defimpl Elasticsearch.Document, for: Pleroma.Object do
58 def id(obj), do: obj.id
59 def routing(_), do: false
60 def encode(_), do: nil
61 end