Merge branch 'split-masto-api/suggestions' into 'develop'
Extract suggestions actions from `MastodonAPIController` to `SuggestionController` See merge request pleroma/pleroma!1757
This commit is contained in:
commit
82d7985ae9
|
@ -9,7 +9,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
|
|
||||||
alias Pleroma.Bookmark
|
alias Pleroma.Bookmark
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.HTTP
|
|
||||||
alias Pleroma.Pagination
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.Plugs.RateLimiter
|
alias Pleroma.Plugs.RateLimiter
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
@ -22,7 +21,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
alias Pleroma.Web.MastodonAPI.AppView
|
alias Pleroma.Web.MastodonAPI.AppView
|
||||||
alias Pleroma.Web.MastodonAPI.MastodonView
|
alias Pleroma.Web.MastodonAPI.MastodonView
|
||||||
alias Pleroma.Web.MastodonAPI.StatusView
|
alias Pleroma.Web.MastodonAPI.StatusView
|
||||||
alias Pleroma.Web.MediaProxy
|
|
||||||
alias Pleroma.Web.OAuth.App
|
alias Pleroma.Web.OAuth.App
|
||||||
alias Pleroma.Web.OAuth.Authorization
|
alias Pleroma.Web.OAuth.Authorization
|
||||||
alias Pleroma.Web.OAuth.Scopes
|
alias Pleroma.Web.OAuth.Scopes
|
||||||
|
@ -362,53 +360,6 @@ def empty_object(conn, _) do
|
||||||
json(conn, %{})
|
json(conn, %{})
|
||||||
end
|
end
|
||||||
|
|
||||||
def suggestions(%{assigns: %{user: user}} = conn, _) do
|
|
||||||
suggestions = Config.get(:suggestions)
|
|
||||||
|
|
||||||
if Keyword.get(suggestions, :enabled, false) do
|
|
||||||
api = Keyword.get(suggestions, :third_party_engine, "")
|
|
||||||
timeout = Keyword.get(suggestions, :timeout, 5000)
|
|
||||||
limit = Keyword.get(suggestions, :limit, 23)
|
|
||||||
|
|
||||||
host = Config.get([Pleroma.Web.Endpoint, :url, :host])
|
|
||||||
|
|
||||||
user = user.nickname
|
|
||||||
|
|
||||||
url =
|
|
||||||
api
|
|
||||||
|> String.replace("{{host}}", host)
|
|
||||||
|> String.replace("{{user}}", user)
|
|
||||||
|
|
||||||
with {:ok, %{status: 200, body: body}} <-
|
|
||||||
HTTP.get(url, [], adapter: [recv_timeout: timeout, pool: :default]),
|
|
||||||
{:ok, data} <- Jason.decode(body) do
|
|
||||||
data =
|
|
||||||
data
|
|
||||||
|> Enum.slice(0, limit)
|
|
||||||
|> Enum.map(fn x ->
|
|
||||||
x
|
|
||||||
|> Map.put("id", fetch_suggestion_id(x))
|
|
||||||
|> Map.put("avatar", MediaProxy.url(x["avatar"]))
|
|
||||||
|> Map.put("avatar_static", MediaProxy.url(x["avatar_static"]))
|
|
||||||
end)
|
|
||||||
|
|
||||||
json(conn, data)
|
|
||||||
else
|
|
||||||
e ->
|
|
||||||
Logger.error("Could not retrieve suggestions at fetch #{url}, #{inspect(e)}")
|
|
||||||
end
|
|
||||||
else
|
|
||||||
json(conn, [])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp fetch_suggestion_id(attrs) do
|
|
||||||
case User.get_or_fetch(attrs["acct"]) do
|
|
||||||
{:ok, %User{id: id}} -> id
|
|
||||||
_ -> 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def password_reset(conn, params) do
|
def password_reset(conn, params) do
|
||||||
nickname_or_email = params["email"] || params["nickname"]
|
nickname_or_email = params["email"] || params["nickname"]
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.SuggestionController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.MediaProxy
|
||||||
|
|
||||||
|
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||||
|
|
||||||
|
@doc "GET /api/v1/suggestions"
|
||||||
|
def index(%{assigns: %{user: user}} = conn, _) do
|
||||||
|
if Config.get([:suggestions, :enabled], false) do
|
||||||
|
with {:ok, data} <- fetch_suggestions(user) do
|
||||||
|
limit = Config.get([:suggestions, :limit], 23)
|
||||||
|
|
||||||
|
data =
|
||||||
|
data
|
||||||
|
|> Enum.slice(0, limit)
|
||||||
|
|> Enum.map(fn x ->
|
||||||
|
x
|
||||||
|
|> Map.put("id", fetch_suggestion_id(x))
|
||||||
|
|> Map.put("avatar", MediaProxy.url(x["avatar"]))
|
||||||
|
|> Map.put("avatar_static", MediaProxy.url(x["avatar_static"]))
|
||||||
|
end)
|
||||||
|
|
||||||
|
json(conn, data)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
json(conn, [])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp fetch_suggestions(user) do
|
||||||
|
api = Config.get([:suggestions, :third_party_engine], "")
|
||||||
|
timeout = Config.get([:suggestions, :timeout], 5000)
|
||||||
|
host = Config.get([Pleroma.Web.Endpoint, :url, :host])
|
||||||
|
|
||||||
|
url =
|
||||||
|
api
|
||||||
|
|> String.replace("{{host}}", host)
|
||||||
|
|> String.replace("{{user}}", user.nickname)
|
||||||
|
|
||||||
|
with {:ok, %{status: 200, body: body}} <-
|
||||||
|
Pleroma.HTTP.get(url, [], adapter: [recv_timeout: timeout, pool: :default]) do
|
||||||
|
Jason.decode(body)
|
||||||
|
else
|
||||||
|
e -> Logger.error("Could not retrieve suggestions at fetch #{url}, #{inspect(e)}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp fetch_suggestion_id(attrs) do
|
||||||
|
case User.get_or_fetch(attrs["acct"]) do
|
||||||
|
{:ok, %User{id: id}} -> id
|
||||||
|
_ -> 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -373,7 +373,7 @@ defmodule Pleroma.Web.Router do
|
||||||
|
|
||||||
get("/filters", FilterController, :index)
|
get("/filters", FilterController, :index)
|
||||||
|
|
||||||
get("/suggestions", MastodonAPIController, :suggestions)
|
get("/suggestions", SuggestionController, :index)
|
||||||
|
|
||||||
get("/conversations", ConversationController, :index)
|
get("/conversations", ConversationController, :index)
|
||||||
post("/conversations/:id/read", ConversationController, :read)
|
post("/conversations/:id/read", ConversationController, :read)
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
|
|
||||||
|
import ExUnit.CaptureLog
|
||||||
|
import Pleroma.Factory
|
||||||
|
import Tesla.Mock
|
||||||
|
|
||||||
|
setup do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
host = Config.get([Pleroma.Web.Endpoint, :url, :host])
|
||||||
|
url500 = "http://test500?#{host}&#{user.nickname}"
|
||||||
|
url200 = "http://test200?#{host}&#{user.nickname}"
|
||||||
|
|
||||||
|
mock(fn
|
||||||
|
%{method: :get, url: ^url500} ->
|
||||||
|
%Tesla.Env{status: 500, body: "bad request"}
|
||||||
|
|
||||||
|
%{method: :get, url: ^url200} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body:
|
||||||
|
~s([{"acct":"yj455","avatar":"https://social.heldscal.la/avatar/201.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/201.jpeg"}, {"acct":"#{
|
||||||
|
other_user.ap_id
|
||||||
|
}","avatar":"https://social.heldscal.la/avatar/202.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/202.jpeg"}])
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
[user: user, other_user: other_user]
|
||||||
|
end
|
||||||
|
|
||||||
|
clear_config(:suggestions)
|
||||||
|
|
||||||
|
test "returns empty result when suggestions disabled", %{conn: conn, user: user} do
|
||||||
|
Config.put([:suggestions, :enabled], false)
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/suggestions")
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
assert res == []
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns error", %{conn: conn, user: user} do
|
||||||
|
Config.put([:suggestions, :enabled], true)
|
||||||
|
Config.put([:suggestions, :third_party_engine], "http://test500?{{host}}&{{user}}")
|
||||||
|
|
||||||
|
assert capture_log(fn ->
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/suggestions")
|
||||||
|
|> json_response(500)
|
||||||
|
|
||||||
|
assert res == "Something went wrong"
|
||||||
|
end) =~ "Could not retrieve suggestions"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns suggestions", %{conn: conn, user: user, other_user: other_user} do
|
||||||
|
Config.put([:suggestions, :enabled], true)
|
||||||
|
Config.put([:suggestions, :third_party_engine], "http://test200?{{host}}&{{user}}")
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/suggestions")
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
assert res == [
|
||||||
|
%{
|
||||||
|
"acct" => "yj455",
|
||||||
|
"avatar" => "https://social.heldscal.la/avatar/201.jpeg",
|
||||||
|
"avatar_static" => "https://social.heldscal.la/avatar/s/201.jpeg",
|
||||||
|
"id" => 0
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"acct" => other_user.ap_id,
|
||||||
|
"avatar" => "https://social.heldscal.la/avatar/202.jpeg",
|
||||||
|
"avatar_static" => "https://social.heldscal.la/avatar/s/202.jpeg",
|
||||||
|
"id" => other_user.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
|
@ -8,7 +8,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
alias Ecto.Changeset
|
alias Ecto.Changeset
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Object
|
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.Tests.ObanHelpers
|
alias Pleroma.Tests.ObanHelpers
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
@ -16,7 +15,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
alias Pleroma.Web.OAuth.App
|
alias Pleroma.Web.OAuth.App
|
||||||
alias Pleroma.Web.Push
|
alias Pleroma.Web.Push
|
||||||
|
|
||||||
import ExUnit.CaptureLog
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
import Swoosh.TestAssertions
|
import Swoosh.TestAssertions
|
||||||
import Tesla.Mock
|
import Tesla.Mock
|
||||||
|
@ -431,87 +429,6 @@ test "it returns 400 when user is not local", %{conn: conn, user: user} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /api/v1/suggestions" do
|
|
||||||
setup do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
host = Config.get([Pleroma.Web.Endpoint, :url, :host])
|
|
||||||
url500 = "http://test500?#{host}&#{user.nickname}"
|
|
||||||
url200 = "http://test200?#{host}&#{user.nickname}"
|
|
||||||
|
|
||||||
mock(fn
|
|
||||||
%{method: :get, url: ^url500} ->
|
|
||||||
%Tesla.Env{status: 500, body: "bad request"}
|
|
||||||
|
|
||||||
%{method: :get, url: ^url200} ->
|
|
||||||
%Tesla.Env{
|
|
||||||
status: 200,
|
|
||||||
body:
|
|
||||||
~s([{"acct":"yj455","avatar":"https://social.heldscal.la/avatar/201.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/201.jpeg"}, {"acct":"#{
|
|
||||||
other_user.ap_id
|
|
||||||
}","avatar":"https://social.heldscal.la/avatar/202.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/202.jpeg"}])
|
|
||||||
}
|
|
||||||
end)
|
|
||||||
|
|
||||||
[user: user, other_user: other_user]
|
|
||||||
end
|
|
||||||
|
|
||||||
clear_config(:suggestions)
|
|
||||||
|
|
||||||
test "returns empty result when suggestions disabled", %{conn: conn, user: user} do
|
|
||||||
Config.put([:suggestions, :enabled], false)
|
|
||||||
|
|
||||||
res =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/suggestions")
|
|
||||||
|> json_response(200)
|
|
||||||
|
|
||||||
assert res == []
|
|
||||||
end
|
|
||||||
|
|
||||||
test "returns error", %{conn: conn, user: user} do
|
|
||||||
Config.put([:suggestions, :enabled], true)
|
|
||||||
Config.put([:suggestions, :third_party_engine], "http://test500?{{host}}&{{user}}")
|
|
||||||
|
|
||||||
assert capture_log(fn ->
|
|
||||||
res =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/suggestions")
|
|
||||||
|> json_response(500)
|
|
||||||
|
|
||||||
assert res == "Something went wrong"
|
|
||||||
end) =~ "Could not retrieve suggestions"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "returns suggestions", %{conn: conn, user: user, other_user: other_user} do
|
|
||||||
Config.put([:suggestions, :enabled], true)
|
|
||||||
Config.put([:suggestions, :third_party_engine], "http://test200?{{host}}&{{user}}")
|
|
||||||
|
|
||||||
res =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/suggestions")
|
|
||||||
|> json_response(200)
|
|
||||||
|
|
||||||
assert res == [
|
|
||||||
%{
|
|
||||||
"acct" => "yj455",
|
|
||||||
"avatar" => "https://social.heldscal.la/avatar/201.jpeg",
|
|
||||||
"avatar_static" => "https://social.heldscal.la/avatar/s/201.jpeg",
|
|
||||||
"id" => 0
|
|
||||||
},
|
|
||||||
%{
|
|
||||||
"acct" => other_user.ap_id,
|
|
||||||
"avatar" => "https://social.heldscal.la/avatar/202.jpeg",
|
|
||||||
"avatar_static" => "https://social.heldscal.la/avatar/s/202.jpeg",
|
|
||||||
"id" => other_user.id
|
|
||||||
}
|
|
||||||
]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "DELETE /auth/sign_out" do
|
describe "DELETE /auth/sign_out" do
|
||||||
test "redirect to root page", %{conn: conn} do
|
test "redirect to root page", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
Loading…
Reference in New Issue