class FunWithJsonApi::PreDeserializer

Converts a json_api document into a rails compatible hash. Acts as an adaptor for ActiveModuleSerializer deserializer classes

Attributes

deserializer[R]
document[R]

Public Class Methods

new(document, deserializer) click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 15
def initialize(document, deserializer)
  @document = document.to_h.deep_dup.deep_stringify_keys
  @deserializer = deserializer
end
parse(document, deserializer) click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 8
def self.parse(document, deserializer)
  new(document, deserializer).parse
end

Public Instance Methods

parse() click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 20
def parse
  ams_deserializer_class.parse(document, ams_deserializer_config) do |invalid_document, reason|
    exception_message = "Invalid payload (#{reason}): #{invalid_document}"
    exception = convert_reason_into_exceptions(exception_message, reason).first ||
                Exceptions::InvalidDocument.new(exception_message)
    raise exception
  end
end

Protected Instance Methods

ams_deserializer_class() click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 50
def ams_deserializer_class
  if defined?(::ActiveModel::Serializer::Adapter::JsonApi::Deserialization)
    ::ActiveModel::Serializer::Adapter::JsonApi::Deserialization
  else
    ::ActiveModelSerializers::Adapter::JsonApi::Deserialization
  end
end
ams_deserializer_config() click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 58
def ams_deserializer_config
  @ams_deserializer_config ||=
    FunWithJsonAPi::ActiveModelSerializers::DeserializerConfigBuilder.build(deserializer)
end
convert_reason_into_exceptions(exception_message, reason, values = []) click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 31
def convert_reason_into_exceptions(exception_message, reason, values = [])
  if reason.is_a?(String)
    return convert_reason_message_into_error(exception_message, reason, values.join)
  end
  return nil unless reason.is_a?(Hash)
  return nil unless reason.size == 1

  reason.flat_map do |key, value|
    convert_reason_into_exceptions(exception_message, value, (values + ["/#{key}"]))
  end
end
convert_reason_message_into_error(exception_message, reason, source) click to toggle source
# File lib/fun_with_json_api/pre_deserializer.rb, line 43
def convert_reason_message_into_error(exception_message, reason, source)
  payload = ExceptionPayload.new
  payload.pointer = source.presence
  payload.detail = reason
  Exceptions::InvalidDocument.new(exception_message, payload)
end