Class: GraphQL::Types::ISO8601DateTime

Inherits:
Schema::Scalar show all
Defined in:
lib/graphql/types/iso_8601_date_time.rb

Overview

This scalar takes Times and transmits them as strings, using ISO 8601 format.

Use it for fields or arguments as follows:

field :created_at, GraphQL::Types::ISO8601DateTime, null: false

argument :deliver_at, GraphQL::Types::ISO8601DateTime, null: false

Alternatively, use this built-in scalar as inspiration for your own DateTime type.

Constant Summary collapse

DEFAULT_TIME_PRECISION =

It's not compatible with Rails' default, i.e. ActiveSupport::JSON::Encoder.time_precision (3 by default)

0

Constants included from Schema::Member::HasDirectives

Schema::Member::HasDirectives::NO_DIRECTIVES

Constants included from Schema::Member::GraphQLTypeNames

Schema::Member::GraphQLTypeNames::Boolean, Schema::Member::GraphQLTypeNames::ID, Schema::Member::GraphQLTypeNames::Int

Class Method Summary collapse

Methods inherited from Schema::Scalar

default_scalar, default_scalar?, kind, specified_by_url, validate_non_null_input

Methods included from Schema::Member::ValidatesInput

#coerce_isolated_input, #coerce_isolated_result, #valid_input?, #valid_isolated_input?, #validate_input

Methods included from Schema::Member::BaseDSLMethods

#accessible?, #authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name, #visible?

Methods included from Schema::Member::BaseDSLMethods::ConfigurationExtension

#inherited

Methods included from Schema::Member::TypeSystemHelpers

#kind, #list?, #non_null?, #to_list_type, #to_non_null_type, #to_type_signature

Methods included from Schema::Member::Scoped

#scope_items

Methods included from Schema::Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Methods included from Schema::Member::HasPath

#path

Methods included from Schema::Member::HasAstNode

#ast_node

Methods included from Schema::Member::HasDirectives

#directive, #directives, #remove_directive

Class Method Details

.coerce_input(str_value, _ctx) ⇒ Time

Parameters:

Returns:

  • (Time)

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/graphql/types/iso_8601_date_time.rb', line 54

def self.coerce_input(str_value, _ctx)
  Time.iso8601(str_value)
rescue ArgumentError, TypeError
  begin
    dt = Date.iso8601(str_value).to_time
    # For compatibility, continue accepting dates given without times
    # But without this, it would zero out given any time part of `str_value` (hours and/or minutes)
    if dt.iso8601.start_with?(str_value)
      dt
    elsif str_value.length == 8 && str_value.match?(/\A\d{8}\Z/)
      # Allow dates that are missing the "-". eg. "20220404"
      dt
    else
      nil
    end
  rescue ArgumentError, TypeError
    # Invalid input
    nil
  end
end

.coerce_result(value, _ctx) ⇒ String

Parameters:

  • value (Time, Date, DateTime, String)

Returns:


38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/graphql/types/iso_8601_date_time.rb', line 38

def self.coerce_result(value, _ctx)
  case value
  when Date
    return value.to_time.iso8601(time_precision)
  when ::String
    return Time.parse(value).iso8601(time_precision)
  else
    # Time, DateTime or compatible is given:
    return value.iso8601(time_precision)
  end
rescue StandardError => error
  raise GraphQL::Error, "An incompatible object (#{value.class}) was given to #{self}. Make sure that only Times, Dates, DateTimes, and well-formatted Strings are used with this type. (#{error.message})"
end

.time_precisionInteger

Returns:

  • (Integer)

27
28
29
# File 'lib/graphql/types/iso_8601_date_time.rb', line 27

def self.time_precision
  @time_precision || DEFAULT_TIME_PRECISION
end

.time_precision=(value) ⇒ Object

Parameters:

  • value (Integer)

32
33
34
# File 'lib/graphql/types/iso_8601_date_time.rb', line 32

def self.time_precision=(value)
  @time_precision = value
end