Add Mastodon StatusView.
authorRoger Braun <roger@rogerbraun.net>
Sat, 9 Sep 2017 10:10:29 +0000 (12:10 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sat, 9 Sep 2017 10:10:29 +0000 (12:10 +0200)
lib/pleroma/web/mastodon_api/views/status_view.ex [new file with mode: 0644]
test/web/mastodon_api/status_view_test.exs [new file with mode: 0644]

diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
new file mode 100644 (file)
index 0000000..45e7d45
--- /dev/null
@@ -0,0 +1,49 @@
+defmodule Pleroma.Web.MastodonAPI.StatusView do
+  use Pleroma.Web, :view
+  alias Pleroma.Web.MastodonAPI.{AccountView, StatusView}
+  alias Pleroma.User
+
+  def render("index.json", opts) do
+    render_many(opts.activities, StatusView, "status.json", opts)
+  end
+
+  def render("status.json", %{activity: %{data: %{"object" => object}} = activity}) do
+    user = User.get_cached_by_ap_id(activity.data["actor"])
+
+    like_count = object["like_count"] || 0
+    announcement_count = object["announcement_count"] || 0
+
+    tags = object["tag"] || []
+    sensitive = Enum.member?(tags, "nsfw")
+
+    mentions = activity.data["to"]
+    |> Enum.map(fn (ap_id) -> User.get_cached_by_ap_id(ap_id) end)
+    |> Enum.filter(&(&1))
+    |> Enum.map(fn (user) -> AccountView.render("mention.json", %{user: user}) end)
+
+    %{
+      id: activity.id,
+      uri: object["id"],
+      url: object["external_url"],
+      account: AccountView.render("account.json", %{user: user}),
+      in_reply_to_id: object["inReplyToStatusId"],
+      in_reply_to_account_id: nil,
+      reblog: nil,
+      content: HtmlSanitizeEx.basic_html(object["content"]),
+      created_at: object["published"],
+      reblogs_count: announcement_count,
+      favourites_count: like_count,
+      reblogged: false,
+      favourited: false, # fix
+      muted: false,
+      sensitive: sensitive,
+      spoiler_text: "",
+      visibility: "public",
+      media_attachments: [], # fix
+      mentions: mentions,
+      tags: [], # fix,
+      application: nil,
+      language: nil
+    }
+  end
+end
diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs
new file mode 100644 (file)
index 0000000..b8a96f7
--- /dev/null
@@ -0,0 +1,53 @@
+defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
+  use Pleroma.DataCase
+
+  alias Pleroma.Web.MastodonAPI.{StatusView, AccountView}
+  alias Pleroma.User
+  alias Pleroma.Web.OStatus
+  import Pleroma.Factory
+
+  test "a note activity" do
+    note = insert(:note_activity)
+    user = User.get_cached_by_ap_id(note.data["actor"])
+
+    status = StatusView.render("status.json", %{activity: note})
+
+    expected = %{
+      id: note.id,
+      uri: note.data["object"]["id"],
+      url: note.data["object"]["external_id"],
+      account: AccountView.render("account.json", %{user: user}),
+      in_reply_to_id: nil,
+      in_reply_to_account_id: nil,
+      reblog: nil,
+      content: HtmlSanitizeEx.basic_html(note.data["object"]["content"]),
+      created_at: note.data["object"]["published"],
+      reblogs_count: 0,
+      favourites_count: 0,
+      reblogged: false,
+      favourited: false,
+      muted: false,
+      sensitive: false,
+      spoiler_text: "",
+      visibility: "public",
+      media_attachments: [],
+      mentions: [],
+      tags: [],
+      application: nil,
+      language: nil
+    }
+
+    assert status == expected
+  end
+
+  test "contains mentions" do
+    incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml")
+    user = insert(:user, %{ap_id: "https://pleroma.soykaf.com/users/lain"})
+
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    status = StatusView.render("status.json", %{activity: activity})
+
+    assert status.mentions == [AccountView.render("mention.json", %{user: user})]
+  end
+end