Refactor conversation function in MastodonAPIController to use a View
authorRoman Chvanikov <chvanikoff@gmail.com>
Sun, 21 Apr 2019 16:14:27 +0000 (23:14 +0700)
committerRoman Chvanikov <chvanikoff@gmail.com>
Sun, 21 Apr 2019 16:14:27 +0000 (23:14 +0700)
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/conversation_view.ex [new file with mode: 0644]

index 86cacb0b059d2c71af9c73918c19d5f873607d84..d5b6a943f24bee28441d0ee5f89760c54e25e42b 100644 (file)
@@ -22,6 +22,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.AppView
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.AppView
+  alias Pleroma.Web.MastodonAPI.ConversationView
   alias Pleroma.Web.MastodonAPI.FilterView
   alias Pleroma.Web.MastodonAPI.ListView
   alias Pleroma.Web.MastodonAPI.MastodonAPI
   alias Pleroma.Web.MastodonAPI.FilterView
   alias Pleroma.Web.MastodonAPI.ListView
   alias Pleroma.Web.MastodonAPI.MastodonAPI
@@ -1590,22 +1591,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
 
     conversations =
       Enum.map(participations, fn participation ->
 
     conversations =
       Enum.map(participations, fn participation ->
-        activity = Activity.get_by_id_with_object(participation.last_activity_id)
-
-        last_status = StatusView.render("status.json", %{activity: activity, for: user})
-
-        accounts =
-          AccountView.render("accounts.json", %{
-            users: participation.conversation.users,
-            as: :user
-          })
-
-        %{
-          id: participation.id |> to_string(),
-          accounts: accounts,
-          unread: !participation.read,
-          last_status: last_status
-        }
+        ConversationView.render("participation.json", %{participation: participation, user: user})
       end)
 
     conn
       end)
 
     conn
@@ -1617,31 +1603,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     with %Participation{} = participation <-
            Repo.get_by(Participation, id: participation_id, user_id: user.id),
          {:ok, participation} <- Participation.mark_as_read(participation) do
     with %Participation{} = participation <-
            Repo.get_by(Participation, id: participation_id, user_id: user.id),
          {:ok, participation} <- Participation.mark_as_read(participation) do
-      participation = Repo.preload(participation, conversation: :users)
-
-      accounts =
-        AccountView.render("accounts.json", %{
-          users: participation.conversation.users,
-          as: :user
-        })
-
-      last_activity_id =
-        ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{
-          "user" => user,
-          "blocking_user" => user
-        })
-
-      activity = Activity.get_by_id_with_object(last_activity_id)
-
-      last_status = StatusView.render("status.json", %{activity: activity, for: user})
+      participation_view =
+        ConversationView.render("participation.json", %{participation: participation, user: user})
 
       conn
 
       conn
-      |> json(%{
-        id: participation.id,
-        accounts: accounts,
-        unread: !participation.read,
-        last_status: last_status
-      })
+      |> json(participation_view)
     end
   end
 
     end
   end
 
diff --git a/lib/pleroma/web/mastodon_api/views/conversation_view.ex b/lib/pleroma/web/mastodon_api/views/conversation_view.ex
new file mode 100644 (file)
index 0000000..d841a84
--- /dev/null
@@ -0,0 +1,38 @@
+defmodule Pleroma.Web.MastodonAPI.ConversationView do
+  use Pleroma.Web, :view
+
+  alias Pleroma.Activity
+  alias Pleroma.Repo
+  alias Pleroma.Web.ActivityPub.ActivityPub
+  alias Pleroma.Web.MastodonAPI.StatusView
+  alias Pleroma.Web.MastodonAPI.AccountView
+
+  def render("participation.json", %{participation: participation, user: user}) do
+    participation = Repo.preload(participation, conversation: :users)
+
+    last_activity_id =
+      with nil <- participation.last_activity_id do
+        ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{
+          "user" => user,
+          "blocking_user" => user
+        })
+      end
+
+    activity = Activity.get_by_id_with_object(last_activity_id)
+
+    last_status = StatusView.render("status.json", %{activity: activity, for: user})
+
+    accounts =
+      AccountView.render("accounts.json", %{
+        users: participation.conversation.users,
+        as: :user
+      })
+
+    %{
+      id: participation.id |> to_string(),
+      accounts: accounts,
+      unread: !participation.read,
+      last_status: last_status
+    }
+  end
+end