class SoapyBing::Ads::Campaigns

Constants

DEFAULT_ENTITIES
DEFAULT_POLLING_SETTINGS
NotCompleted
StatusFailed

Attributes

campaign_ids[R]
entities[R]
polling_settings[R]
service[R]
status[R]

Public Class Methods

new( service_options:, entities: DEFAULT_ENTITIES, polling_settings: {}, campaign_ids: nil ) click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 18
def initialize(
  service_options:,
  entities: DEFAULT_ENTITIES,
  polling_settings: {},
  campaign_ids: nil
)
  @service = Service.bulk(service_options)
  @entities = entities
  @polling_settings = DEFAULT_POLLING_SETTINGS.merge(polling_settings)
  @campaign_ids = campaign_ids
end

Public Instance Methods

rows() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 30
def rows
  @rows ||= Parsers::BulkCsvParser.new(Helpers::ZipDownloader.new(result_file_url).read).rows
end

Private Instance Methods

by_account_ids() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 86
def by_account_ids
  service.download_campaigns_by_account_ids(
    {
      account_ids: {
        '@xmlns:a1' => 'http://schemas.microsoft.com/2003/10/Serialization/Arrays',
        'a1:long' => service.account.account_id
      }
    }.merge(common_request_body)
  )
end
by_campaign_ids() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 67
def by_campaign_ids
  service.download_campaigns_by_campaign_ids(
    {
      campaigns: {
        campaign_scope: campaign_scope
      }
    }.merge(common_request_body)
  )
end
campaign_scope() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 77
def campaign_scope
  campaign_ids.map do |campaign_id|
    {
      campaign_id: campaign_id,
      parent_account_id: service.account.account_id
    }
  end
end
common_request_body() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 97
def common_request_body
  {
    download_entities: { download_entity: entities },
    download_file_type: 'Csv',
    format_version: '6.0'
  }
end
download_campaigns() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 62
def download_campaigns
  response = campaign_ids ? by_campaign_ids : by_account_ids
  response[:download_request_id]
end
download_request_id() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 58
def download_request_id
  @download_request_id ||= download_campaigns
end
fetch_status() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 43
def fetch_status
  response = service.get_bulk_download_status(request_id: download_request_id)
  if response[:request_status] == 'Failed'
    raise StatusFailed, response[:errors].to_s
  end
  @status = response.slice(:percent_complete, :request_status, :result_file_url)
end
result_file_url() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 36
def result_file_url
  @result_file_url ||= begin
    wait_status_complete
    status[:result_file_url]
  end
end
wait_status_complete() click to toggle source
# File lib/soapy_bing/ads/campaigns.rb, line 51
def wait_status_complete
  Retryable.retryable(polling_settings.merge(on: NotCompleted)) do
    fetch_status
    raise NotCompleted if status[:request_status] != 'Completed'
  end
end