Use actual ISO8601 timestamps for masto API (#425)
[akkoma] / lib / pleroma / web / common_api / utils.ex
index 22594be4605f24fb81b3166f1b002e9aa1df4c15..345c5d10d2a15ecb9b59ffb577b900c5a13c20cd 100644 (file)
@@ -230,12 +230,13 @@ defmodule Pleroma.Web.CommonAPI.Utils do
     end
   end
 
-  def make_context(_, %Participation{} = participation) do
+  def make_context(%{in_reply_to_conversation: %Participation{} = participation}) do
     Repo.preload(participation, :conversation).conversation.ap_id
   end
 
-  def make_context(%Activity{data: %{"context" => context}}, _), do: context
-  def make_context(_, _), do: Utils.generate_context_id()
+  def make_context(%{in_reply_to: %Activity{data: %{"context" => context}}}), do: context
+  def make_context(%{quote: %Activity{data: %{"context" => context}}}), do: context
+  def make_context(_), do: Utils.generate_context_id()
 
   def maybe_add_attachments(parsed, _attachments, false = _no_links), do: parsed
 
@@ -327,20 +328,27 @@ defmodule Pleroma.Web.CommonAPI.Utils do
   end
 
   def to_masto_date(%NaiveDateTime{} = date) do
-    date
-    |> NaiveDateTime.to_iso8601()
-    |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
+    # NOTE: Elixir’s ISO 8601 format is a superset of the real standard
+    # It supports negative years for example.
+    # ISO8601 only supports years before 1583 with mutual agreement
+    if date.year < 1583 do
+      "1970-01-01T00:00:00Z"
+    else
+      date
+      |> NaiveDateTime.to_iso8601()
+      |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
+    end
   end
 
   def to_masto_date(date) when is_binary(date) do
     with {:ok, date} <- NaiveDateTime.from_iso8601(date) do
       to_masto_date(date)
     else
-      _ -> ""
+      _ -> "1970-01-01T00:00:00Z"
     end
   end
 
-  def to_masto_date(_), do: ""
+  def to_masto_date(_), do: "1970-01-01T00:00:00Z"
 
   defp shortname(name) do
     with max_length when max_length > 0 <-