diff --git a/lib/pleroma/search.ex b/lib/pleroma/search.ex index 3b266e59b..f2cba29ee 100644 --- a/lib/pleroma/search.ex +++ b/lib/pleroma/search.ex @@ -1,17 +1,7 @@ defmodule Pleroma.Search do - alias Pleroma.Workers.SearchIndexingWorker + alias Pleroma.Config - def add_to_index(%Pleroma.Activity{id: activity_id}) do - SearchIndexingWorker.enqueue("add_to_index", %{"activity" => activity_id}) - end - - def remove_from_index(%Pleroma.Object{id: object_id}) do - SearchIndexingWorker.enqueue("remove_from_index", %{"object" => object_id}) - end - - def search(query, options) do - search_module = Pleroma.Config.get([Pleroma.Search, :module], Pleroma.Activity) - - search_module.search(options[:for_user], query, options) - end + defdelegate add_to_index(activity), to: Config.get([Pleroma.Search, :module]) + defdelegate remove_from_index(object), to: Config.get([Pleroma.Search, :module]) + defdelegate search(query, options), to: Config.get([Pleroma.Search, :module]) end diff --git a/lib/pleroma/search/meilisearch.ex b/lib/pleroma/search/meilisearch.ex index 2bff663e8..0f16d5c5e 100644 --- a/lib/pleroma/search/meilisearch.ex +++ b/lib/pleroma/search/meilisearch.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Search.Meilisearch do alias Pleroma.Activity alias Pleroma.Config.Getting, as: Config + alias Pleroma.Workers.SearchIndexingWorker import Pleroma.Search.DatabaseSearch import Ecto.Query @@ -149,7 +150,13 @@ defmodule Pleroma.Search.Meilisearch do end @impl true - def add_to_index(activity) do + def add_to_index(%Pleroma.Activity{id: activity_id}) do + SearchIndexingWorker.enqueue("add_to_index", %{"activity" => activity_id}) + end + + def add_to_index(activity_id) when is_binary(activity_id) do + activity = Pleroma.Activity.get_by_id_with_object(activity_id) + maybe_search_data = object_to_search_data(activity.object) if activity.data["type"] == "Create" and maybe_search_data do @@ -175,7 +182,11 @@ defmodule Pleroma.Search.Meilisearch do end @impl true - def remove_from_index(object) do - meili_delete("/indexes/objects/documents/#{object.id}") + def remove_from_index(%Pleroma.Object{id: object_id}) do + SearchIndexingWorker.enqueue("remove_from_index", %{"object" => object_id}) + end + + def remove_from_index(object_id) when is_binary(object_id) do + meili_delete("/indexes/objects/documents/#{object_id}") end end diff --git a/lib/pleroma/search/search_backend.ex b/lib/pleroma/search/search_backend.ex index 68bc48cec..0c293f3d1 100644 --- a/lib/pleroma/search/search_backend.ex +++ b/lib/pleroma/search/search_backend.ex @@ -8,10 +8,10 @@ defmodule Pleroma.Search.SearchBackend do @doc """ Add the object associated with the activity to the search index. - - The whole activity is passed, to allow filtering on things such as scope. + When the activity is passed we schedule the job; when the activity id is passed we execute the work. """ - @callback add_to_index(activity :: Pleroma.Activity.t()) :: :ok | {:error, any()} + @callback add_to_index(activity :: Pleroma.Activity.t()) :: {:ok, Oban.Job.t()} | {:error, Oban.Job.changeset() | term()} + @callback add_to_index(activity_id :: String.t()) :: :ok | {:error, any()} @doc """ Remove the object from the index. @@ -19,6 +19,9 @@ defmodule Pleroma.Search.SearchBackend do Just the object, as opposed to the whole activity, is passed, since the object is what contains the actual content and there is no need for filtering when removing from index. + + When the object is passed we schedule the job; when the object id is passed we execute the work. """ - @callback remove_from_index(object :: Pleroma.Object.t()) :: :ok | {:error, any()} + @callback remove_from_index(object :: Pleroma.Object.t()) :: {:ok, Oban.Job.t()} | {:error, Oban.Job.changeset() | term()} + @callback remove_from_index(object_id :: String.t()) :: :ok | {:error, any()} end diff --git a/lib/pleroma/workers/search_indexing_worker.ex b/lib/pleroma/workers/search_indexing_worker.ex index 8476a2be5..d4c3c894c 100644 --- a/lib/pleroma/workers/search_indexing_worker.ex +++ b/lib/pleroma/workers/search_indexing_worker.ex @@ -6,18 +6,14 @@ defmodule Pleroma.Workers.SearchIndexingWorker do alias Pleroma.Config.Getting, as: Config def perform(%Job{args: %{"op" => "add_to_index", "activity" => activity_id}}) do - activity = Pleroma.Activity.get_by_id_with_object(activity_id) - search_module = Config.get([Pleroma.Search, :module]) - search_module.add_to_index(activity) + search_module.add_to_index(activity_id) end def perform(%Job{args: %{"op" => "remove_from_index", "object" => object_id}}) do - object = Pleroma.Object.get_by_id(object_id) - search_module = Config.get([Pleroma.Search, :module]) - search_module.remove_from_index(object) + search_module.remove_from_index(object_id) end end