synchronize documents generation

This commit is contained in:
Alex Turchyn
2023-07-01 13:16:07 +03:00
parent e55b5b47cd
commit 4180d02a1b
15 changed files with 148 additions and 12 deletions
@@ -0,0 +1,58 @@
# frozen_string_literal: true
module Submissions
module EnsureResultGenerated
WAIT_FOR_RETRY = 2.seconds
CHECK_EVENT_INTERVAL = 1.second
CHECK_COMPLETE_TIMEOUT = 20.seconds
WaitForCompleteTimeout = Class.new(StandardError)
module_function
def call(submitter)
return submitter.documents if submitter.document_generation_events.complete.exists?
events =
DocumentGenerationEvent.uncached do
DocumentGenerationEvent.where(submitter:).order(:created_at).to_a
end
if events.present? && events.last.event_name.in?(%w[start retry])
wait_for_complete_or_fail(submitter)
else
submitter.document_generation_events.create!(event_name: events.present? ? :retry : :start)
GenerateResultAttachments.call(submitter)
submitter.document_generation_events.create!(event_name: :complete)
end
rescue ActiveRecord::RecordNotUnique
sleep WAIT_FOR_RETRY
retry
rescue StandardError
submitter.document_generation_events.create!(event_name: :fail)
raise
end
def wait_for_complete_or_fail(submitter)
total_wait_time = 0
loop do
sleep CHECK_EVENT_INTERVAL
total_wait_time += CHECK_EVENT_INTERVAL
last_event =
DocumentGenerationEvent.uncached do
DocumentGenerationEvent.where(submitter:).order(:created_at).last
end
break last_event if last_event.event_name.in?(%w[complete fail])
raise WaitForCompleteTimeout if total_wait_time > CHECK_COMPLETE_TIMEOUT
end
end
end
end
@@ -209,9 +209,13 @@ module Submissions
end
def build_pdfs_index(submitter)
latest_submitter = submitter.submission.submitters
.select { |e| e.id != submitter.id && e.completed_at? }
.max_by(&:completed_at)
latest_submitter =
submitter.submission.submitters
.select(&:completed_at?)
.select { |e| e.id != submitter.id && e.completed_at <= submitter.completed_at }
.max_by(&:completed_at)
Submissions::EnsureResultGenerated.call(latest_submitter) if latest_submitter
documents = latest_submitter&.documents&.preload(:blob).to_a.presence
documents ||= submitter.submission.template.documents.preload(:blob)