Extract instance actions from `MastodonAPIController` to `InstanceController` See merge request pleroma/pleroma!1760object-id-column
@@ -0,0 +1,17 @@ | |||
# 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.InstanceController do | |||
use Pleroma.Web, :controller | |||
@doc "GET /api/v1/instance" | |||
def show(conn, _params) do | |||
render(conn, "show.json") | |||
end | |||
@doc "GET /api/v1/instance/peers" | |||
def peers(conn, _params) do | |||
json(conn, Pleroma.Stats.get_peers()) | |||
end | |||
end |
@@ -10,7 +10,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||
alias Pleroma.Bookmark | |||
alias Pleroma.Config | |||
alias Pleroma.Pagination | |||
alias Pleroma.Stats | |||
alias Pleroma.User | |||
alias Pleroma.Web | |||
alias Pleroma.Web.ActivityPub.ActivityPub | |||
@@ -23,40 +22,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||
action_fallback(Pleroma.Web.MastodonAPI.FallbackController) | |||
@mastodon_api_level "2.7.2" | |||
def masto_instance(conn, _params) do | |||
instance = Config.get(:instance) | |||
response = %{ | |||
uri: Web.base_url(), | |||
title: Keyword.get(instance, :name), | |||
description: Keyword.get(instance, :description), | |||
version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})", | |||
email: Keyword.get(instance, :email), | |||
urls: %{ | |||
streaming_api: Pleroma.Web.Endpoint.websocket_url() | |||
}, | |||
stats: Stats.get_stats(), | |||
thumbnail: Web.base_url() <> "/instance/thumbnail.jpeg", | |||
languages: ["en"], | |||
registrations: Pleroma.Config.get([:instance, :registrations_open]), | |||
# Extra (not present in Mastodon): | |||
max_toot_chars: Keyword.get(instance, :limit), | |||
poll_limits: Keyword.get(instance, :poll_limits), | |||
upload_limit: Keyword.get(instance, :upload_limit), | |||
avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit), | |||
background_upload_limit: Keyword.get(instance, :background_upload_limit), | |||
banner_upload_limit: Keyword.get(instance, :banner_upload_limit) | |||
} | |||
json(conn, response) | |||
end | |||
def peers(conn, _params) do | |||
json(conn, Stats.get_peers()) | |||
end | |||
defp mastodonized_emoji do | |||
Pleroma.Emoji.get_all() | |||
|> Enum.map(fn {shortcode, %Pleroma.Emoji{file: relative_url, tags: tags}} -> | |||
@@ -0,0 +1,35 @@ | |||
# 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.InstanceView do | |||
use Pleroma.Web, :view | |||
@mastodon_api_level "2.7.2" | |||
def render("show.json", _) do | |||
instance = Pleroma.Config.get(:instance) | |||
%{ | |||
uri: Pleroma.Web.base_url(), | |||
title: Keyword.get(instance, :name), | |||
description: Keyword.get(instance, :description), | |||
version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})", | |||
email: Keyword.get(instance, :email), | |||
urls: %{ | |||
streaming_api: Pleroma.Web.Endpoint.websocket_url() | |||
}, | |||
stats: Pleroma.Stats.get_stats(), | |||
thumbnail: Pleroma.Web.base_url() <> "/instance/thumbnail.jpeg", | |||
languages: ["en"], | |||
registrations: Keyword.get(instance, :registrations_open), | |||
# Extra (not present in Mastodon): | |||
max_toot_chars: Keyword.get(instance, :limit), | |||
poll_limits: Keyword.get(instance, :poll_limits), | |||
upload_limit: Keyword.get(instance, :upload_limit), | |||
avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit), | |||
background_upload_limit: Keyword.get(instance, :background_upload_limit), | |||
banner_upload_limit: Keyword.get(instance, :banner_upload_limit) | |||
} | |||
end | |||
end |
@@ -462,14 +462,15 @@ defmodule Pleroma.Web.Router do | |||
post("/accounts", AccountController, :create) | |||
get("/instance", MastodonAPIController, :masto_instance) | |||
get("/instance/peers", MastodonAPIController, :peers) | |||
get("/instance", InstanceController, :show) | |||
get("/instance/peers", InstanceController, :peers) | |||
post("/apps", AppController, :create) | |||
get("/apps/verify_credentials", AppController, :verify_credentials) | |||
get("/custom_emojis", MastodonAPIController, :custom_emojis) | |||
get("/statuses/:id/card", StatusController, :card) | |||
get("/statuses/:id/favourited_by", StatusController, :favourited_by) | |||
get("/statuses/:id/reblogged_by", StatusController, :reblogged_by) | |||
@@ -0,0 +1,84 @@ | |||
# 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.InstanceControllerTest do | |||
use Pleroma.Web.ConnCase | |||
alias Pleroma.User | |||
import Pleroma.Factory | |||
test "get instance information", %{conn: conn} do | |||
conn = get(conn, "/api/v1/instance") | |||
assert result = json_response(conn, 200) | |||
email = Pleroma.Config.get([:instance, :email]) | |||
# Note: not checking for "max_toot_chars" since it's optional | |||
assert %{ | |||
"uri" => _, | |||
"title" => _, | |||
"description" => _, | |||
"version" => _, | |||
"email" => from_config_email, | |||
"urls" => %{ | |||
"streaming_api" => _ | |||
}, | |||
"stats" => _, | |||
"thumbnail" => _, | |||
"languages" => _, | |||
"registrations" => _, | |||
"poll_limits" => _, | |||
"upload_limit" => _, | |||
"avatar_upload_limit" => _, | |||
"background_upload_limit" => _, | |||
"banner_upload_limit" => _ | |||
} = result | |||
assert email == from_config_email | |||
end | |||
test "get instance stats", %{conn: conn} do | |||
user = insert(:user, %{local: true}) | |||
user2 = insert(:user, %{local: true}) | |||
{:ok, _user2} = User.deactivate(user2, !user2.info.deactivated) | |||
insert(:user, %{local: false, nickname: "u@peer1.com"}) | |||
insert(:user, %{local: false, nickname: "u@peer2.com"}) | |||
{:ok, _} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"}) | |||
# Stats should count users with missing or nil `info.deactivated` value | |||
{:ok, _user} = | |||
user.id | |||
|> User.get_cached_by_id() | |||
|> User.update_info(&Ecto.Changeset.change(&1, %{deactivated: nil})) | |||
Pleroma.Stats.force_update() | |||
conn = get(conn, "/api/v1/instance") | |||
assert result = json_response(conn, 200) | |||
stats = result["stats"] | |||
assert stats | |||
assert stats["user_count"] == 1 | |||
assert stats["status_count"] == 1 | |||
assert stats["domain_count"] == 2 | |||
end | |||
test "get peers", %{conn: conn} do | |||
insert(:user, %{local: false, nickname: "u@peer1.com"}) | |||
insert(:user, %{local: false, nickname: "u@peer2.com"}) | |||
Pleroma.Stats.force_update() | |||
conn = get(conn, "/api/v1/instance/peers") | |||
assert result = json_response(conn, 200) | |||
assert ["peer1.com", "peer2.com"] == Enum.sort(result) | |||
end | |||
end |
@@ -5,7 +5,6 @@ | |||
defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||
use Pleroma.Web.ConnCase | |||
alias Ecto.Changeset | |||
alias Pleroma.Config | |||
alias Pleroma.Notification | |||
alias Pleroma.Repo | |||
@@ -114,80 +113,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||
assert [] = json_response(third_conn, 200) | |||
end | |||
test "get instance information", %{conn: conn} do | |||
conn = get(conn, "/api/v1/instance") | |||
assert result = json_response(conn, 200) | |||
email = Config.get([:instance, :email]) | |||
# Note: not checking for "max_toot_chars" since it's optional | |||
assert %{ | |||
"uri" => _, | |||
"title" => _, | |||
"description" => _, | |||
"version" => _, | |||
"email" => from_config_email, | |||
"urls" => %{ | |||
"streaming_api" => _ | |||
}, | |||
"stats" => _, | |||
"thumbnail" => _, | |||
"languages" => _, | |||
"registrations" => _, | |||
"poll_limits" => _, | |||
"upload_limit" => _, | |||
"avatar_upload_limit" => _, | |||
"background_upload_limit" => _, | |||
"banner_upload_limit" => _ | |||
} = result | |||
assert email == from_config_email | |||
end | |||
test "get instance stats", %{conn: conn} do | |||
user = insert(:user, %{local: true}) | |||
user2 = insert(:user, %{local: true}) | |||
{:ok, _user2} = User.deactivate(user2, !user2.info.deactivated) | |||
insert(:user, %{local: false, nickname: "u@peer1.com"}) | |||
insert(:user, %{local: false, nickname: "u@peer2.com"}) | |||
{:ok, _} = CommonAPI.post(user, %{"status" => "cofe"}) | |||
# Stats should count users with missing or nil `info.deactivated` value | |||
{:ok, _user} = | |||
user.id | |||
|> User.get_cached_by_id() | |||
|> User.update_info(&Changeset.change(&1, %{deactivated: nil})) | |||
Pleroma.Stats.force_update() | |||
conn = get(conn, "/api/v1/instance") | |||
assert result = json_response(conn, 200) | |||
stats = result["stats"] | |||
assert stats | |||
assert stats["user_count"] == 1 | |||
assert stats["status_count"] == 1 | |||
assert stats["domain_count"] == 2 | |||
end | |||
test "get peers", %{conn: conn} do | |||
insert(:user, %{local: false, nickname: "u@peer1.com"}) | |||
insert(:user, %{local: false, nickname: "u@peer2.com"}) | |||
Pleroma.Stats.force_update() | |||
conn = get(conn, "/api/v1/instance/peers") | |||
assert result = json_response(conn, 200) | |||
assert ["peer1.com", "peer2.com"] == Enum.sort(result) | |||
end | |||
test "put settings", %{conn: conn} do | |||
user = insert(:user) | |||