From 929d29576d03ea64ea90301f5016cecf56d02bed Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sun, 12 May 2024 11:37:33 +0300 Subject: [PATCH] add template webhooks --- .../api/templates_clone_controller.rb | 2 + app/controllers/api/templates_controller.rb | 2 + app/controllers/templates_controller.rb | 4 ++ .../templates_uploads_controller.rb | 2 + .../webhook_preferences_controller.rb | 2 + ...nd_template_created_webhook_request_job.rb | 40 +++++++++++++++++++ ...nd_template_updated_webhook_request_job.rb | 40 +++++++++++++++++++ 7 files changed, 92 insertions(+) create mode 100644 app/jobs/send_template_created_webhook_request_job.rb create mode 100644 app/jobs/send_template_updated_webhook_request_job.rb diff --git a/app/controllers/api/templates_clone_controller.rb b/app/controllers/api/templates_clone_controller.rb index a07fa310..6a76704e 100644 --- a/app/controllers/api/templates_clone_controller.rb +++ b/app/controllers/api/templates_clone_controller.rb @@ -20,6 +20,8 @@ module Api Templates::CloneAttachments.call(template: cloned_template, original_template: @template) + SendTemplateCreatedWebhookRequestJob.perform_later(cloned_template) + render json: Templates::SerializeForApi.call(cloned_template) end end diff --git a/app/controllers/api/templates_controller.rb b/app/controllers/api/templates_controller.rb index 42ea91e1..bd7e80e8 100644 --- a/app/controllers/api/templates_controller.rb +++ b/app/controllers/api/templates_controller.rb @@ -65,6 +65,8 @@ module Api @template.update!(template_params) + SendTemplateUpdatedWebhookRequestJob.perform_later(@template) + render json: @template.as_json(only: %i[id updated_at]) end diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb index 2f6e0c51..dfa801bf 100644 --- a/app/controllers/templates_controller.rb +++ b/app/controllers/templates_controller.rb @@ -61,6 +61,8 @@ class TemplatesController < ApplicationController if @template.save Templates::CloneAttachments.call(template: @template, original_template: @base_template) if @base_template + SendTemplateUpdatedWebhookRequestJob.perform_later(@template) + maybe_redirect_to_template(@template) else render turbo_stream: turbo_stream.replace(:modal, template: 'templates/new'), status: :unprocessable_entity @@ -70,6 +72,8 @@ class TemplatesController < ApplicationController def update @template.update!(template_params) + SendTemplateUpdatedWebhookRequestJob.perform_later(@template) + head :ok end diff --git a/app/controllers/templates_uploads_controller.rb b/app/controllers/templates_uploads_controller.rb index acb2ed38..a21e8439 100644 --- a/app/controllers/templates_uploads_controller.rb +++ b/app/controllers/templates_uploads_controller.rb @@ -18,6 +18,8 @@ class TemplatesUploadsController < ApplicationController @template.update!(schema:) + SendTemplateCreatedWebhookRequestJob.perform_later(@template) + redirect_to edit_template_path(@template) rescue Templates::CreateAttachments::PdfEncrypted render turbo_stream: turbo_stream.append(params[:form_id], html: helpers.tag.prompt_password) diff --git a/app/controllers/webhook_preferences_controller.rb b/app/controllers/webhook_preferences_controller.rb index 4d9c7353..eadd37dc 100644 --- a/app/controllers/webhook_preferences_controller.rb +++ b/app/controllers/webhook_preferences_controller.rb @@ -5,6 +5,8 @@ class WebhookPreferencesController < ApplicationController form.viewed form.started form.completed + template.created + template.updated submission.archived ].freeze diff --git a/app/jobs/send_template_created_webhook_request_job.rb b/app/jobs/send_template_created_webhook_request_job.rb new file mode 100644 index 00000000..0bdc8867 --- /dev/null +++ b/app/jobs/send_template_created_webhook_request_job.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class SendTemplateCreatedWebhookRequestJob < ApplicationJob + USER_AGENT = 'DocuSeal.co Webhook' + + MAX_ATTEMPTS = 10 + + def perform(template, params = {}) + attempt = params[:attempt].to_i + url = Accounts.load_webhook_url(template.account) + + return if url.blank? + + preferences = Accounts.load_webhook_preferences(template.account) + + return if preferences['template.created'].blank? + + resp = begin + Faraday.post(url, + { + event_type: 'template.created', + timestamp: Time.current, + data: Templates::SerializeForApi.call(template) + }.to_json, + 'Content-Type' => 'application/json', + 'User-Agent' => USER_AGENT) + rescue Faraday::Error + nil + end + + if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && + (!Docuseal.multitenant? || template.account.account_configs.exists?(key: :plan)) + SendTemplateCreatedWebhookRequestJob.set(wait: (2**attempt).minutes) + .perform_later(template, { + attempt: attempt + 1, + last_status: resp&.status.to_i + }) + end + end +end diff --git a/app/jobs/send_template_updated_webhook_request_job.rb b/app/jobs/send_template_updated_webhook_request_job.rb new file mode 100644 index 00000000..299bc48d --- /dev/null +++ b/app/jobs/send_template_updated_webhook_request_job.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class SendTemplateUpdatedWebhookRequestJob < ApplicationJob + USER_AGENT = 'DocuSeal.co Webhook' + + MAX_ATTEMPTS = 10 + + def perform(template, params = {}) + attempt = params[:attempt].to_i + url = Accounts.load_webhook_url(template.account) + + return if url.blank? + + preferences = Accounts.load_webhook_preferences(template.account) + + return if preferences['template.updated'].blank? + + resp = begin + Faraday.post(url, + { + event_type: 'template.updated', + timestamp: Time.current, + data: Templates::SerializeForApi.call(template) + }.to_json, + 'Content-Type' => 'application/json', + 'User-Agent' => USER_AGENT) + rescue Faraday::Error + nil + end + + if (resp.nil? || resp.status.to_i >= 400) && attempt <= MAX_ATTEMPTS && + (!Docuseal.multitenant? || template.account.account_configs.exists?(key: :plan)) + SendTemplateUpdatedWebhookRequestJob.set(wait: (2**attempt).minutes) + .perform_later(template, { + attempt: attempt + 1, + last_status: resp&.status.to_i + }) + end + end +end