Class: Publication::CloudflareTrafficSummary

Inherits:
Object
  • Object
show all
Defined in:
app/services/publication/cloudflare_traffic_summary.rb

Overview

Rolling Cloudflare edge-analytics PDF download counts for a single publication.

Reads the cloudflare_pdf_requests data points that Seo::CloudflareSyncService
writes nightly to site_map_data_points. Used by the CRM publication show page
to surface an accurate download count — one that, unlike the Rails
requested_counter, includes the 30-day edge-cache hits that never reach the
origin.

Examples:

summary = Publication::CloudflareTrafficSummary.for(publication)
summary.pdf_requests_30d # => 412
summary.recorded?        # => true

Defined Under Namespace

Classes: Result

Constant Summary collapse

METRIC =

Cloudflare metric type stored in site_map_data_points. A publication's
SiteMap path is its .pdf URL, so for publications this metric is the
PDF download count.

'cloudflare_requests'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(publication) ⇒ CloudflareTrafficSummary

Returns a new instance of CloudflareTrafficSummary.

Parameters:

  • publication (Item)

    a publication item



43
44
45
# File 'app/services/publication/cloudflare_traffic_summary.rb', line 43

def initialize(publication)
  @publication = publication
end

Class Method Details

.for(publication) ⇒ Result

Parameters:

  • publication (Item)

    a publication item

Returns:



40
# File 'app/services/publication/cloudflare_traffic_summary.rb', line 40

def self.for(publication) = new(publication).result

Instance Method Details

#resultResult

Returns:



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/services/publication/cloudflare_traffic_summary.rb', line 48

def result
  ids = site_map_ids
  return Result.new if ids.empty?

  scope = SiteMapDataPoint.where(site_map_id: ids, metric_type: METRIC)
  last_synced_on = scope.maximum(Arel.sql('lower(period)'))&.to_date

  Result.new(
    pdf_requests_30d: window_sum(scope, 30),
    pdf_requests_90d: window_sum(scope, 90),
    last_synced_on: last_synced_on,
    site_map_id: anchor_site_map_id(scope)
  )
end