diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index c1f95d31..6337a123 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -67,10 +67,10 @@ module Api submissions = create_submissions(@template, params) - @template.account.webhook_urls.with_event('submission.created').each do |webhook_url| + WebhookUrls.for_account_id(@template.account_id, 'submission.created').each do |webhook_url| submissions.each do |submission| - SendSubmissionCreatedWebhookRequestJob.perform_async({ 'submission_id' => submission.id, - 'webhook_url_id' => webhook_url.id }) + SendSubmissionCreatedWebhookRequestJob.perform_async('submission_id' => submission.id, + 'webhook_url_id' => webhook_url.id) end end @@ -78,7 +78,7 @@ module Api submissions.each do |submission| submission.submitters.each do |submitter| - ProcessSubmitterCompletionJob.perform_async({ 'submitter_id' => submitter.id }) if submitter.completed_at? + ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id) if submitter.completed_at? end end @@ -96,9 +96,9 @@ module Api else @submission.update!(archived_at: Time.current) - @submission.account.webhook_urls.with_event('submission.archived').each do |webhook_url| - SendSubmissionArchivedWebhookRequestJob.perform_async({ 'submission_id' => @submission.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(@submission.account_id, 'submission.archived').each do |webhook_url| + SendSubmissionArchivedWebhookRequestJob.perform_async('submission_id' => @submission.id, + 'webhook_url_id' => webhook_url.id) end end diff --git a/app/controllers/api/submitter_form_views_controller.rb b/app/controllers/api/submitter_form_views_controller.rb index e24df6b8..98d7f5b5 100644 --- a/app/controllers/api/submitter_form_views_controller.rb +++ b/app/controllers/api/submitter_form_views_controller.rb @@ -13,9 +13,9 @@ module Api SubmissionEvents.create_with_tracking_data(submitter, 'view_form', request) - submitter.account.webhook_urls.with_event('form.viewed').each do |webhook_url| - SendFormViewedWebhookRequestJob.perform_async({ 'submitter_id' => submitter.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(submitter.account_id, 'form.viewed').each do |webhook_url| + SendFormViewedWebhookRequestJob.perform_async('submitter_id' => submitter.id, + 'webhook_url_id' => webhook_url.id) end render json: {} diff --git a/app/controllers/api/submitters_controller.rb b/app/controllers/api/submitters_controller.rb index 210b783d..f85e2f60 100644 --- a/app/controllers/api/submitters_controller.rb +++ b/app/controllers/api/submitters_controller.rb @@ -68,7 +68,7 @@ module Api end if @submitter.completed_at? - ProcessSubmitterCompletionJob.perform_async({ 'submitter_id' => @submitter.id }) + ProcessSubmitterCompletionJob.perform_async('submitter_id' => @submitter.id) elsif normalized_params[:send_email] || normalized_params[:send_sms] Submitters.send_signature_requests([@submitter]) end diff --git a/app/controllers/api/templates_clone_controller.rb b/app/controllers/api/templates_clone_controller.rb index 922739a4..f869fa28 100644 --- a/app/controllers/api/templates_clone_controller.rb +++ b/app/controllers/api/templates_clone_controller.rb @@ -25,9 +25,9 @@ module Api schema_documents = Templates::CloneAttachments.call(template: cloned_template, original_template: @template) - cloned_template.account.webhook_urls.with_event('template.created').each do |webhook_url| - SendTemplateCreatedWebhookRequestJob.perform_async({ 'template_id' => cloned_template.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(cloned_template.account_id, 'template.created').each do |webhook_url| + SendTemplateCreatedWebhookRequestJob.perform_async('template_id' => cloned_template.id, + 'webhook_url_id' => webhook_url.id) end render json: Templates::SerializeForApi.call(cloned_template, schema_documents) diff --git a/app/controllers/api/templates_controller.rb b/app/controllers/api/templates_controller.rb index c8c43e4a..80af5acf 100644 --- a/app/controllers/api/templates_controller.rb +++ b/app/controllers/api/templates_controller.rb @@ -65,9 +65,9 @@ module Api @template.update!(template_params) - @template.account.webhook_urls.with_event('template.updated').each do |webhook_url| - SendTemplateUpdatedWebhookRequestJob.perform_async({ 'template_id' => @template.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(@template.account_id, 'template.updated').each do |webhook_url| + SendTemplateUpdatedWebhookRequestJob.perform_async('template_id' => @template.id, + 'webhook_url_id' => webhook_url.id) end render json: @template.as_json(only: %i[id updated_at]) diff --git a/app/controllers/start_form_controller.rb b/app/controllers/start_form_controller.rb index 63d0bb3b..209c81b4 100644 --- a/app/controllers/start_form_controller.rb +++ b/app/controllers/start_form_controller.rb @@ -38,9 +38,9 @@ class StartFormController < ApplicationController if @submitter.save if is_new_record - @submitter.account.webhook_urls.with_event('submission.created').each do |webhook_url| - SendSubmissionCreatedWebhookRequestJob.perform_async({ 'submission_id' => @submitter.submission_id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(@submitter.account_id, 'submission.created').each do |webhook_url| + SendSubmissionCreatedWebhookRequestJob.perform_async('submission_id' => @submitter.submission_id, + 'webhook_url_id' => webhook_url.id) end end diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index 2c47dca7..a7a7f216 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -66,9 +66,9 @@ class SubmissionsController < ApplicationController else @submission.update!(archived_at: Time.current) - @submission.account.webhook_urls.with_event('submission.archived').each do |webhook_url| - SendSubmissionArchivedWebhookRequestJob.perform_async({ 'submission_id' => @submission.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(@submission.account_id, 'submission.archived').each do |webhook_url| + SendSubmissionArchivedWebhookRequestJob.perform_async('submission_id' => @submission.id, + 'webhook_url_id' => webhook_url.id) end I18n.t('submission_has_been_archived') @@ -87,10 +87,10 @@ class SubmissionsController < ApplicationController end def enqueue_submission_created_webhooks(template, submissions) - template.account.webhook_urls.with_event('submission.created').each do |webhook_url| + WebhookUrls.for_account_id(template.account_id, 'submission.created').each do |webhook_url| submissions.each do |submission| - SendSubmissionCreatedWebhookRequestJob.perform_async({ 'submission_id' => submission.id, - 'webhook_url_id' => webhook_url.id }) + SendSubmissionCreatedWebhookRequestJob.perform_async('submission_id' => submission.id, + 'webhook_url_id' => webhook_url.id) end end end diff --git a/app/controllers/submit_form_decline_controller.rb b/app/controllers/submit_form_decline_controller.rb index 1c4e0563..94099b0d 100644 --- a/app/controllers/submit_form_decline_controller.rb +++ b/app/controllers/submit_form_decline_controller.rb @@ -25,9 +25,9 @@ class SubmitFormDeclineController < ApplicationController SubmitterMailer.declined_email(submitter, user).deliver_later! end - submitter.account.webhook_urls.with_event('form.declined').each do |webhook_url| - SendFormDeclinedWebhookRequestJob.perform_async({ 'submitter_id' => submitter.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(submitter.account_id, 'form.declined').each do |webhook_url| + SendFormDeclinedWebhookRequestJob.perform_async('submitter_id' => submitter.id, + 'webhook_url_id' => webhook_url.id) end redirect_to submit_form_path(submitter.slug) diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb index ae63d3d0..5a578685 100644 --- a/app/controllers/templates_controller.rb +++ b/app/controllers/templates_controller.rb @@ -129,16 +129,16 @@ class TemplatesController < ApplicationController end def enqueue_template_created_webhooks(template) - template.account.webhook_urls.with_event('template.updated').each do |webhook_url| - SendTemplateCreatedWebhookRequestJob.perform_async({ 'template_id' => template.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(template.account_id, 'template.created').each do |webhook_url| + SendTemplateCreatedWebhookRequestJob.perform_async('template_id' => template.id, + 'webhook_url_id' => webhook_url.id) end end def enqueue_template_updated_webhooks(template) - template.account.webhook_urls.with_event('template.updated').each do |webhook_url| - SendTemplateUpdatedWebhookRequestJob.perform_async({ 'template_id' => template.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(template.account_id, 'template.updated').each do |webhook_url| + SendTemplateUpdatedWebhookRequestJob.perform_async('template_id' => template.id, + 'webhook_url_id' => webhook_url.id) end end diff --git a/app/controllers/templates_uploads_controller.rb b/app/controllers/templates_uploads_controller.rb index 069b316f..75b4e620 100644 --- a/app/controllers/templates_uploads_controller.rb +++ b/app/controllers/templates_uploads_controller.rb @@ -67,9 +67,9 @@ class TemplatesUploadsController < ApplicationController end def enqueue_template_created_webhooks(template) - template.account.webhook_urls.with_event('template.created').each do |webhook_url| - SendTemplateCreatedWebhookRequestJob.perform_async({ 'template_id' => template.id, - 'webhook_url_id' => webhook_url.id }) + WebhookUrls.for_account_id(template.account_id, 'template.created').each do |webhook_url| + SendTemplateCreatedWebhookRequestJob.perform_async('template_id' => template.id, + 'webhook_url_id' => webhook_url.id) end end end diff --git a/app/controllers/webhook_preferences_controller.rb b/app/controllers/webhook_preferences_controller.rb new file mode 100644 index 00000000..1070f7fe --- /dev/null +++ b/app/controllers/webhook_preferences_controller.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class WebhookPreferencesController < ApplicationController + load_and_authorize_resource :webhook_url, parent: false + + def update + webhook_preferences_params[:events].each do |event, val| + @webhook_url.events.delete(event) if val == '0' + @webhook_url.events.push(event) if val == '1' && @webhook_url.events.exclude?(event) + end + + @webhook_url.save! + + head :ok + end + + private + + def webhook_preferences_params + params.require(:webhook_url).permit(events: {}) + end +end diff --git a/app/controllers/webhook_settings_controller.rb b/app/controllers/webhook_settings_controller.rb index 5482b478..2c6362af 100644 --- a/app/controllers/webhook_settings_controller.rb +++ b/app/controllers/webhook_settings_controller.rb @@ -17,8 +17,8 @@ class WebhookSettingsController < ApplicationController def update submitter = current_account.submitters.where.not(completed_at: nil).order(:id).last - SendFormCompletedWebhookRequestJob.perform_async({ 'submitter_id' => submitter.id, - 'webhook_url_id' => @webhook_url.id }) + SendFormCompletedWebhookRequestJob.perform_async('submitter_id' => submitter.id, + 'webhook_url_id' => @webhook_url.id) redirect_back(fallback_location: settings_webhooks_path, notice: I18n.t('webhook_request_has_been_sent')) end @@ -30,6 +30,6 @@ class WebhookSettingsController < ApplicationController end def webhook_params - params.require(:webhook_url).permit(:url, events: []) + params.require(:webhook_url).permit(:url) end end diff --git a/app/jobs/process_submitter_completion_job.rb b/app/jobs/process_submitter_completion_job.rb index 0b8c3e0b..c23c7f82 100644 --- a/app/jobs/process_submitter_completion_job.rb +++ b/app/jobs/process_submitter_completion_job.rb @@ -63,15 +63,15 @@ class ProcessSubmitterCompletionJob end def enqueue_completed_webhooks(submitter, is_all_completed: false) - submitter.account.webhook_urls.with_events(%w[form.completed submission.completed]).each do |webhook| + WebhookUrls.for_account_id(submitter.account_id, %w[form.completed submission.completed]).each do |webhook| if webhook.events.include?('form.completed') - SendFormCompletedWebhookRequestJob.perform_async({ 'submitter_id' => submitter.id, - 'webhook_url_id' => webhook.id }) + SendFormCompletedWebhookRequestJob.perform_async('submitter_id' => submitter.id, + 'webhook_url_id' => webhook.id) end if webhook.events.include?('submission.completed') && is_all_completed - SendSubmissionCompletedWebhookRequestJob.perform_async({ 'submission_id' => submitter.submission_id, - 'webhook_url_id' => webhook.id }) + SendSubmissionCompletedWebhookRequestJob.perform_async('submission_id' => submitter.submission_id, + 'webhook_url_id' => webhook.id) end end end diff --git a/app/jobs/send_form_completed_webhook_request_job.rb b/app/jobs/send_form_completed_webhook_request_job.rb index 9d6c4c29..7e935e8d 100644 --- a/app/jobs/send_form_completed_webhook_request_job.rb +++ b/app/jobs/send_form_completed_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendFormCompletedWebhookRequestJob def perform(params = {}) submitter = Submitter.find(params['submitter_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submitter.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('form.completed') Submissions::EnsureResultGenerated.call(submitter) diff --git a/app/jobs/send_form_declined_webhook_request_job.rb b/app/jobs/send_form_declined_webhook_request_job.rb index 58ee8640..2bf7b7f7 100644 --- a/app/jobs/send_form_declined_webhook_request_job.rb +++ b/app/jobs/send_form_declined_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendFormDeclinedWebhookRequestJob def perform(params = {}) submitter = Submitter.find(params['submitter_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submitter.submission.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('form.declined') ActiveStorage::Current.url_options = Docuseal.default_url_options diff --git a/app/jobs/send_form_started_webhook_request_job.rb b/app/jobs/send_form_started_webhook_request_job.rb index 5a7a6d38..72dc40f7 100644 --- a/app/jobs/send_form_started_webhook_request_job.rb +++ b/app/jobs/send_form_started_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendFormStartedWebhookRequestJob def perform(params = {}) submitter = Submitter.find(params['submitter_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submitter.submission.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('form.started') ActiveStorage::Current.url_options = Docuseal.default_url_options diff --git a/app/jobs/send_form_viewed_webhook_request_job.rb b/app/jobs/send_form_viewed_webhook_request_job.rb index a47c57b7..f71cf45f 100644 --- a/app/jobs/send_form_viewed_webhook_request_job.rb +++ b/app/jobs/send_form_viewed_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendFormViewedWebhookRequestJob def perform(params = {}) submitter = Submitter.find(params['submitter_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submitter.submission.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('form.viewed') ActiveStorage::Current.url_options = Docuseal.default_url_options diff --git a/app/jobs/send_submission_archived_webhook_request_job.rb b/app/jobs/send_submission_archived_webhook_request_job.rb index a0141f50..bc6f4897 100644 --- a/app/jobs/send_submission_archived_webhook_request_job.rb +++ b/app/jobs/send_submission_archived_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendSubmissionArchivedWebhookRequestJob def perform(params = {}) submission = Submission.find(params['submission_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submission.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('submission.archived') resp = begin diff --git a/app/jobs/send_submission_completed_webhook_request_job.rb b/app/jobs/send_submission_completed_webhook_request_job.rb index 06ab92c9..0477a1b4 100644 --- a/app/jobs/send_submission_completed_webhook_request_job.rb +++ b/app/jobs/send_submission_completed_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendSubmissionCompletedWebhookRequestJob def perform(params = {}) submission = Submission.find(params['submission_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submission.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('submission.completed') resp = begin diff --git a/app/jobs/send_submission_created_webhook_request_job.rb b/app/jobs/send_submission_created_webhook_request_job.rb index e43ce493..31f83f23 100644 --- a/app/jobs/send_submission_created_webhook_request_job.rb +++ b/app/jobs/send_submission_created_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendSubmissionCreatedWebhookRequestJob def perform(params = {}) submission = Submission.find(params['submission_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = submission.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('submission.created') resp = begin diff --git a/app/jobs/send_template_created_webhook_request_job.rb b/app/jobs/send_template_created_webhook_request_job.rb index 4a6cb896..49b344bc 100644 --- a/app/jobs/send_template_created_webhook_request_job.rb +++ b/app/jobs/send_template_created_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendTemplateCreatedWebhookRequestJob def perform(params = {}) template = Template.find(params['template_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = template.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('template.created') resp = begin diff --git a/app/jobs/send_template_updated_webhook_request_job.rb b/app/jobs/send_template_updated_webhook_request_job.rb index e36f53b3..0766a14d 100644 --- a/app/jobs/send_template_updated_webhook_request_job.rb +++ b/app/jobs/send_template_updated_webhook_request_job.rb @@ -11,12 +11,10 @@ class SendTemplateUpdatedWebhookRequestJob def perform(params = {}) template = Template.find(params['template_id']) + webhook_url = WebhookUrl.find(params['webhook_url_id']) attempt = params['attempt'].to_i - webhook_url = template.account.webhook_urls.find_by(id: params['webhook_url_id']) - - return unless webhook_url return if webhook_url.url.blank? || webhook_url.events.exclude?('template.updated') resp = begin diff --git a/app/models/webhook_url.rb b/app/models/webhook_url.rb index 18794c82..011bf5a1 100644 --- a/app/models/webhook_url.rb +++ b/app/models/webhook_url.rb @@ -6,7 +6,7 @@ # # id :bigint not null, primary key # events :text not null -# secret :text +# secret :text not null # sha1 :string not null # url :text not null # created_at :datetime not null @@ -37,17 +37,11 @@ class WebhookUrl < ApplicationRecord belongs_to :account attribute :events, :string, default: -> { %w[form.viewed form.started form.completed form.declined] } + attribute :secret, :string, default: -> { {} } serialize :events, coder: JSON serialize :secret, coder: JSON - scope :with_event, ->(event) { with_events([event]) } - scope :with_events, lambda { |events| - where(events.map do |event| - Arel::Table.new(:webhook_urls)[:events].matches("%\"#{event}\"%") - end.reduce(:or)) - } - before_validation :set_sha1 encrypts :url, :secret diff --git a/app/views/webhook_settings/show.html.erb b/app/views/webhook_settings/show.html.erb index eee89493..6c305d88 100644 --- a/app/views/webhook_settings/show.html.erb +++ b/app/views/webhook_settings/show.html.erb @@ -12,23 +12,27 @@