diff --git a/app/jobs/send_form_completed_webhook_request_job.rb b/app/jobs/send_form_completed_webhook_request_job.rb index 253ebf33..48951724 100644 --- a/app/jobs/send_form_completed_webhook_request_job.rb +++ b/app/jobs/send_form_completed_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendFormCompletedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 20 def perform(params = {}) @@ -21,19 +19,8 @@ class SendFormCompletedWebhookRequestJob ActiveStorage::Current.url_options = Docuseal.default_url_options - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'form.completed', - timestamp: Time.current, - data: Submitters::SerializeForWebhook.call(submitter) - }.to_json, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT, - **webhook_url.secret.to_h) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'form.completed', + data: Submitters::SerializeForWebhook.call(submitter)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submitter.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_form_declined_webhook_request_job.rb b/app/jobs/send_form_declined_webhook_request_job.rb index 86fdae2a..1c7a1e32 100644 --- a/app/jobs/send_form_declined_webhook_request_job.rb +++ b/app/jobs/send_form_declined_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendFormDeclinedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -19,19 +17,8 @@ class SendFormDeclinedWebhookRequestJob ActiveStorage::Current.url_options = Docuseal.default_url_options - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'form.declined', - timestamp: Time.current, - data: Submitters::SerializeForWebhook.call(submitter) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'form.declined', + data: Submitters::SerializeForWebhook.call(submitter)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submitter.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_form_started_webhook_request_job.rb b/app/jobs/send_form_started_webhook_request_job.rb index 3a6e0eae..44510f46 100644 --- a/app/jobs/send_form_started_webhook_request_job.rb +++ b/app/jobs/send_form_started_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendFormStartedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -19,19 +17,8 @@ class SendFormStartedWebhookRequestJob ActiveStorage::Current.url_options = Docuseal.default_url_options - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'form.started', - timestamp: Time.current, - data: Submitters::SerializeForWebhook.call(submitter) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'form.started', + data: Submitters::SerializeForWebhook.call(submitter)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submitter.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_form_viewed_webhook_request_job.rb b/app/jobs/send_form_viewed_webhook_request_job.rb index c70cf776..162743e4 100644 --- a/app/jobs/send_form_viewed_webhook_request_job.rb +++ b/app/jobs/send_form_viewed_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendFormViewedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -19,19 +17,8 @@ class SendFormViewedWebhookRequestJob ActiveStorage::Current.url_options = Docuseal.default_url_options - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'form.viewed', - timestamp: Time.current, - data: Submitters::SerializeForWebhook.call(submitter) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'form.viewed', + data: Submitters::SerializeForWebhook.call(submitter)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submitter.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_submission_archived_webhook_request_job.rb b/app/jobs/send_submission_archived_webhook_request_job.rb index 334d047b..82fc271f 100644 --- a/app/jobs/send_submission_archived_webhook_request_job.rb +++ b/app/jobs/send_submission_archived_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendSubmissionArchivedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -17,19 +15,8 @@ class SendSubmissionArchivedWebhookRequestJob return if webhook_url.url.blank? || webhook_url.events.exclude?('submission.archived') - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'submission.archived', - timestamp: Time.current, - data: submission.as_json(only: %i[id archived_at]) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'submission.archived', + data: submission.as_json(only: %i[id archived_at])) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submission.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_submission_completed_webhook_request_job.rb b/app/jobs/send_submission_completed_webhook_request_job.rb index d6037d0e..375bfa75 100644 --- a/app/jobs/send_submission_completed_webhook_request_job.rb +++ b/app/jobs/send_submission_completed_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendSubmissionCompletedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -17,19 +15,8 @@ class SendSubmissionCompletedWebhookRequestJob return if webhook_url.url.blank? || webhook_url.events.exclude?('submission.completed') - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'submission.completed', - timestamp: Time.current, - data: Submissions::SerializeForApi.call(submission) - }.to_json, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT, - **webhook_url.secret.to_h) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'submission.completed', + data: Submissions::SerializeForApi.call(submission)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submission.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_submission_created_webhook_request_job.rb b/app/jobs/send_submission_created_webhook_request_job.rb index a4dba4a6..d798e76a 100644 --- a/app/jobs/send_submission_created_webhook_request_job.rb +++ b/app/jobs/send_submission_created_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendSubmissionCreatedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -17,19 +15,8 @@ class SendSubmissionCreatedWebhookRequestJob return if webhook_url.url.blank? || webhook_url.events.exclude?('submission.created') - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'submission.created', - timestamp: Time.current, - data: Submissions::SerializeForApi.call(submission) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'submission.created', + data: Submissions::SerializeForApi.call(submission)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || submission.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_template_created_webhook_request_job.rb b/app/jobs/send_template_created_webhook_request_job.rb index 6b2493dc..353ecb6d 100644 --- a/app/jobs/send_template_created_webhook_request_job.rb +++ b/app/jobs/send_template_created_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendTemplateCreatedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -17,19 +15,8 @@ class SendTemplateCreatedWebhookRequestJob return if webhook_url.url.blank? || webhook_url.events.exclude?('template.created') - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'template.created', - timestamp: Time.current, - data: Templates::SerializeForApi.call(template) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'template.created', + data: Templates::SerializeForApi.call(template)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || template.account.account_configs.exists?(key: :plan)) diff --git a/app/jobs/send_template_updated_webhook_request_job.rb b/app/jobs/send_template_updated_webhook_request_job.rb index 68479f1b..30623e15 100644 --- a/app/jobs/send_template_updated_webhook_request_job.rb +++ b/app/jobs/send_template_updated_webhook_request_job.rb @@ -5,8 +5,6 @@ class SendTemplateUpdatedWebhookRequestJob sidekiq_options queue: :webhooks - USER_AGENT = 'DocuSeal.com Webhook' - MAX_ATTEMPTS = 10 def perform(params = {}) @@ -17,19 +15,8 @@ class SendTemplateUpdatedWebhookRequestJob return if webhook_url.url.blank? || webhook_url.events.exclude?('template.updated') - resp = begin - Faraday.post(webhook_url.url, - { - event_type: 'template.updated', - timestamp: Time.current, - data: Templates::SerializeForApi.call(template) - }.to_json, - **webhook_url.secret.to_h, - 'Content-Type' => 'application/json', - 'User-Agent' => USER_AGENT) - rescue Faraday::Error - nil - end + resp = SendWebhookRequest.call(webhook_url, event_type: 'template.updated', + data: Templates::SerializeForApi.call(template)) if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && (!Docuseal.multitenant? || template.account.account_configs.exists?(key: :plan)) diff --git a/lib/send_webhook_request.rb b/lib/send_webhook_request.rb new file mode 100644 index 00000000..d2e6ebf4 --- /dev/null +++ b/lib/send_webhook_request.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module SendWebhookRequest + USER_AGENT = 'DocuSeal.com Webhook' + + module_function + + def call(webhook_url, event_type:, data:) + Faraday.post(webhook_url.url) do |req| + req.headers['Content-Type'] = 'application/json' + req.headers['User-Agent'] = USER_AGENT + req.headers.merge!(webhook_url.secret.to_h) if webhook_url.secret.present? + + req.body = { + event_type: event_type, + timestamp: Time.current, + data: data + }.to_json + + req.options.read_timeout = 8 + req.options.open_timeout = 8 + end + rescue Faraday::Error + nil + end +end