Ensure only indexing public posts and implement clearing and delete
authorEkaterina Vaartis <vaartis@kotobank.ch>
Mon, 16 Aug 2021 19:24:31 +0000 (22:24 +0300)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Wed, 29 Jun 2022 19:48:29 +0000 (20:48 +0100)
lib/mix/tasks/pleroma/search/meilisearch.ex
lib/pleroma/activity.ex
lib/pleroma/search/meilisearch.ex
lib/pleroma/web/common_api.ex

index 1fece96e5ea602de24f229cfa31d1d2f8adbc2a9..0b86fdececf550a1f83b0ea66f132e3b1009ac3b 100644 (file)
@@ -4,6 +4,7 @@
 
 defmodule Mix.Tasks.Pleroma.Search.Meilisearch do
   require Logger
+  require Pleroma.Constants
 
   import Mix.Pleroma
   import Ecto.Query
@@ -29,7 +30,11 @@ defmodule Mix.Tasks.Pleroma.Search.Meilisearch do
 
     Pleroma.Repo.chunk_stream(
       from(Pleroma.Object,
-        where: fragment("data->>'type' = 'Note'") and fragment("LENGTH(data->>'source') > 0")
+        # Only index public posts which are notes and have some text
+        where:
+          fragment("data->>'type' = 'Note'") and
+            fragment("LENGTH(data->>'source') > 0") and
+            fragment("data->'to' \\? ?", ^Pleroma.Constants.as_public())
       ),
       200,
       :batches
@@ -51,4 +56,12 @@ defmodule Mix.Tasks.Pleroma.Search.Meilisearch do
     end)
     |> Stream.run()
   end
+
+  def run(["clear"]) do
+    start_pleroma()
+
+    endpoint = Pleroma.Config.get([Pleroma.Search.Meilisearch, :url])
+
+    {:ok, _} = Pleroma.HTTP.request(:delete, "#{endpoint}/indexes/objects/documents", "", [], [])
+  end
 end
index 10b1b0120844e7248a45c910e182c52db3c7a293..d1d2ad9d168ef12d110941a0ead956a833061a4d 100644 (file)
@@ -369,6 +369,7 @@ defmodule Pleroma.Activity do
 
   defdelegate search(user, query, options \\ []), to: Pleroma.Activity.Search
   def add_to_index(_activity), do: nil
+  def remove_from_index(_object), do: nil
 
   def direct_conversation_id(activity, for_user) do
     alias Pleroma.Conversation.Participation
index 92e0d3429306819214744715dae144da772af6c1..dbe6b2d672ceb8e596dba5adeec552973b49a16a 100644 (file)
@@ -1,5 +1,6 @@
 defmodule Pleroma.Search.Meilisearch do
   require Logger
+  require Pleroma.Constants
 
   alias Pleroma.Activity
 
@@ -41,7 +42,8 @@ defmodule Pleroma.Search.Meilisearch do
   def add_to_index(activity) do
     object = activity.object
 
-    if activity.data["type"] == "Create" and not is_nil(object) and object.data["type"] == "Note" do
+    if activity.data["type"] == "Create" and not is_nil(object) and object.data["type"] == "Note" and
+         Pleroma.Constants.as_public() in object.data["to"] do
       data = object.data
 
       endpoint = Pleroma.Config.get([Pleroma.Search.Meilisearch, :url])
@@ -57,4 +59,17 @@ defmodule Pleroma.Search.Meilisearch do
       end
     end
   end
+
+  def remove_from_index(object) do
+    endpoint = Pleroma.Config.get([Pleroma.Search.Meilisearch, :url])
+
+    {:ok, _} =
+      Pleroma.HTTP.request(
+        :delete,
+        "#{endpoint}/indexes/objects/documents/#{object.id}",
+        "",
+        [],
+        []
+      )
+  end
 end
index 92afd5cb61e6533ebfc0359742b8eee21bc1ed14..0b7be42e076365482e82a481914d0e85807cd442 100644 (file)
@@ -146,6 +146,13 @@ defmodule Pleroma.Web.CommonAPI do
          true <- User.superuser?(user) || user.ap_id == object.data["actor"],
          {:ok, delete_data, _} <- Builder.delete(user, object.data["id"]),
          {:ok, delete, _} <- Pipeline.common_pipeline(delete_data, local: true) do
+      # Also delete from search index
+      search_module = Pleroma.Config.get([Pleroma.Search, :module])
+
+      ConcurrentLimiter.limit(Pleroma.Search, fn ->
+        Task.start(fn -> search_module.remove_from_index(object) end)
+      end)
+
       {:ok, delete}
     else
       {:find_activity, _} ->