X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Fmastodon_api%2Fcontrollers%2Fsearch_controller.ex;h=920ff5980993e5e03ff9985d0ab8c75389d51cb7;hb=345eb7b3f8bd241132fc414e20e4f1649d359df7;hp=29affa7d54e5d8162b79a1f662fe3c8781c07dfe;hpb=1963e143c5feace9eb9a3be29b0eeba2ad88751a;p=akkoma diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 29affa7d5..920ff5980 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -1,19 +1,19 @@ # Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors +# Copyright © 2017-2021 Pleroma Authors # 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" => []} @@ -93,7 +130,6 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do AccountView.render("index.json", users: accounts, for: options[:for_user], - as: :user, embed_relationships: options[:embed_relationships] ) end @@ -109,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)