Merge branch 'feld-mastoweb5000' into 'develop'
[akkoma] / lib / pleroma / web / mastodon_api / views / status_view.ex
index 5585a560572e582f7bb67483a7e3dd1ba7add741..55675ae1c38b624f71db2e4df5ee76b020a0a0b4 100644 (file)
@@ -3,6 +3,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
   alias Pleroma.Web.MastodonAPI.{AccountView, StatusView}
   alias Pleroma.{User, Activity}
   alias Pleroma.Web.CommonAPI.Utils
+  alias Pleroma.Web.MediaProxy
 
   def render("index.json", opts) do
     render_many(opts.activities, StatusView, "status.json", opts)
@@ -15,7 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     reblogged = Activity.get_create_activity_by_object_ap_id(object)
     reblogged = render("status.json", Map.put(opts, :activity, reblogged))
 
-    mentions = activity.data["to"]
+    mentions = activity.recipients
     |> 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)
@@ -57,9 +58,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     announcement_count = object["announcement_count"] || 0
 
     tags = object["tag"] || []
-    sensitive = Enum.member?(tags, "nsfw")
+    sensitive = object["sensitive"] || Enum.member?(tags, "nsfw")
 
-    mentions = activity.data["to"]
+    mentions = activity.recipients
     |> 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)
@@ -95,7 +96,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
       muted: false,
       sensitive: sensitive,
       spoiler_text: object["summary"] || "",
-      visibility: "public",
+      visibility: get_visibility(object),
       media_attachments: attachments |> Enum.take(4),
       mentions: mentions,
       tags: [], # fix,
@@ -108,6 +109,18 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     }
   end
 
+  def get_visibility(object) do
+    public = "https://www.w3.org/ns/activitystreams#Public"
+    to = object["to"] || []
+    cc = object["cc"] || []
+    cond do
+      public in to -> "public"
+      public in cc -> "unlisted"
+      Enum.any?(to, &(String.contains?(&1, "/followers"))) -> "private"
+      true -> "direct"
+    end
+  end
+
   def render("attachment.json", %{attachment: attachment}) do
     [%{"mediaType" => media_type, "href" => href} | _] = attachment["url"]
 
@@ -121,9 +134,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
 
     %{
       id: to_string(attachment["id"] || hash_id),
-      url: href,
+      url: MediaProxy.url(href),
       remote_url: href,
-      preview_url: href,
+      preview_url: MediaProxy.url(href),
       text_url: href,
       type: type
     }