mirror of
https://github.com/stripe/stripe-ruby.git
synced 2025-10-07 00:05:33 -04:00
58 lines
1.5 KiB
Ruby
58 lines
1.5 KiB
Ruby
module Stripe
|
|
module APIOperations
|
|
module Update
|
|
def save(opts={})
|
|
values = serialize_params(self).merge(opts)
|
|
|
|
if @values[:metadata]
|
|
values[:metadata] = serialize_metadata
|
|
end
|
|
|
|
if values.length > 0
|
|
values.delete(:id)
|
|
|
|
response, api_key = Stripe.request(:post, url, @api_key, values)
|
|
refresh_from(response, api_key)
|
|
end
|
|
self
|
|
end
|
|
|
|
def serialize_metadata
|
|
if @unsaved_values.include?(:metadata)
|
|
# the metadata object has been reassigned
|
|
# i.e. as object.metadata = {key => val}
|
|
metadata_update = @values[:metadata] # new hash
|
|
new_keys = metadata_update.keys.map(&:to_sym)
|
|
# remove keys at the server, but not known locally
|
|
keys_to_unset = @previous_metadata.keys - new_keys
|
|
keys_to_unset.each {|key| metadata_update[key] = ''}
|
|
|
|
metadata_update
|
|
else
|
|
# metadata is a StripeObject, and can be serialized normally
|
|
serialize_params(@values[:metadata])
|
|
end
|
|
end
|
|
|
|
def serialize_params(obj)
|
|
case obj
|
|
when nil
|
|
''
|
|
when StripeObject
|
|
unsaved_keys = obj.instance_variable_get(:@unsaved_values)
|
|
obj_values = obj.instance_variable_get(:@values)
|
|
update_hash = {}
|
|
|
|
unsaved_keys.each do |k|
|
|
update_hash[k] = serialize_params(obj_values[k])
|
|
end
|
|
|
|
update_hash
|
|
else
|
|
obj
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|