lib/athena_web/schema/scalar/datetime.ex

defmodule AthenaWeb.Schema.Scalar.Datetime do
  @moduledoc """
  DateTime Type for API
  """

  use Absinthe.Schema.Notation

  alias Absinthe.Blueprint.Input

  @desc """
  Date Generic Type

  Example: `2021-05-04 11:44:10.858225Z`
  """
  scalar :datetime do
    parse &_parse/1
    serialize &_serialize/1
  end

  @spec _serialize(datetime :: DateTime.t()) :: String.t()
  defp _serialize(datetime), do: DateTime.to_iso8601(datetime)

  @spec _parse(input :: any) :: {:ok, DateTime.t()} | :error
  defp _parse(%Input.String{value: value}) do
    case DateTime.from_iso8601(value) do
      {:ok, datetime, _offset} ->
        {:ok, datetime}

      {:error, _} ->
        :error
    end
  end

  defp _parse(_other), do: :error
end