Add MastoFEController
authorEgor Kislitsyn <egor@kislitsyn.com>
Wed, 2 Oct 2019 13:05:14 +0000 (20:05 +0700)
committerEgor Kislitsyn <egor@kislitsyn.com>
Wed, 2 Oct 2019 13:36:08 +0000 (20:36 +0700)
lib/pleroma/web/masto_fe_controller.ex [new file with mode: 0644]
lib/pleroma/web/mastodon_api/controllers/auth_controller.ex
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/mastodon_view.ex [deleted file]
lib/pleroma/web/router.ex
lib/pleroma/web/templates/masto_fe/index.html.eex [moved from lib/pleroma/web/templates/mastodon_api/mastodon/index.html.eex with 91% similarity]
lib/pleroma/web/views/masto_fe_view.ex [new file with mode: 0644]
test/web/masto_fe_controller_test.exs [new file with mode: 0644]
test/web/mastodon_api/mastodon_api_controller_test.exs

diff --git a/lib/pleroma/web/masto_fe_controller.ex b/lib/pleroma/web/masto_fe_controller.ex
new file mode 100644 (file)
index 0000000..ac9af75
--- /dev/null
@@ -0,0 +1,36 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastoFEController do
+  use Pleroma.Web, :controller
+
+  alias Pleroma.User
+
+  @doc "GET /web/*path"
+  def index(%{assigns: %{user: user}} = conn, _params) do
+    token = get_session(conn, :oauth_token)
+
+    if user && token do
+      conn
+      |> put_layout(false)
+      |> render("index.html", token: token, user: user, custom_emojis: Pleroma.Emoji.get_all())
+    else
+      conn
+      |> put_session(:return_to, conn.request_path)
+      |> redirect(to: "/web/login")
+    end
+  end
+
+  @doc "PUT /api/web/settings"
+  def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do
+    with {:ok, _} <- User.update_info(user, &User.Info.mastodon_settings_update(&1, settings)) do
+      json(conn, %{})
+    else
+      e ->
+        conn
+        |> put_status(:internal_server_error)
+        |> json(%{error: inspect(e)})
+    end
+  end
+end
index 0dee670af7a346f4219fcc9b0ae77886badc9d15..bfd5120ba4bfb2ffa38cf2827c3ade35d5cced20 100644 (file)
@@ -75,7 +75,7 @@ defmodule Pleroma.Web.MastodonAPI.AuthController do
   defp local_mastodon_root_path(conn) do
     case get_session(conn, :return_to) do
       nil ->
-        mastodon_api_path(conn, :index, ["getting-started"])
+        masto_fe_path(conn, :index, ["getting-started"])
 
       return_to ->
         delete_session(conn, :return_to)
index a66335c0227f841499703d12c03dcc59986ccce2..e92f5d08935424f56826e280fa5fd5e601a944b4 100644 (file)
@@ -8,13 +8,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
 
   alias Pleroma.Bookmark
-  alias Pleroma.Config
   alias Pleroma.Pagination
   alias Pleroma.User
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.MastodonAPI.AccountView
-  alias Pleroma.Web.MastodonAPI.MastodonView
   alias Pleroma.Web.MastodonAPI.StatusView
 
   require Logger
@@ -87,124 +85,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     |> render("index.json", %{activities: activities, for: user, as: :activity})
   end
 
-  def index(%{assigns: %{user: user}} = conn, _params) do
-    token = get_session(conn, :oauth_token)
-
-    if user && token do
-      mastodon_emoji =
-        Pleroma.Web.MastodonAPI.CustomEmojiView.render("index.json", %{
-          custom_emojis: Pleroma.Emoji.get_all()
-        })
-
-      limit = Config.get([:instance, :limit])
-
-      accounts = Map.put(%{}, user.id, AccountView.render("show.json", %{user: user, for: user}))
-
-      initial_state =
-        %{
-          meta: %{
-            streaming_api_base_url: Pleroma.Web.Endpoint.websocket_url(),
-            access_token: token,
-            locale: "en",
-            domain: Pleroma.Web.Endpoint.host(),
-            admin: "1",
-            me: "#{user.id}",
-            unfollow_modal: false,
-            boost_modal: false,
-            delete_modal: true,
-            auto_play_gif: false,
-            display_sensitive_media: false,
-            reduce_motion: false,
-            max_toot_chars: limit,
-            mascot: User.get_mascot(user)["url"]
-          },
-          poll_limits: Config.get([:instance, :poll_limits]),
-          rights: %{
-            delete_others_notice: present?(user.info.is_moderator),
-            admin: present?(user.info.is_admin)
-          },
-          compose: %{
-            me: "#{user.id}",
-            default_privacy: user.info.default_scope,
-            default_sensitive: false,
-            allow_content_types: Config.get([:instance, :allowed_post_formats])
-          },
-          media_attachments: %{
-            accept_content_types: [
-              ".jpg",
-              ".jpeg",
-              ".png",
-              ".gif",
-              ".webm",
-              ".mp4",
-              ".m4v",
-              "image\/jpeg",
-              "image\/png",
-              "image\/gif",
-              "video\/webm",
-              "video\/mp4"
-            ]
-          },
-          settings:
-            user.info.settings ||
-              %{
-                onboarded: true,
-                home: %{
-                  shows: %{
-                    reblog: true,
-                    reply: true
-                  }
-                },
-                notifications: %{
-                  alerts: %{
-                    follow: true,
-                    favourite: true,
-                    reblog: true,
-                    mention: true
-                  },
-                  shows: %{
-                    follow: true,
-                    favourite: true,
-                    reblog: true,
-                    mention: true
-                  },
-                  sounds: %{
-                    follow: true,
-                    favourite: true,
-                    reblog: true,
-                    mention: true
-                  }
-                }
-              },
-          push_subscription: nil,
-          accounts: accounts,
-          custom_emojis: mastodon_emoji,
-          char_limit: limit
-        }
-        |> Jason.encode!()
-
-      conn
-      |> put_layout(false)
-      |> put_view(MastodonView)
-      |> render("index.html", %{initial_state: initial_state})
-    else
-      conn
-      |> put_session(:return_to, conn.request_path)
-      |> redirect(to: "/web/login")
-    end
-  end
-
-  def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do
-    with {:ok, _} <- User.update_info(user, &User.Info.mastodon_settings_update(&1, settings)) do
-      json(conn, %{})
-    else
-      e ->
-        conn
-        |> put_status(:internal_server_error)
-        |> json(%{error: inspect(e)})
-    end
-  end
-
   # Stubs for unimplemented mastodon api
   #
   def empty_array(conn, _) do
@@ -216,8 +96,4 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     Logger.debug("Unimplemented, returning an empty object")
     json(conn, %{})
   end
-
-  defp present?(nil), do: false
-  defp present?(false), do: false
-  defp present?(_), do: true
 end
diff --git a/lib/pleroma/web/mastodon_api/views/mastodon_view.ex b/lib/pleroma/web/mastodon_api/views/mastodon_view.ex
deleted file mode 100644 (file)
index 33b9a74..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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.MastodonView do
-  use Pleroma.Web, :view
-  import Phoenix.HTML
-end
index 5d14c7742966a9f3379a6c4af7a7ffde5f8cf99d..f91af81370390dc4ec6d3f180fae08107acd043c 100644 (file)
@@ -451,10 +451,10 @@ defmodule Pleroma.Web.Router do
     end
   end
 
-  scope "/api/web", Pleroma.Web.MastodonAPI do
+  scope "/api/web", Pleroma.Web do
     pipe_through([:authenticated_api, :oauth_write])
 
-    put("/settings", MastodonAPIController, :put_settings)
+    put("/settings", MastoFEController, :put_settings)
   end
 
   scope "/api/v1", Pleroma.Web.MastodonAPI do
@@ -658,17 +658,17 @@ defmodule Pleroma.Web.Router do
     get("/:version", Nodeinfo.NodeinfoController, :nodeinfo)
   end
 
-  scope "/", Pleroma.Web.MastodonAPI do
+  scope "/", Pleroma.Web do
     pipe_through(:mastodon_html)
 
-    get("/web/login", AuthController, :login)
-    delete("/auth/sign_out", AuthController, :logout)
+    get("/web/login", MastodonAPI.AuthController, :login)
+    delete("/auth/sign_out", MastodonAPI.AuthController, :logout)
 
-    post("/auth/password", AuthController, :password_reset)
+    post("/auth/password", MastodonAPI.AuthController, :password_reset)
 
     scope [] do
       pipe_through(:oauth_read)
-      get("/web/*path", MastodonAPIController, :index)
+      get("/web/*path", MastoFEController, :index)
     end
   end
 
similarity index 91%
rename from lib/pleroma/web/templates/mastodon_api/mastodon/index.html.eex
rename to lib/pleroma/web/templates/masto_fe/index.html.eex
index 3325beca149d532eb738cb7eadd6bd92ff781c9d..feff36fae528efbad0f55d840a58eb81ac4c71b1 100644 (file)
@@ -14,7 +14,7 @@
 <link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/compose.js'>
 <link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/home_timeline.js'>
 <link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/notifications.js'>
-<script id='initial-state' type='application/json'><%= raw @initial_state %></script>
+<script id='initial-state' type='application/json'><%= initial_state(@token, @user, @custom_emojis) %></script>
 
 <script src="/packs/core/common.js"></script>
 <link rel="stylesheet" media="all" href="/packs/core/common.css" />
diff --git a/lib/pleroma/web/views/masto_fe_view.ex b/lib/pleroma/web/views/masto_fe_view.ex
new file mode 100644 (file)
index 0000000..21b086d
--- /dev/null
@@ -0,0 +1,102 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastoFEView do
+  use Pleroma.Web, :view
+  alias Pleroma.Config
+  alias Pleroma.User
+  alias Pleroma.Web.MastodonAPI.AccountView
+  alias Pleroma.Web.MastodonAPI.CustomEmojiView
+
+  @default_settings %{
+    onboarded: true,
+    home: %{
+      shows: %{
+        reblog: true,
+        reply: true
+      }
+    },
+    notifications: %{
+      alerts: %{
+        follow: true,
+        favourite: true,
+        reblog: true,
+        mention: true
+      },
+      shows: %{
+        follow: true,
+        favourite: true,
+        reblog: true,
+        mention: true
+      },
+      sounds: %{
+        follow: true,
+        favourite: true,
+        reblog: true,
+        mention: true
+      }
+    }
+  }
+
+  def initial_state(token, user, custom_emojis) do
+    limit = Config.get([:instance, :limit])
+
+    %{
+      meta: %{
+        streaming_api_base_url: Pleroma.Web.Endpoint.websocket_url(),
+        access_token: token,
+        locale: "en",
+        domain: Pleroma.Web.Endpoint.host(),
+        admin: "1",
+        me: "#{user.id}",
+        unfollow_modal: false,
+        boost_modal: false,
+        delete_modal: true,
+        auto_play_gif: false,
+        display_sensitive_media: false,
+        reduce_motion: false,
+        max_toot_chars: limit,
+        mascot: User.get_mascot(user)["url"]
+      },
+      poll_limits: Config.get([:instance, :poll_limits]),
+      rights: %{
+        delete_others_notice: present?(user.info.is_moderator),
+        admin: present?(user.info.is_admin)
+      },
+      compose: %{
+        me: "#{user.id}",
+        default_privacy: user.info.default_scope,
+        default_sensitive: false,
+        allow_content_types: Config.get([:instance, :allowed_post_formats])
+      },
+      media_attachments: %{
+        accept_content_types: [
+          ".jpg",
+          ".jpeg",
+          ".png",
+          ".gif",
+          ".webm",
+          ".mp4",
+          ".m4v",
+          "image\/jpeg",
+          "image\/png",
+          "image\/gif",
+          "video\/webm",
+          "video\/mp4"
+        ]
+      },
+      settings: user.info.settings || @default_settings,
+      push_subscription: nil,
+      accounts: %{user.id => render(AccountView, "show.json", user: user, for: user)},
+      custom_emojis: render(CustomEmojiView, "index.json", custom_emojis: custom_emojis),
+      char_limit: limit
+    }
+    |> Jason.encode!()
+    |> Phoenix.HTML.raw()
+  end
+
+  defp present?(nil), do: false
+  defp present?(false), do: false
+  defp present?(_), do: true
+end
diff --git a/test/web/masto_fe_controller_test.exs b/test/web/masto_fe_controller_test.exs
new file mode 100644 (file)
index 0000000..04f1440
--- /dev/null
@@ -0,0 +1,83 @@
+# 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.MastoFEController do
+  use Pleroma.Web.ConnCase
+
+  alias Pleroma.User
+  alias Pleroma.Config
+  import Pleroma.Factory
+
+  clear_config([:instance, :public])
+
+  test "put settings", %{conn: conn} do
+    user = insert(:user)
+
+    conn =
+      conn
+      |> assign(:user, user)
+      |> put("/api/web/settings", %{"data" => %{"programming" => "socks"}})
+
+    assert _result = json_response(conn, 200)
+
+    user = User.get_cached_by_ap_id(user.ap_id)
+    assert user.info.settings == %{"programming" => "socks"}
+  end
+
+  describe "index/2 redirections" do
+    setup %{conn: conn} do
+      session_opts = [
+        store: :cookie,
+        key: "_test",
+        signing_salt: "cooldude"
+      ]
+
+      conn =
+        conn
+        |> Plug.Session.call(Plug.Session.init(session_opts))
+        |> fetch_session()
+
+      test_path = "/web/statuses/test"
+      %{conn: conn, path: test_path}
+    end
+
+    test "redirects not logged-in users to the login page", %{conn: conn, path: path} do
+      conn = get(conn, path)
+
+      assert conn.status == 302
+      assert redirected_to(conn) == "/web/login"
+    end
+
+    test "redirects not logged-in users to the login page on private instances", %{
+      conn: conn,
+      path: path
+    } do
+      Config.put([:instance, :public], false)
+
+      conn = get(conn, path)
+
+      assert conn.status == 302
+      assert redirected_to(conn) == "/web/login"
+    end
+
+    test "does not redirect logged in users to the login page", %{conn: conn, path: path} do
+      token = insert(:oauth_token)
+
+      conn =
+        conn
+        |> assign(:user, token.user)
+        |> put_session(:oauth_token, token.token)
+        |> get(path)
+
+      assert conn.status == 200
+    end
+
+    test "saves referer path to session", %{conn: conn, path: path} do
+      conn = get(conn, path)
+      return_to = Plug.Conn.get_session(conn, :return_to)
+
+      assert return_to == path
+    end
+  end
+end
index e8fd4827cdac86e096e1ae5f8660e40aadd3bc28..c03003dac461c0f9123868179ce7f6483a7a2346 100644 (file)
@@ -5,7 +5,6 @@
 defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
   use Pleroma.Web.ConnCase
 
-  alias Pleroma.Config
   alias Pleroma.Notification
   alias Pleroma.Repo
   alias Pleroma.User
@@ -19,7 +18,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     :ok
   end
 
-  clear_config([:instance, :public])
   clear_config([:rich_media, :enabled])
 
   test "getting a list of mutes", %{conn: conn} do
@@ -113,20 +111,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     assert [] = json_response(third_conn, 200)
   end
 
-  test "put settings", %{conn: conn} do
-    user = insert(:user)
-
-    conn =
-      conn
-      |> assign(:user, user)
-      |> put("/api/web/settings", %{"data" => %{"programming" => "socks"}})
-
-    assert _result = json_response(conn, 200)
-
-    user = User.get_cached_by_ap_id(user.ap_id)
-    assert user.info.settings == %{"programming" => "socks"}
-  end
-
   describe "link headers" do
     test "preserves parameters in link headers", %{conn: conn} do
       user = insert(:user)
@@ -159,62 +143,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
   end
 
-  describe "index/2 redirections" do
-    setup %{conn: conn} do
-      session_opts = [
-        store: :cookie,
-        key: "_test",
-        signing_salt: "cooldude"
-      ]
-
-      conn =
-        conn
-        |> Plug.Session.call(Plug.Session.init(session_opts))
-        |> fetch_session()
-
-      test_path = "/web/statuses/test"
-      %{conn: conn, path: test_path}
-    end
-
-    test "redirects not logged-in users to the login page", %{conn: conn, path: path} do
-      conn = get(conn, path)
-
-      assert conn.status == 302
-      assert redirected_to(conn) == "/web/login"
-    end
-
-    test "redirects not logged-in users to the login page on private instances", %{
-      conn: conn,
-      path: path
-    } do
-      Config.put([:instance, :public], false)
-
-      conn = get(conn, path)
-
-      assert conn.status == 302
-      assert redirected_to(conn) == "/web/login"
-    end
-
-    test "does not redirect logged in users to the login page", %{conn: conn, path: path} do
-      token = insert(:oauth_token)
-
-      conn =
-        conn
-        |> assign(:user, token.user)
-        |> put_session(:oauth_token, token.token)
-        |> get(path)
-
-      assert conn.status == 200
-    end
-
-    test "saves referer path to session", %{conn: conn, path: path} do
-      conn = get(conn, path)
-      return_to = Plug.Conn.get_session(conn, :return_to)
-
-      assert return_to == path
-    end
-  end
-
   describe "empty_array, stubs for mastodon api" do
     test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do
       user = insert(:user)