|> Map.put("in_reply_to_status_id", params["in_reply_to_id"])
|> Map.put("no_attachment_links", true)
- {:ok, activity} = CommonAPI.post(user, params)
+ idempotency_key =
+ case get_req_header(conn, "idempotency-key") do
+ [key] -> key
+ _ -> Ecto.UUID.generate()
+ end
+
+ {:ok, activity} =
+ Cachex.get!(
+ :user_cache,
+ "idem:#{idempotency_key}",
+ fallback: fn _ -> CommonAPI.post(user, params) end
+ )
+
render(conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity})
end
test "posting a status", %{conn: conn} do
user = insert(:user)
- conn =
+ idempotency_key = "Pikachu rocks!"
+
+ conn_one =
conn
|> assign(:user, user)
+ |> put_req_header("idempotency-key", idempotency_key)
|> post("/api/v1/statuses", %{
"status" => "cofe",
"spoiler_text" => "2hu",
})
assert %{"content" => "cofe", "id" => id, "spoiler_text" => "2hu", "sensitive" => false} =
- json_response(conn, 200)
+ json_response(conn_one, 200)
assert Repo.get(Activity, id)
+
+ conn_two =
+ conn
+ |> assign(:user, user)
+ |> put_req_header("idempotency-key", idempotency_key)
+ |> post("/api/v1/statuses", %{
+ "status" => "cofe",
+ "spoiler_text" => "2hu",
+ "sensitive" => "false"
+ })
+
+ assert %{"id" => second_id} = json_response(conn_two, 200)
+
+ assert id == second_id
end
test "posting a sensitive status", %{conn: conn} do