Files
docuseal/lib/submissions/ensure_result_generated.rb
T

72 lines
2.0 KiB
Ruby
Raw Normal View History

2023-07-01 13:16:07 +03:00
# frozen_string_literal: true
module Submissions
module EnsureResultGenerated
WAIT_FOR_RETRY = 2.seconds
CHECK_EVENT_INTERVAL = 1.second
2023-10-22 01:54:20 +03:00
CHECK_COMPLETE_TIMEOUT = 90.seconds
2023-07-01 13:16:07 +03:00
WaitForCompleteTimeout = Class.new(StandardError)
2025-03-25 15:34:37 +02:00
NotCompletedYet = Class.new(StandardError)
2023-07-01 13:16:07 +03:00
module_function
def call(submitter)
2024-05-17 16:07:08 +03:00
return [] unless submitter
2025-03-25 15:34:37 +02:00
raise NotCompletedYet unless submitter.completed_at?
2025-12-23 10:01:09 +02:00
total_wait_time ||= 0
2025-09-15 09:10:03 +03:00
key = ['result_attachments', submitter.id].join(':')
2023-07-01 13:16:07 +03:00
2026-01-29 14:23:30 +02:00
return submitter.documents.reload if ApplicationRecord.uncached { LockEvent.exists?(key:, event_name: :complete) }
2025-09-15 09:10:03 +03:00
events = ApplicationRecord.uncached { LockEvent.where(key:).order(:id).to_a }
2023-07-01 13:16:07 +03:00
if events.present? && events.last.event_name.in?(%w[start retry])
wait_for_complete_or_fail(submitter)
else
2025-09-15 09:10:03 +03:00
LockEvent.create!(key:, event_name: events.present? ? :retry : :start)
2023-07-01 13:16:07 +03:00
2024-02-10 19:38:03 +02:00
documents = GenerateResultAttachments.call(submitter)
2023-07-01 13:16:07 +03:00
2025-09-15 09:10:03 +03:00
LockEvent.create!(key:, event_name: :complete)
2024-02-10 19:38:03 +02:00
2026-01-28 08:50:44 +02:00
submitter.documents.reset
2024-02-10 19:38:03 +02:00
documents
2023-07-01 13:16:07 +03:00
end
rescue ActiveRecord::RecordNotUnique
sleep WAIT_FOR_RETRY
2025-12-23 10:01:09 +02:00
total_wait_time += WAIT_FOR_RETRY
2023-07-01 13:16:07 +03:00
2025-12-23 10:01:09 +02:00
total_wait_time > CHECK_COMPLETE_TIMEOUT ? raise : retry
2024-03-05 13:55:40 +02:00
rescue StandardError => e
Rollbar.error(e) if defined?(Rollbar)
Rails.logger.error(e)
2025-09-15 09:10:03 +03:00
LockEvent.create!(key:, event_name: :fail)
2023-07-01 13:16:07 +03:00
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 =
2023-07-02 00:58:25 +03:00
ApplicationRecord.uncached do
2025-09-15 09:10:03 +03:00
LockEvent.where(key: ['result_attachments', submitter.id].join(':')).order(:id).last
2023-07-01 13:16:07 +03:00
end
2026-01-29 14:23:30 +02:00
break submitter.documents.reload if last_event.event_name.in?(%w[complete fail])
2023-07-01 13:16:07 +03:00
raise WaitForCompleteTimeout if total_wait_time > CHECK_COMPLETE_TIMEOUT
end
end
end
end