Merge branch 'split-masto-api/instance' into 'develop'
Extract instance actions from `MastodonAPIController` to `InstanceController` See merge request pleroma/pleroma!1760
This commit is contained in:
commit
433f2c0f68
6 changed files with 140 additions and 113 deletions
|
@ -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.Bookmark
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.Pagination
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.Stats
|
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web
|
alias Pleroma.Web
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
@ -23,40 +22,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
|
|
||||||
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
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
|
defp mastodonized_emoji do
|
||||||
Pleroma.Emoji.get_all()
|
Pleroma.Emoji.get_all()
|
||||||
|> Enum.map(fn {shortcode, %Pleroma.Emoji{file: relative_url, tags: tags}} ->
|
|> Enum.map(fn {shortcode, %Pleroma.Emoji{file: relative_url, tags: tags}} ->
|
||||||
|
|
35
lib/pleroma/web/mastodon_api/views/instance_view.ex
Normal file
35
lib/pleroma/web/mastodon_api/views/instance_view.ex
Normal file
|
@ -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)
|
post("/accounts", AccountController, :create)
|
||||||
|
|
||||||
get("/instance", MastodonAPIController, :masto_instance)
|
get("/instance", InstanceController, :show)
|
||||||
get("/instance/peers", MastodonAPIController, :peers)
|
get("/instance/peers", InstanceController, :peers)
|
||||||
|
|
||||||
post("/apps", AppController, :create)
|
post("/apps", AppController, :create)
|
||||||
get("/apps/verify_credentials", AppController, :verify_credentials)
|
get("/apps/verify_credentials", AppController, :verify_credentials)
|
||||||
|
|
||||||
get("/custom_emojis", MastodonAPIController, :custom_emojis)
|
get("/custom_emojis", MastodonAPIController, :custom_emojis)
|
||||||
|
|
||||||
get("/statuses/:id/card", StatusController, :card)
|
get("/statuses/:id/card", StatusController, :card)
|
||||||
|
|
||||||
get("/statuses/:id/favourited_by", StatusController, :favourited_by)
|
get("/statuses/:id/favourited_by", StatusController, :favourited_by)
|
||||||
get("/statuses/:id/reblogged_by", StatusController, :reblogged_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
|
defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
use Pleroma.Web.ConnCase
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
alias Ecto.Changeset
|
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
@ -114,80 +113,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
assert [] = json_response(third_conn, 200)
|
assert [] = json_response(third_conn, 200)
|
||||||
end
|
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
|
test "put settings", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue