Class: Spotlight::Analytics::Ga
- Inherits:
-
Object
- Object
- Spotlight::Analytics::Ga
- Defined in:
- app/models/spotlight/analytics/ga.rb
Overview
Google Analytics data provider for the Exhibit dashboard
Instance Method Summary collapse
- #client ⇒ Object
- #dimension_filter(path) ⇒ Object
- #dimension_headers ⇒ Object
- #enabled? ⇒ Boolean
- #exhibit_data(path, dates) ⇒ Object
-
#metric_headers ⇒ Object
rubocop:enable Metrics/AbcSize.
- #metric_parsing(report_data) ⇒ Object
- #page_data(path, dates) ⇒ Object
- #page_params(path, dates) ⇒ Object
- #params(path, dates) ⇒ Object
- #parse_data(value) ⇒ Object
- #report(params) ⇒ Object
-
#rows ⇒ Object
rubocop:disable Metrics/AbcSize.
- #search_params(path, dates) ⇒ Object
- #totals ⇒ Object
Instance Method Details
#client ⇒ Object
14 15 16 17 18 19 20 21 |
# File 'app/models/spotlight/analytics/ga.rb', line 14 def client Google::Analytics::Data.analytics_data do |config| config.credentials = Spotlight::Engine.config.ga_json_key_path end rescue StandardError => e Rails.logger.error(e) nil end |
#dimension_filter(path) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 |
# File 'app/models/spotlight/analytics/ga.rb', line 34 def dimension_filter(path) Google::Analytics::Data::V1beta::FilterExpression.new( filter: Google::Analytics::Data::V1beta::Filter.new( field_name: 'pagePath', string_filter: Google::Analytics::Data::V1beta::Filter::StringFilter.new( match_type: :PARTIAL_REGEXP, value: "^#{path}(/.*)?$" ) ) ) end |
#dimension_headers ⇒ Object
108 109 110 |
# File 'app/models/spotlight/analytics/ga.rb', line 108 def dimension_headers @report_data.dimension_headers.map(&:name) end |
#enabled? ⇒ Boolean
10 11 12 |
# File 'app/models/spotlight/analytics/ga.rb', line 10 def enabled? Spotlight::Engine.config.ga_json_key_path && client end |
#exhibit_data(path, dates) ⇒ Object
82 83 84 |
# File 'app/models/spotlight/analytics/ga.rb', line 82 def exhibit_data(path, dates) metric_parsing(report(search_params(path, dates))) end |
#metric_headers ⇒ Object
rubocop:enable Metrics/AbcSize
104 105 106 |
# File 'app/models/spotlight/analytics/ga.rb', line 104 def metric_headers @report_data.metric_headers.map(&:name) end |
#metric_parsing(report_data) ⇒ Object
112 113 114 115 116 117 118 |
# File 'app/models/spotlight/analytics/ga.rb', line 112 def metric_parsing(report_data) return OpenStruct.new({ totals: [], rows: [] }) unless report_data.rows.any? @report_data = report_data OpenStruct.new({ rows:, totals: }) end |
#page_data(path, dates) ⇒ Object
68 69 70 |
# File 'app/models/spotlight/analytics/ga.rb', line 68 def page_data(path, dates) metric_parsing(report(page_params(path, dates))) end |
#page_params(path, dates) ⇒ Object
54 55 56 57 58 59 60 61 |
# File 'app/models/spotlight/analytics/ga.rb', line 54 def page_params(path, dates) params(path, dates).merge({ dimensions: [{ name: 'pagePath' }, { name: 'pageTitle' }], order_bys: [{ metric: { metric_name: 'screenPageViews' }, desc: true }], metrics: [{ name: 'totalUsers' }, { name: 'activeUsers' }, { name: 'screenPageViews' }] }).merge(Spotlight::Engine.config.) end |
#params(path, dates) ⇒ Object
23 24 25 26 27 28 29 30 31 32 |
# File 'app/models/spotlight/analytics/ga.rb', line 23 def params(path, dates) { date_ranges: [{ start_date: dates['start_date'], end_date: dates['end_date'] }], metric_aggregations: [ ::Google::Analytics::Data::V1beta::MetricAggregation::TOTAL ], property: "properties/#{ga_property_id}", dimension_filter: dimension_filter(path) } end |
#parse_data(value) ⇒ Object
72 73 74 75 76 77 78 79 80 |
# File 'app/models/spotlight/analytics/ga.rb', line 72 def parse_data(value) if value.to_i.to_s == value value.to_i.to_fs(:delimited) elsif !!(value =~ /\A[-+]?\d*\.?\d+\z/) value.to_f else value end end |
#report(params) ⇒ Object
63 64 65 66 |
# File 'app/models/spotlight/analytics/ga.rb', line 63 def report(params) request = ::Google::Analytics::Data::V1beta::RunReportRequest.new(params) client.run_report request end |
#rows ⇒ Object
rubocop:disable Metrics/AbcSize
93 94 95 96 97 98 99 100 101 |
# File 'app/models/spotlight/analytics/ga.rb', line 93 def rows @report_data.rows.map do |row| OpenStruct.new(row.dimension_values.each_with_index.with_object({}) do |(dv, index), result| result[dimension_headers[index]] = parse_data(dv.value) end.merge(row.metric_values.each_with_index.with_object({}) do |(mv, index), result| result[metric_headers[index]] = parse_data(mv.value) end)) end end |
#search_params(path, dates) ⇒ Object
46 47 48 49 50 51 52 |
# File 'app/models/spotlight/analytics/ga.rb', line 46 def search_params(path, dates) params(path, dates).merge({ dimensions: [{ name: 'searchTerm' }], metrics: [{ name: 'eventCount' }, { name: 'sessions' }, { name: 'screenPageViewsPerSession' }, { name: 'engagementRate' }], order_bys: [{ metric: { metric_name: 'eventCount' }, desc: true }] }).merge(Spotlight::Engine.config.) end |
#totals ⇒ Object
86 87 88 89 90 |
# File 'app/models/spotlight/analytics/ga.rb', line 86 def totals OpenStruct.new(@report_data.totals[0].metric_values.each_with_index.with_object({}) do |(mv, index), result| result[metric_headers[index]] = parse_data(mv.value) end) end |