From 2981821db834448bf9b2ba26590314e36201664c Mon Sep 17 00:00:00 2001
From: Mike Verdone <spiral@arcseconds.net>
Date: Wed, 24 Jul 2019 16:51:09 +0200
Subject: [PATCH] squash! Expose expires_at datetime in mastoAPI only for the
 activity actor

NOTE: rewrite the commit msg
---
 docs/api/differences_in_mastoapi_responses.md          |  2 +-
 lib/pleroma/web/mastodon_api/views/status_view.ex      | 10 +++++++---
 test/web/mastodon_api/mastodon_api_controller_test.exs |  2 +-
 test/web/mastodon_api/status_view_test.exs             |  2 +-
 4 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/docs/api/differences_in_mastoapi_responses.md b/docs/api/differences_in_mastoapi_responses.md
index 168a13f4e..829468b13 100644
--- a/docs/api/differences_in_mastoapi_responses.md
+++ b/docs/api/differences_in_mastoapi_responses.md
@@ -25,7 +25,7 @@ Has these additional fields under the `pleroma` object:
 - `in_reply_to_account_acct`: the `acct` property of User entity for replied user (if any)
 - `content`: a map consisting of alternate representations of the `content` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`
 - `spoiler_text`: a map consisting of alternate representations of the `spoiler_text` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`
-- `expires_on`: a datetime (iso8601) that states when the post will expire (be deleted automatically), or empty if the post won't expire
+- `expires_in`:  the number of minutes until a post will expire (be deleted automatically), or empty if the post won't expire
 
 ## Attachments
 
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 7264dcafb..4a3686d72 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -168,11 +168,15 @@ def render("status.json", %{activity: %{data: %{"object" => _object}} = activity
 
     client_posted_this_activity = opts[:for] && user.id == opts[:for].id
 
-    expires_at =
+    expires_in =
       with true <- client_posted_this_activity,
            expiration when not is_nil(expiration) <-
              ActivityExpiration.get_by_activity_id(activity.id) do
-        expiration.scheduled_at
+        expires_in_seconds =
+          expiration.scheduled_at
+          |> NaiveDateTime.diff(NaiveDateTime.utc_now(), :second)
+
+        round(expires_in_seconds / 60)
       end
 
     thread_muted? =
@@ -273,7 +277,7 @@ def render("status.json", %{activity: %{data: %{"object" => _object}} = activity
         in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
         content: %{"text/plain" => content_plaintext},
         spoiler_text: %{"text/plain" => summary_plaintext},
-        expires_at: expires_at
+        expires_in: expires_in
       }
     }
   end
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index e59908979..a9d38c06e 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -170,7 +170,7 @@ test "posting a status", %{conn: conn} do
       assert activity = Activity.get_by_id(fourth_id)
       assert expiration = ActivityExpiration.get_by_activity_id(fourth_id)
       assert expiration.scheduled_at == expires_at
-      assert fourth_response["pleroma"]["expires_at"] == NaiveDateTime.to_iso8601(expires_at)
+      assert fourth_response["pleroma"]["expires_in"] > 0
     end
 
     test "replying to a status", %{conn: conn} do
diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs
index 073c69659..eb0874ab2 100644
--- a/test/web/mastodon_api/status_view_test.exs
+++ b/test/web/mastodon_api/status_view_test.exs
@@ -134,7 +134,7 @@ test "a note activity" do
         in_reply_to_account_acct: nil,
         content: %{"text/plain" => HtmlSanitizeEx.strip_tags(object_data["content"])},
         spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(object_data["summary"])},
-        expires_at: nil
+        expires_in: nil
       }
     }