forked from AkkomaGang/akkoma
Validators: Add a type for the datetime used in AP.
This commit is contained in:
parent
e9993acdbb
commit
1993d7096d
3 changed files with 67 additions and 2 deletions
|
@ -25,8 +25,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do
|
||||||
field(:actor, Types.ObjectID)
|
field(:actor, Types.ObjectID)
|
||||||
field(:attributedTo, Types.ObjectID)
|
field(:attributedTo, Types.ObjectID)
|
||||||
field(:summary, :string)
|
field(:summary, :string)
|
||||||
# TODO: Write type
|
field(:published, Types.DateTime)
|
||||||
field(:published, :string)
|
|
||||||
# TODO: Write type
|
# TODO: Write type
|
||||||
field(:emoji, :map, default: %{})
|
field(:emoji, :map, default: %{})
|
||||||
field(:sensitive, :boolean, default: false)
|
field(:sensitive, :boolean, default: false)
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime do
|
||||||
|
@moduledoc """
|
||||||
|
The AP standard defines the date fields in AP as xsd:DateTime. Elixir's
|
||||||
|
DateTime can't parse this, but it can parse the related iso8601. This
|
||||||
|
module punches the date until it looks like iso8601 and normalizes to
|
||||||
|
it.
|
||||||
|
|
||||||
|
DateTimes without a timezone offset are treated as UTC.
|
||||||
|
|
||||||
|
Reference: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-published
|
||||||
|
"""
|
||||||
|
use Ecto.Type
|
||||||
|
|
||||||
|
def type, do: :string
|
||||||
|
|
||||||
|
def cast(datetime) when is_binary(datetime) do
|
||||||
|
with {:ok, datetime, _} <- DateTime.from_iso8601(datetime) do
|
||||||
|
{:ok, DateTime.to_iso8601(datetime)}
|
||||||
|
else
|
||||||
|
{:error, :missing_offset} -> cast("#{datetime}Z")
|
||||||
|
_e -> :error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def cast(_), do: :error
|
||||||
|
|
||||||
|
def dump(data) do
|
||||||
|
{:ok, data}
|
||||||
|
end
|
||||||
|
|
||||||
|
def load(data) do
|
||||||
|
{:ok, data}
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,32 @@
|
||||||
|
defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTimeTest do
|
||||||
|
alias Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
test "it validates an xsd:Datetime" do
|
||||||
|
valid_strings = [
|
||||||
|
"2004-04-12T13:20:00",
|
||||||
|
"2004-04-12T13:20:15.5",
|
||||||
|
"2004-04-12T13:20:00-05:00",
|
||||||
|
"2004-04-12T13:20:00Z"
|
||||||
|
]
|
||||||
|
|
||||||
|
invalid_strings = [
|
||||||
|
"2004-04-12T13:00",
|
||||||
|
"2004-04-1213:20:00",
|
||||||
|
"99-04-12T13:00",
|
||||||
|
"2004-04-12"
|
||||||
|
]
|
||||||
|
|
||||||
|
assert {:ok, "2004-04-01T12:00:00Z"} == DateTime.cast("2004-04-01T12:00:00Z")
|
||||||
|
|
||||||
|
Enum.each(valid_strings, fn date_time ->
|
||||||
|
result = DateTime.cast(date_time)
|
||||||
|
assert {:ok, _} = result
|
||||||
|
end)
|
||||||
|
|
||||||
|
Enum.each(invalid_strings, fn date_time ->
|
||||||
|
result = DateTime.cast(date_time)
|
||||||
|
assert :error == result
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue