Parcourir la source

Merge branch 'split-masto-api/instance' into 'develop'

Extract instance actions from `MastodonAPIController` to `InstanceController`

See merge request pleroma/pleroma!1760
object-id-column
kaniini il y a 4 ans
Parent
révision
433f2c0f68
6 fichiers modifiés avec 140 ajouts et 113 suppressions
  1. +17
    -0
      lib/pleroma/web/mastodon_api/controllers/instance_controller.ex
  2. +0
    -35
      lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
  3. +35
    -0
      lib/pleroma/web/mastodon_api/views/instance_view.ex
  4. +4
    -3
      lib/pleroma/web/router.ex
  5. +84
    -0
      test/web/mastodon_api/controllers/instance_controller_test.exs
  6. +0
    -75
      test/web/mastodon_api/mastodon_api_controller_test.exs

+ 17
- 0
lib/pleroma/web/mastodon_api/controllers/instance_controller.ex Voir le fichier

@@ -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

+ 0
- 35
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex Voir le fichier

@@ -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}} ->


+ 35
- 0
lib/pleroma/web/mastodon_api/views/instance_view.ex Voir le fichier

@@ -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

+ 4
- 3
lib/pleroma/web/router.ex Voir le fichier

@@ -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)



+ 84
- 0
test/web/mastodon_api/controllers/instance_controller_test.exs Voir le fichier

@@ -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

+ 0
- 75
test/web/mastodon_api/mastodon_api_controller_test.exs Voir le fichier

@@ -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)



Chargement…
Annuler
Enregistrer