module Zuora::Utils::Envelope

Constants

CUSTOM_FIELD_STRING

Public Class Methods

authenticated_xml(token, &body) click to toggle source

Takes a body, and returns an envelope with session token merged in @param [Callable] body - function of body @return [Nokogiri::XML::Builder]

# File lib/zuora/utils/envelope.rb, line 22
def self.authenticated_xml(token, &body)
  failure_message = 'Session token not set. Did you call authenticate?'
  raise failure_message unless token.present?

  header = lambda do |builder|
    builder[:api].SessionHeader { builder[:api].session(token) }
    builder
  end

  xml(header, body)
end
build_field(builder, namespace, key, value) click to toggle source

Builds one field using key and value. Treats value differently:

- Hash: recursively builds fields
- ZObject: builds a nested z object, building fields inside
- Nil: does nothing
- Else: builds the field node

@param [Nokogiri::XML::Builder] builder @param [Symbol] namespace @param [Hash] key @param [Hash|Zuora::Soap::ZObject|NilClass|Object] value @return nil

# File lib/zuora/utils/envelope.rb, line 44
def self.build_field(builder, namespace, key, value)
  zuora_field_name = to_zuora_key(key)
  build_fields_thunk = -> { build_fields builder, namespace, value }
  case value
  when Hash
    builder[namespace].send(zuora_field_name) { build_fields_thunk[] }
  when Zuora::Soap::ZObject
    zuora_type = to_zuora_key(value.type)
    xsi = { 'xsi:type' => "obj:#{zuora_type}" }
    builder[:api].send(zuora_field_name) do
      builder[:api].send(zuora_type, xsi) { build_fields_thunk[] }
    end
  when NilClass
  else
    builder[namespace].send(zuora_field_name, value)
  end
end
build_fields(builder, namespace, object = {}) click to toggle source

Builds multiple fields in given object @param [Nokogiri::XML::Builder] builder @param [Symbol] namespace @param [Hash] object @return nil

# File lib/zuora/utils/envelope.rb, line 67
def self.build_fields(builder, namespace, object = {})
  object.each do |key, value|
    build_field builder, namespace, key, value
  end
end
build_objects(builder, type, objects) click to toggle source

Builds multiple objects @param [Nokogiri::XML::Builder] builder @param [Symbol] type @param [Array] objects @return nil

# File lib/zuora/utils/envelope.rb, line 78
def self.build_objects(builder, type, objects)
  objects.each do |object|
    builder[:api].zObjects('xsi:type' => "obj:#{type}") do
      Zuora::Utils::Envelope.build_fields(builder, :obj, object)
    end
  end
end
from_zuora_key(key) click to toggle source

Converts from Zuora key format to Ruby format. @param [Symbol] key e.g. :SomeKeyName @return [Symbol] - e.g. :some_key_name

# File lib/zuora/utils/envelope.rb, line 107
def self.from_zuora_key(key)
  transform_sym key, :lower
end
to_zuora_key(key) click to toggle source

Converts from Ruby to Zuora key format. @param [Symbol] key - e.g. :some_key_name or :some_key_name__c @return [Symbol] - e.g. :SomeKeyName or :SomeKeyName__c

# File lib/zuora/utils/envelope.rb, line 89
def self.to_zuora_key(key)
  custom_field_matcher = Regexp.new CUSTOM_FIELD_STRING
  matches = custom_field_matcher.match(key.to_s)
  suffix = ''

  if matches
    key = key.to_s[0...-3].to_sym
    suffix = CUSTOM_FIELD_STRING
  end

  key = transform_sym key, :camelize

  [key.to_s, suffix].join.to_sym
end
transform_sym(sym, operation) click to toggle source

Transforms symbol as if were a string, using operation. Helper method for building specific symbol converters. @param [Symbol] - operation @param [Symbol] - symbol

# File lib/zuora/utils/envelope.rb, line 115
def self.transform_sym(sym, operation)
  sym.to_s.send(operation).to_sym
end
xml(header, body) click to toggle source

@param [Callable] header - optional function of builder, rtns builder @param [Callable] body - optional function of builder, rtns builder

# File lib/zuora/utils/envelope.rb, line 10
def self.xml(header, body)
  Nokogiri::XML::Builder.new do |builder|
    builder[:soapenv].Envelope(Zuora::NAMESPACES) do
      builder[:soapenv].Header { header.call builder } if header
      builder[:soapenv].Body { body.call builder } if body
    end
  end
end