diff options
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/status_view.ex | 49 | ||||
| -rw-r--r-- | test/web/mastodon_api/status_view_test.exs | 53 | 
2 files changed, 102 insertions, 0 deletions
| 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 index 000000000..45e7d45f4 --- /dev/null +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -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 index 000000000..b8a96f71a --- /dev/null +++ b/test/web/mastodon_api/status_view_test.exs @@ -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 | 
