Merge branch 'following-relationships-optimizations' into 'develop'
[akkoma] / lib / pleroma / web / activity_pub / object_validators / types / date_time.ex
1 defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime do
2 @moduledoc """
3 The AP standard defines the date fields in AP as xsd:DateTime. Elixir's
4 DateTime can't parse this, but it can parse the related iso8601. This
5 module punches the date until it looks like iso8601 and normalizes to
6 it.
7
8 DateTimes without a timezone offset are treated as UTC.
9
10 Reference: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-published
11 """
12 use Ecto.Type
13
14 def type, do: :string
15
16 def cast(datetime) when is_binary(datetime) do
17 with {:ok, datetime, _} <- DateTime.from_iso8601(datetime) do
18 {:ok, DateTime.to_iso8601(datetime)}
19 else
20 {:error, :missing_offset} -> cast("#{datetime}Z")
21 _e -> :error
22 end
23 end
24
25 def cast(_), do: :error
26
27 def dump(data) do
28 {:ok, data}
29 end
30
31 def load(data) do
32 {:ok, data}
33 end
34 end