templates/ruby/lib/facebook_ads/ad_object.rb (126 lines of code) (raw):

# Copyright (c) 2017-present, Facebook, Inc. All rights reserved. # # You are hereby granted a non-exclusive, worldwide, royalty-free license to use, # copy, modify, and distribute this software in source code or binary form for use # in connection with the web services and APIs provided by Facebook. # # As with any software that integrates with the Facebook platform, your use of # this software is subject to the Facebook Platform Policy # [http://developers.facebook.com/policy/]. This copyright notice shall be # included in all copies or substantial portions of the software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. require 'json' require 'facebook_ads/api_request' require 'facebook_ads/api_response' require 'facebook_ads/helpers/node_helpers' require 'facebook_ads/helpers/edge_helpers' module FacebookAds class AdObject attr_reader :attributes, :__all_fields, :last_api_response attr_accessor :deserializer attr_accessor :last_saved, :last_destroyed include Fields include GraphNodes include GraphEdges def initialize(attributes, *args) if attributes.empty? raise InvalidParameterError, 'Invalid attributes. Must include at least one attribute' end update_attributes(attributes) # assume object with only id in the attributes as not loaded # is next arg a list of fields? fields = (args[0].is_a?(Array) || args[0].is_a?(String)) ? args.shift : [] fields = fields.split(',') if fields.is_a?(String) session = args.shift self.__all_fields = fields + attributes.keys self.session = session end def self.get(id, *args) obj = new({id: id}, *args) yield obj if block_given? obj end def id self[:id] end def update_attributes(attrs) @attributes ||= {} @attributes.merge!( self.class.deserializer ? self.class.deserializer.deserialize(symbolize_keys_shallow(attrs)) : symbolize_keys_shallow(attrs) ) self end def [](attr_name) @attributes[attr_name.to_sym] end def to_hash @attributes.merge(changes) end def as_json(*opts) to_hash end def to_json(*a) as_json.to_json(*a) end def inspect "#<#{self.class.name} #{to_hash.inspect}>" end def fields_as_string @__all_fields.to_a.join(',') end def __all_fields=(fields) @__all_fields = Set.new((fields.is_a?(String) ? fields.split(',') : fields.map(&:to_s)).map(&:to_sym)) end def loaded? (@__all_fields - attributes.keys).empty? end def load! get(graph_params) do |attrs| update_attributes(attrs) end end def reload! # delete all attribute except id @attributes = @attributes.keep_if { |k,_| k == :id } end # TODO refactor this to somewhere def graph_params {fields: fields_as_string} end [:get, :post, :delete].each do |verb| define_method(verb) do |params = {}, &block| params, options = extract_options(params) APIRequest.new(verb, self.id, session: session, params: params, options: options).execute do |api_response| @last_api_response = api_response block ? block[api_response.result] : api_response end end define_method("#{verb}_edge") do |edge_name, params = {}, &block| params, options = extract_options(params) path = "#{self.id}/#{edge_name}" APIRequest.new(verb, path, session: session, params: params, options: options).execute do |api_response| @last_api_response = api_response block ? block[api_response.result] : api_response end end end def save(params = {}) post(graph_params.merge(changes).merge(params)) do |attrs| update_attributes(attrs) @changes = {} self.last_saved = Time.now end end def destroy(params = {}) delete(params) do |attrs| self.last_destroyed = Time.now if attrs['success'] end end def changes @changes ||= {} end def session @session || Session.default_session end def session=(session) @session = session.is_a?(Hash) ? Session.new(session) : session end private def symbolize_keys_shallow(hash) Hash[hash.map { |k,v| [k.to_sym,v] }] end def extract_options(params) option_keys = [:batch_opts] options = {} option_keys.each { |k| options[k] = params.delete(k) if params.has_key?(k) } [params, options] end end end