Extract mascot actions from `MastodonAPIController` to MascotController
authorEgor Kislitsyn <egor@kislitsyn.com>
Mon, 30 Sep 2019 12:32:43 +0000 (19:32 +0700)
committerEgor Kislitsyn <egor@kislitsyn.com>
Mon, 30 Sep 2019 12:32:43 +0000 (19:32 +0700)
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex [new file with mode: 0644]
lib/pleroma/web/router.ex
test/web/mastodon_api/mastodon_api_controller_test.exs
test/web/pleroma_api/controllers/mascot_controller_test.exs [new file with mode: 0644]

index 30a2bf0e01ffe6610ee8524fa120f919925cedae..1484a017472d55432721a91b0f33d0cbbe2cf03e 100644 (file)
@@ -200,28 +200,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     end
   end
 
-  def set_mascot(%{assigns: %{user: user}} = conn, %{"file" => file}) do
-    with {:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)),
-         %{} = attachment_data <- Map.put(object.data, "id", object.id),
-         # Reject if not an image
-         %{type: "image"} = rendered <-
-           StatusView.render("attachment.json", %{attachment: attachment_data}) do
-      # Sure!
-      # Save to the user's info
-      {:ok, _user} = User.update_info(user, &User.Info.mascot_update(&1, rendered))
-
-      json(conn, rendered)
-    else
-      %{type: _} -> render_error(conn, :unsupported_media_type, "mascots can only be images")
-    end
-  end
-
-  def get_mascot(%{assigns: %{user: user}} = conn, _params) do
-    mascot = User.get_mascot(user)
-
-    json(conn, mascot)
-  end
-
   def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
     with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
          {_, true} <- {:followed, follower.id != followed.id},
diff --git a/lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex b/lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex
new file mode 100644 (file)
index 0000000..7f6a76c
--- /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.PleromaAPI.MascotController do
+  use Pleroma.Web, :controller
+
+  alias Pleroma.User
+  alias Pleroma.Web.ActivityPub.ActivityPub
+
+  @doc "GET /api/v1/pleroma/mascot"
+  def show(%{assigns: %{user: user}} = conn, _params) do
+    json(conn, User.get_mascot(user))
+  end
+
+  @doc "PUT /api/v1/pleroma/mascot"
+  def update(%{assigns: %{user: user}} = conn, %{"file" => file}) do
+    with {:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)),
+         # Reject if not an image
+         %{type: "image"} = attachment <- render_attachment(object) do
+      # Sure!
+      # Save to the user's info
+      {:ok, _user} = User.update_info(user, &User.Info.mascot_update(&1, attachment))
+
+      json(conn, attachment)
+    else
+      %{type: _} -> render_error(conn, :unsupported_media_type, "mascots can only be images")
+    end
+  end
+
+  defp render_attachment(object) do
+    attachment_data = Map.put(object.data, "id", object.id)
+    Pleroma.Web.MastodonAPI.StatusView.render("attachment.json", %{attachment: attachment_data})
+  end
+end
index f6c74896f3a31b8c7ac31ce699bf2bf00cdb54f2..eab55a27c09d06b2c5c2def59640773573bf84d6 100644 (file)
@@ -303,6 +303,10 @@ defmodule Pleroma.Web.Router do
       patch("/accounts/update_avatar", AccountController, :update_avatar)
       patch("/accounts/update_banner", AccountController, :update_banner)
       patch("/accounts/update_background", AccountController, :update_background)
+
+      get("/mascot", MascotController, :show)
+      put("/mascot", MascotController, :update)
+
       post("/scrobble", ScrobbleController, :new_scrobble)
     end
 
@@ -416,9 +420,6 @@ defmodule Pleroma.Web.Router do
       put("/filters/:id", FilterController, :update)
       delete("/filters/:id", FilterController, :delete)
 
-      get("/pleroma/mascot", MastodonAPIController, :get_mascot)
-      put("/pleroma/mascot", MastodonAPIController, :set_mascot)
-
       post("/reports", ReportController, :create)
     end
 
index f2f8c05789950e4b492110b1ee4e387cf2a98895..feeaf079bb09be9a1ff27b824b435e2aff02198f 100644 (file)
@@ -114,74 +114,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
   end
 
-  describe "/api/v1/pleroma/mascot" do
-    test "mascot upload", %{conn: conn} do
-      user = insert(:user)
-
-      non_image_file = %Plug.Upload{
-        content_type: "audio/mpeg",
-        path: Path.absname("test/fixtures/sound.mp3"),
-        filename: "sound.mp3"
-      }
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> put("/api/v1/pleroma/mascot", %{"file" => non_image_file})
-
-      assert json_response(conn, 415)
-
-      file = %Plug.Upload{
-        content_type: "image/jpg",
-        path: Path.absname("test/fixtures/image.jpg"),
-        filename: "an_image.jpg"
-      }
-
-      conn =
-        build_conn()
-        |> assign(:user, user)
-        |> put("/api/v1/pleroma/mascot", %{"file" => file})
-
-      assert %{"id" => _, "type" => image} = json_response(conn, 200)
-    end
-
-    test "mascot retrieving", %{conn: conn} do
-      user = insert(:user)
-      # When user hasn't set a mascot, we should just get pleroma tan back
-      conn =
-        conn
-        |> assign(:user, user)
-        |> get("/api/v1/pleroma/mascot")
-
-      assert %{"url" => url} = json_response(conn, 200)
-      assert url =~ "pleroma-fox-tan-smol"
-
-      # When a user sets their mascot, we should get that back
-      file = %Plug.Upload{
-        content_type: "image/jpg",
-        path: Path.absname("test/fixtures/image.jpg"),
-        filename: "an_image.jpg"
-      }
-
-      conn =
-        build_conn()
-        |> assign(:user, user)
-        |> put("/api/v1/pleroma/mascot", %{"file" => file})
-
-      assert json_response(conn, 200)
-
-      user = User.get_cached_by_id(user.id)
-
-      conn =
-        build_conn()
-        |> assign(:user, user)
-        |> get("/api/v1/pleroma/mascot")
-
-      assert %{"url" => url, "type" => "image"} = json_response(conn, 200)
-      assert url =~ "an_image"
-    end
-  end
-
   test "getting a list of mutes", %{conn: conn} do
     user = insert(:user)
     other_user = insert(:user)
diff --git a/test/web/pleroma_api/controllers/mascot_controller_test.exs b/test/web/pleroma_api/controllers/mascot_controller_test.exs
new file mode 100644 (file)
index 0000000..ae9539b
--- /dev/null
@@ -0,0 +1,77 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.PleromaAPI.MascotControllerTest do
+  use Pleroma.Web.ConnCase
+
+  alias Pleroma.User
+
+  import Pleroma.Factory
+
+  test "mascot upload", %{conn: conn} do
+    user = insert(:user)
+
+    non_image_file = %Plug.Upload{
+      content_type: "audio/mpeg",
+      path: Path.absname("test/fixtures/sound.mp3"),
+      filename: "sound.mp3"
+    }
+
+    conn =
+      conn
+      |> assign(:user, user)
+      |> put("/api/v1/pleroma/mascot", %{"file" => non_image_file})
+
+    assert json_response(conn, 415)
+
+    file = %Plug.Upload{
+      content_type: "image/jpg",
+      path: Path.absname("test/fixtures/image.jpg"),
+      filename: "an_image.jpg"
+    }
+
+    conn =
+      build_conn()
+      |> assign(:user, user)
+      |> put("/api/v1/pleroma/mascot", %{"file" => file})
+
+    assert %{"id" => _, "type" => image} = json_response(conn, 200)
+  end
+
+  test "mascot retrieving", %{conn: conn} do
+    user = insert(:user)
+    # When user hasn't set a mascot, we should just get pleroma tan back
+    conn =
+      conn
+      |> assign(:user, user)
+      |> get("/api/v1/pleroma/mascot")
+
+    assert %{"url" => url} = json_response(conn, 200)
+    assert url =~ "pleroma-fox-tan-smol"
+
+    # When a user sets their mascot, we should get that back
+    file = %Plug.Upload{
+      content_type: "image/jpg",
+      path: Path.absname("test/fixtures/image.jpg"),
+      filename: "an_image.jpg"
+    }
+
+    conn =
+      build_conn()
+      |> assign(:user, user)
+      |> put("/api/v1/pleroma/mascot", %{"file" => file})
+
+    assert json_response(conn, 200)
+
+    user = User.get_cached_by_id(user.id)
+
+    conn =
+      build_conn()
+      |> assign(:user, user)
+      |> get("/api/v1/pleroma/mascot")
+
+    assert %{"url" => url, "type" => "image"} = json_response(conn, 200)
+    assert url =~ "an_image"
+  end
+end