Extract instance actions from `MastodonAPIController` to `InstanceController`
authorEgor Kislitsyn <egor@kislitsyn.com>
Wed, 2 Oct 2019 07:13:52 +0000 (14:13 +0700)
committerEgor Kislitsyn <egor@kislitsyn.com>
Wed, 2 Oct 2019 07:13:52 +0000 (14:13 +0700)
lib/pleroma/web/mastodon_api/controllers/instance_controller.ex [new file with mode: 0644]
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/instance_view.ex [new file with mode: 0644]
lib/pleroma/web/router.ex
test/web/mastodon_api/controllers/instance_controller_test.exs [new file with mode: 0644]
test/web/mastodon_api/mastodon_api_controller_test.exs

diff --git a/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex b/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex
new file mode 100644 (file)
index 0000000..a55f60f
--- /dev/null
@@ -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
index 81a95bc4a01e3f2b067623858e9fda170f37310b..98dd9f375654f110117636ad4446fb17a3f21eb1 100644 (file)
@@ -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}} ->
diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex
new file mode 100644 (file)
index 0000000..c4866e5
--- /dev/null
@@ -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
index 50197899496a34120d5301d6696d4435ea649925..a355a14bdb79513b34d45971363f094e49812154 100644 (file)
@@ -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)
 
diff --git a/test/web/mastodon_api/controllers/instance_controller_test.exs b/test/web/mastodon_api/controllers/instance_controller_test.exs
new file mode 100644 (file)
index 0000000..f8049f8
--- /dev/null
@@ -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
index e642e3c1aaca045af2cb48ea1ab89b4a4a71c539..7a58b13dc2dedbd64f14d118fc77ed791dfc5346 100644 (file)
@@ -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)