class GaTrackable::PageViewsFetcher

Public Instance Methods

counter_class() click to toggle source
# File lib/ga_trackable/page_views_fetcher.rb, line 4
def counter_class
  GaTrackable::PageViewsCounter
end
get_details_for(start_date: 1.year.ago, path:) click to toggle source

Поулчить данные по просмотрам для конкретного пути. Используется в rake-таске.

# File lib/ga_trackable/page_views_fetcher.rb, line 9
def get_details_for(start_date: 1.year.ago, path:)
  ga_start_date = start_date.strftime(GA_DATE_FORMAT)
  ga_end_date = DateTime.current.strftime(GA_DATE_FORMAT)

  data = @client.execute(api_method: @analytics.data.ga.get, parameters: {
    'ids' => "ga:#{@config.view_id}",
    'start-date' => ga_start_date,
    'end-date' => ga_end_date,
    'dimensions' => 'ga:pagePath,ga:pageTitle',
    'metrics' => 'ga:uniquePageviews,ga:pageviews',
    'sort' => 'ga:pagePath,ga:pageTitle',
    'filters' => "ga:pagePath=@#{path}"
  }).data
end

Private Instance Methods

get_data(tstart, tend, start_index, max_results) click to toggle source
# File lib/ga_trackable/page_views_fetcher.rb, line 69
def get_data(tstart, tend, start_index, max_results)
  ga_start_date = tstart.strftime(GA_DATE_FORMAT)
  ga_end_date = tend.strftime(GA_DATE_FORMAT)

  params = {
    'ids' => "ga:#{@config.view_id}",
    'start-date' => ga_start_date,
    'end-date' => ga_end_date,
    'start-index' => start_index,
    'max-results' => max_results,
    'dimensions' => 'ga:pagePath',
    'metrics' => 'ga:uniquePageviews,ga:pageviews',
    'sort' => 'ga:pagePath',
    'filters' => "ga:pagePath=~#{@config.page_views_white_filter}"
  }

  data = @client.execute(api_method: @analytics.data.ga.get, parameters: params).data

  GaTrackable.out << "Page views data:\n"
  GaTrackable.out << "params:\n"
  GaTrackable.out << params.to_s
  GaTrackable.out << "\n"
  GaTrackable.out << "response:\n"
  GaTrackable.out << data.rows.to_s
  GaTrackable.out << "\n"

  data
end
get_entity(page_path) click to toggle source
# File lib/ga_trackable/page_views_fetcher.rb, line 98
def get_entity(page_path)
  @config.page_views_entity_fetcher.call(page_path)
end
process_row(row, create_in_past: false) click to toggle source

Обработать запись из коллекции, которую отдает гуглоаналитика. create_in_past нужен для создания счетчика “вчера”. Это нужно в случае стартовой инициализации счетчиков. Стартовые данные за весь период записываем вчерашним днем, за сегодня и далее – записываем стандартным образом.

# File lib/ga_trackable/page_views_fetcher.rb, line 29
def process_row(row, create_in_past: false)
  # Пропускаем события с demo
  return if @config.page_views_black_filter && row[0] =~ @config.page_views_black_filter
  page_path = URI(row[0].split('?').first).path.chomp('/')
  unique_page_views = row[1].to_i
  page_views = row[2].to_i
  entity = get_entity(page_path)

  # Пытаемся получить каунтер на сегодняшний день.
  today_counters = entity.page_views_counters.where('created_at >= ?', start_date)
  fail "more than one today counter for #{entity.class.name}##{entity.id}" if today_counters.size > 1

  if today_counters.any?
    counter = today_counters.first
  else
    counter = entity.page_views_counters.build(page_path: page_path)
    if create_in_past
      counter.created_at = 1.day.ago
      counter.updated_at = counter.created_at
      counter.initial_data = true
    end
  end

  # Аналитика считает просмотры по каждому url-у и тайтлу.
  # Это значит что если в процессе существования сущности менялся ее тайтл,
  # но не менялся url, аналитика отдаст столько записей, сколько было разных тайтлов.
  # Нам нужна агрегированная информация по тайтлам. Для этого введен массив sometime_processed_counters
  # Если url в нем есть, значит количество просмотров не инициализируем, а инкрементируем.
  if sometime_processed_counters.index(page_path)
    counter.unique_page_views += unique_page_views
    counter.page_views += page_views
  else
    counter.unique_page_views = unique_page_views
    sometime_processed_counters << page_path
    counter.page_views = page_views
  end

  counter.save!
end