add extra filters
[akkoma] / lib / pleroma / web / mastodon_api / controllers / search_controller.ex
index 5a983db3994509ccc133decf6afe53a09a1f161f..920ff5980993e5e03ff9985d0ab8c75389d51cb7 100644 (file)
@@ -1,19 +1,19 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.MastodonAPI.SearchController do
   use Pleroma.Web, :controller
 
   alias Pleroma.Activity
-  alias Pleroma.Plugs.OAuthScopesPlug
-  alias Pleroma.Plugs.RateLimiter
   alias Pleroma.Repo
   alias Pleroma.User
-  alias Pleroma.Web
   alias Pleroma.Web.ControllerHelper
+  alias Pleroma.Web.Endpoint
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.StatusView
+  alias Pleroma.Web.Plugs.OAuthScopesPlug
+  alias Pleroma.Web.Plugs.RateLimiter
 
   require Logger
 
@@ -45,6 +45,43 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do
 
   defp do_search(version, %{assigns: %{user: user}} = conn, %{q: query} = params) do
     query = String.trim(query)
+    options = search_options(params, user)
+    if Pleroma.Config.get([:search, :provider]) == :elasticsearch do
+      elasticsearch_search(conn, query, options)
+    else
+      builtin_search(version, conn, params)
+    end
+  end
+
+  defp elasticsearch_search(%{assigns: %{user: user}} = conn, query, options) do
+    with {:ok, raw_results} <- Pleroma.Elasticsearch.search(query) do
+      results = raw_results
+      |> Map.get(:body, %{})
+      |> Map.get("hits", %{})
+      |> Map.get("hits", [])
+      |> Enum.map(fn result -> result["_id"] end)
+      |> Pleroma.Activity.all_by_ids_with_object()
+      
+      json(
+        conn,
+        %{
+          accounts: [],
+          hashtags: [],
+          statuses: StatusView.render("index.json",
+            activities: results,
+            for: user,
+            as: :activity
+        )}
+      )
+    else
+      {:error, _} ->
+        conn
+        |> put_status(:internal_server_error)
+        |> json(%{error: "Search failed"})
+    end
+  end
+
+  defp builtin_search(version, %{assigns: %{user: user}} = conn, %{q: query} = params) do
     options = search_options(params, user)
     timeout = Keyword.get(Repo.config(), :timeout, 15_000)
     default_values = %{"statuses" => [], "accounts" => [], "hashtags" => []}
@@ -108,7 +145,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do
   end
 
   defp resource_search(:v2, "hashtags", query, options) do
-    tags_path = Web.base_url() <> "/tag/"
+    tags_path = Endpoint.url() <> "/tag/"
 
     query
     |> prepare_tags(options)