diff --git a/app/controllers/api/submitter_form_views_controller.rb b/app/controllers/api/submitter_form_views_controller.rb index ae0d00fd..b5ac5440 100644 --- a/app/controllers/api/submitter_form_views_controller.rb +++ b/app/controllers/api/submitter_form_views_controller.rb @@ -9,6 +9,8 @@ module Api SubmissionEvents.create_with_tracking_data(submitter, 'view_form', request) + SendFormViewedWebhookRequestJob.perform_later(submitter) + render json: {} end end diff --git a/app/controllers/webhook_settings_controller.rb b/app/controllers/webhook_settings_controller.rb index 4d0cc119..cb36d44d 100644 --- a/app/controllers/webhook_settings_controller.rb +++ b/app/controllers/webhook_settings_controller.rb @@ -18,7 +18,7 @@ class WebhookSettingsController < ApplicationController def update submitter = current_account.submitters.where.not(completed_at: nil).order(:id).last - SendWebhookRequestJob.perform_later(submitter) + SendFormCompletedWebhookRequestJob.perform_later(submitter) redirect_back(fallback_location: settings_webhooks_path, notice: 'Webhook request has been sent.') end diff --git a/app/jobs/process_submitter_completion_job.rb b/app/jobs/process_submitter_completion_job.rb index 513f2a6a..3f3da35c 100644 --- a/app/jobs/process_submitter_completion_job.rb +++ b/app/jobs/process_submitter_completion_job.rb @@ -11,7 +11,7 @@ class ProcessSubmitterCompletionJob < ApplicationJob Submissions::EnsureResultGenerated.call(submitter) if submitter.account.encrypted_configs.exists?(key: EncryptedConfig::WEBHOOK_URL_KEY) - SendWebhookRequestJob.perform_later(submitter) + SendFormCompletedWebhookRequestJob.perform_later(submitter) end return unless is_all_completed diff --git a/app/jobs/send_webhook_request_job.rb b/app/jobs/send_form_completed_webhook_request_job.rb similarity index 86% rename from app/jobs/send_webhook_request_job.rb rename to app/jobs/send_form_completed_webhook_request_job.rb index 0ca7c919..aebac6e3 100644 --- a/app/jobs/send_webhook_request_job.rb +++ b/app/jobs/send_form_completed_webhook_request_job.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class SendWebhookRequestJob < ApplicationJob +class SendFormCompletedWebhookRequestJob < ApplicationJob USER_AGENT = 'DocuSeal.co Webhook' def perform(submitter) @@ -14,7 +14,7 @@ class SendWebhookRequestJob < ApplicationJob Faraday.post(config.value, { - event_type: 'form.submitted', + event_type: 'form.completed', timestamp: Time.current.iso8601, data: Submitters::SerializeForWebhook.call(submitter) }.to_json, diff --git a/app/jobs/send_form_started_webhook_request_job.rb b/app/jobs/send_form_started_webhook_request_job.rb new file mode 100644 index 00000000..251e5b35 --- /dev/null +++ b/app/jobs/send_form_started_webhook_request_job.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class SendFormStartedWebhookRequestJob < ApplicationJob + USER_AGENT = 'DocuSeal.co Webhook' + + def perform(submitter) + config = submitter.submission.account.encrypted_configs.find_by(key: EncryptedConfig::WEBHOOK_URL_KEY) + + return if config.blank? || config.value.blank? + + ActiveStorage::Current.url_options = Docuseal.default_url_options + + Faraday.post(config.value, + { + event_type: 'form.started', + timestamp: Time.current.iso8601, + data: Submitters::SerializeForWebhook.call(submitter) + }.to_json, + 'Content-Type' => 'application/json', + 'User-Agent' => USER_AGENT) + end +end diff --git a/app/jobs/send_form_viewed_webhook_request_job.rb b/app/jobs/send_form_viewed_webhook_request_job.rb new file mode 100644 index 00000000..d28f240b --- /dev/null +++ b/app/jobs/send_form_viewed_webhook_request_job.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class SendFormViewedWebhookRequestJob < ApplicationJob + USER_AGENT = 'DocuSeal.co Webhook' + + def perform(submitter) + config = submitter.submission.account.encrypted_configs.find_by(key: EncryptedConfig::WEBHOOK_URL_KEY) + + return if config.blank? || config.value.blank? + + ActiveStorage::Current.url_options = Docuseal.default_url_options + + Faraday.post(config.value, + { + event_type: 'form.viewed', + timestamp: Time.current.iso8601, + data: Submitters::SerializeForWebhook.call(submitter) + }.to_json, + 'Content-Type' => 'application/json', + 'User-Agent' => USER_AGENT) + end +end diff --git a/app/views/webhook_settings/show.html.erb b/app/views/webhook_settings/show.html.erb index ad13c08c..e7d43935 100644 --- a/app/views/webhook_settings/show.html.erb +++ b/app/views/webhook_settings/show.html.erb @@ -30,7 +30,7 @@
- <%= render 'shared/clipboard_copy', icon: 'copy', text: code = JSON.pretty_generate({ event_type: 'form.submitted', timestamp: Time.current.iso8601, data: Submitters::SerializeForWebhook.call(submitter) }).gsub(/^/, ' ').sub(/^\s+/, ''), class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy', copied_title: 'Copied' %> + <%= render 'shared/clipboard_copy', icon: 'copy', text: code = JSON.pretty_generate({ event_type: 'form.completed', timestamp: Time.current.iso8601, data: Submitters::SerializeForWebhook.call(submitter) }).gsub(/^/, ' ').sub(/^\s+/, ''), class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy', copied_title: 'Copied' %>
<%= code %>
diff --git a/lib/submitters/serialize_for_webhook.rb b/lib/submitters/serialize_for_webhook.rb index 85c3815c..d3f00f17 100644 --- a/lib/submitters/serialize_for_webhook.rb +++ b/lib/submitters/serialize_for_webhook.rb @@ -18,7 +18,8 @@ module Submitters end def build_values_array(submitter) - fields_index = submitter.submission.template_fields.index_by { |e| e['uuid'] } + fields_index = (submitter.submission.template_fields || + submitter.submission.template.fields).index_by { |e| e['uuid'] } attachments_index = submitter.attachments.preload(:blob).index_by(&:uuid) submitter_field_counters = Hash.new { 0 } diff --git a/lib/submitters/submit_values.rb b/lib/submitters/submit_values.rb index a8e79adb..590d8d4d 100644 --- a/lib/submitters/submit_values.rb +++ b/lib/submitters/submit_values.rb @@ -7,10 +7,12 @@ module Submitters module_function def call(submitter, params, request) - if submitter.submission.template_fields.blank? - Submissions.update_template_fields!(submitter.submission) + Submissions.update_template_fields!(submitter.submission) if submitter.submission.template_fields.blank? + unless submitter.submission_events.exists?(event_type: 'start_form') SubmissionEvents.create_with_tracking_data(submitter, 'start_form', request) + + SendFormStartedWebhookRequestJob.perform_later(submitter) end update_submitter!(submitter, params, request)