|
- # Pleroma: A lightweight social networking server
- # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
- # SPDX-License-Identifier: AGPL-3.0-only
-
- defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.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
|