From c464355d1ac7f9558aa50f7038035b9a47614822 Mon Sep 17 00:00:00 2001
From: lain <lain@soykaf.club>
Date: Sat, 5 May 2018 11:15:57 +0200
Subject: [PATCH] Idempotency: Use special cache, keep for 6 hours.

---
 lib/pleroma/application.ex                    | 12 ++++++++++++
 .../mastodon_api/mastodon_api_controller.ex   |  6 ++----
 .../mastodon_api_controller_test.exs          | 19 ++++++++++++++++---
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 89826f515..e1e3bcd63 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -23,6 +23,18 @@ def start(_type, _args) do
             limit: 2500
           ]
         ]),
+        worker(
+          Cachex,
+          [
+            :idempotency_cache,
+            [
+              default_ttl: :timer.seconds(6 * 60 * 60),
+              ttl_interval: :timer.seconds(60),
+              limit: 2500
+            ]
+          ],
+          id: :cachex_idem
+        ),
         worker(Pleroma.Web.Federator, []),
         worker(Pleroma.Gopher.Server, []),
         worker(Pleroma.Stats, [])
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index bbd16482a..2b4e9e72b 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -283,13 +283,11 @@ def post_status(%{assigns: %{user: user}} = conn, %{"status" => _} = params) do
 
     {:ok, activity} =
       Cachex.get!(
-        :user_cache,
-        "idem:#{idempotency_key}",
+        :idempotency_cache,
+        idempotency_key,
         fallback: fn _ -> CommonAPI.post(user, params) end
       )
 
-    Cachex.expire(:user_cache, "idem:#{idempotency_key}", :timer.seconds(5 * 60))
-
     render(conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity})
   end
 
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index 69a0299ac..883ebc61e 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -75,9 +75,9 @@ test "posting a status", %{conn: conn} do
         "sensitive" => "false"
       })
 
-    {:ok, ttl} = Cachex.ttl(:user_cache, "idem:#{idempotency_key}")
-    # 5 Minutes
-    assert ttl > :timer.seconds(5 * 60 - 1)
+    {:ok, ttl} = Cachex.ttl(:idempotency_cache, idempotency_key)
+    # Six hours
+    assert ttl > :timer.seconds(6 * 60 * 60 - 1)
 
     assert %{"content" => "cofe", "id" => id, "spoiler_text" => "2hu", "sensitive" => false} =
              json_response(conn_one, 200)
@@ -97,6 +97,19 @@ test "posting a status", %{conn: conn} do
     assert %{"id" => second_id} = json_response(conn_two, 200)
 
     assert id == second_id
+
+    conn_three =
+      conn
+      |> assign(:user, user)
+      |> post("/api/v1/statuses", %{
+        "status" => "cofe",
+        "spoiler_text" => "2hu",
+        "sensitive" => "false"
+      })
+
+    assert %{"id" => third_id} = json_response(conn_three, 200)
+
+    refute id == third_id
   end
 
   test "posting a sensitive status", %{conn: conn} do