gitcoinco/code_fund_ads

View on GitHub
app/jobs/ensure_scoped_daily_summaries_job.rb

Summary

Maintainability
A
25 mins
Test Coverage
class EnsureScopedDailySummariesJob < ApplicationJob
  queue_as :ensure_scoped_daily_summaries

  def perform(start_date = nil, end_date = nil)
    start_date = Date.coerce(start_date || 7.days.ago.to_date)
    end_date = Date.coerce(end_date || 1.day.ago.to_date)
    ensure_daily_summaries_for_campaigns start_date, end_date
    ensure_daily_summaries_for_properties start_date, end_date
  end

  private

  def ensure_daily_summaries_for_campaigns(start_date, end_date)
    Campaign.available_on(start_date).or(Campaign.available_on(end_date)).in_batches.each do |campaigns|
      campaigns.each do |campaign|
        impressions = campaign.impressions.between(start_date, end_date)
        next unless impressions.exists?

        country_codes = impressions.distinct.pluck(:country_code)
        country_codes.each do |country_code|
          CreateDailySummariesJob.perform_later campaign, start_date.iso8601, end_date.iso8601, country_code, "country_code"
        end

        Property.where(id: impressions.distinct.select(:property_id)).in_batches.each do |properties|
          properties.each do |property|
            CreateDailySummariesJob.perform_later campaign, start_date.iso8601, end_date.iso8601, property
          end
        end

        Creative.where(id: impressions.distinct.select(:creative_id)).in_batches.each do |creatives|
          creatives.each do |creative|
            CreateDailySummariesJob.perform_later campaign, start_date.iso8601, end_date.iso8601, creative
          end
        end
      end
    end
  end

  def ensure_daily_summaries_for_properties(start_date, end_date)
    Property.active.in_batches.each do |properties|
      properties.each do |property|
        impressions = property.impressions.between(start_date, end_date)
        next unless impressions.exists?

        country_codes = impressions.distinct.pluck(:country_code)
        country_codes.each do |country_code|
          CreateDailySummariesJob.perform_later property, start_date.iso8601, end_date.iso8601, country_code, "country_code"
        end

        Campaign.where(id: impressions.distinct.select(:campaign_id)).in_batches.each do |campaigns|
          campaigns.each do |campaign|
            CreateDailySummariesJob.perform_later property, start_date.iso8601, end_date.iso8601, campaign
          end
        end
      end
    end
  end
end