Skip to content

Commit

Permalink
Create campaign once before running
Browse files Browse the repository at this point in the history
The code was previously referring to campaigns by
name so if more than one sidekiq job started at
once it could possibly create more than once
instance of the campaign.

Change it so that a `CertificationCampaign` object
is created before starting the jobs and store the
feed url that it uses on the object.
  • Loading branch information
pkqk committed Aug 11, 2015
1 parent 0b30cad commit f34e032
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 22 deletions.
2 changes: 1 addition & 1 deletion app/controllers/campaigns_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def new
def create
@campaign = current_user.certification_campaigns.create(params[:certification_campaign])
if @campaign.valid?
CertificateFactory::FactoryRunner.perform_async(feed: @campaign.url, user_id: current_user.id, limit: @campaign.limit, campaign: @campaign.name, jurisdiction: @campaign.jurisdiction)
CertificateFactory::FactoryRunner.perform_async(feed: @campaign.url, user_id: current_user.id, limit: @campaign.limit, campaign_id: @campaign.id, jurisdiction: @campaign.jurisdiction)
flash[:notice] = "Campaign queued to run"
redirect_to campaign_path(@campaign, certificate_level: "all")
else
Expand Down
3 changes: 2 additions & 1 deletion features/step_definitions/factory_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,11 @@
end

Given(/^the campaign is created$/) do
campaign = CertificationCampaign.find_by_name(@campaign)
CertificateFactory::Factory.new("feed"=>@url,
"user_id"=>@api_user.id,
"limit"=>@limit,
"campaign"=>@campaign,
"campaign"=>campaign,
"jurisdiction"=>"cert-generator").build
end

Expand Down
13 changes: 3 additions & 10 deletions lib/extra/certificate_factory/certificate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,22 @@ def initialize(url, user_id, options = {})
@url = url
@user = User.find(user_id)
@dataset_url = options[:dataset_url]
@campaign_name = options[:campaign]
@campaign = options[:campaign]
@jurisdiction = options[:jurisdiction] || "gb"
@create_user = options[:create_user] || true
@existing_dataset = options[:existing_dataset]
@feed_url = options[:feed_url]
end

def generate
if existing_certificate?
campaign.increment!(:duplicate_count) if campaign
@campaign.increment!(:duplicate_count) if @campaign
else
generator = CertificateGenerator.create(
request: {
documentationUrl: @url
},
user: @user,
certification_campaign: campaign
certification_campaign: @campaign
)
generator.sidekiq_delay.generate(@jurisdiction, @create_user, @existing_dataset)
end
Expand All @@ -32,11 +31,5 @@ def existing_certificate?
@existing_dataset.try(:certificate).present?
end

def campaign
if @campaign_name
@campaign ||= CertificationCampaign.where(:user_id => @user.id).find_or_create_by_name_and_url(@campaign_name, @feed_url)
end
end

end
end
2 changes: 1 addition & 1 deletion lib/extra/certificate_factory/factory.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def initialize(options)
def build
each do |item|
url = get_link(item)
CertificateFactory::Certificate.new(url, @user_id, campaign: @campaign, jurisdiction: @jurisdiction, feed_url: @url).generate
CertificateFactory::Certificate.new(url, @user_id, campaign: @campaign, jurisdiction: @jurisdiction).generate
end
end

Expand Down
6 changes: 6 additions & 0 deletions lib/extra/certificate_factory/runner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ class FactoryRunner
include Sidekiq::Worker

def perform(options)
if campaign_id = options.delete('campaign_id')
options['campaign'] = CertificationCampaign.find(campaign_id)
end
CertificateFactory::Factory.new(options).build
end
end
Expand All @@ -11,6 +14,9 @@ class CSVFactoryRunner
include Sidekiq::Worker

def perform(options)
if campaign_id = options.delete('campaign_id')
options['campaign'] = CertificationCampaign.find(campaign_id)
end
CertificateFactory::CSVFactory.new(options).build
end
end
Expand Down
24 changes: 15 additions & 9 deletions lib/tasks/certificate_factory.rake
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,21 @@ task :certificate do
end

task :certificates do
user_id = ENV['USER_ID']
campaign = ENV['CAMPAIGN']
limit = ENV['LIMIT']
ENV['JURISDICTION'] ||= "gb"
if ENV['URL']
url = ENV['URL']
CertificateFactory::FactoryRunner.perform_async(feed: url, user_id: user_id, limit: limit, campaign: campaign, jurisdiction: ENV['JURISDICTION'])
url = ENV['URL']
csv = ENV['CSV']
user = User.find(ENV['USER_ID'])
options = {
user_id: user.id,
limit: ENV['LIMIT'],
jurisdiction: ENV['JURISDICTION'] || 'gb'
}
if campaign_name = ENV['CAMPAIGN']
campaign = user.certification_campaigns.where(name: campaign_name).first_or_create(url: url)
options[:campaign_id] = campaign.id
end
if url
CertificateFactory::FactoryRunner.perform_async(options.merge(feed: url))
else
csv = ENV['CSV']
CertificateFactory::CSVFactoryRunner.perform_async(file: csv, user_id: user_id, limit: limit, campaign: campaign, jurisdiction: ENV['JURISDICTION'])
CertificateFactory::CSVFactoryRunner.perform_async(options.merge(file: csv))
end
end

0 comments on commit f34e032

Please sign in to comment.