mirror of https://github.com/docusealco/docuseal
				
				
				
			
							parent
							
								
									0c690b3033
								
							
						
					
					
						commit
						6788071eec
					
				| @ -0,0 +1,33 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | class WebhookPreferencesController < ApplicationController | ||||||
|  |   EVENTS = %w[ | ||||||
|  |     form.viewed | ||||||
|  |     form.started | ||||||
|  |     form.completed | ||||||
|  |     submission.archived | ||||||
|  |   ].freeze | ||||||
|  | 
 | ||||||
|  |   before_action :load_account_config | ||||||
|  |   authorize_resource :account_config, parent: false | ||||||
|  | 
 | ||||||
|  |   def create | ||||||
|  |     @account_config.value[account_config_params[:event]] = account_config_params[:value] == '1' | ||||||
|  | 
 | ||||||
|  |     @account_config.save! | ||||||
|  | 
 | ||||||
|  |     head :ok | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def load_account_config | ||||||
|  |     @account_config = | ||||||
|  |       current_account.account_configs.find_or_initialize_by(key: AccountConfig::WEBHOOK_PREFERENCES_KEY) | ||||||
|  |     @account_config.value ||= {} | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def account_config_params | ||||||
|  |     params.permit(:event, :value) | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | class SendSubmissionArchivedWebhookRequestJob < ApplicationJob | ||||||
|  |   USER_AGENT = 'DocuSeal.co Webhook' | ||||||
|  | 
 | ||||||
|  |   MAX_ATTEMPTS = 10 | ||||||
|  | 
 | ||||||
|  |   def perform(submission, params = {}) | ||||||
|  |     attempt = params[:attempt].to_i | ||||||
|  |     url = Accounts.load_webhook_url(submission.account) | ||||||
|  | 
 | ||||||
|  |     return if url.blank? | ||||||
|  | 
 | ||||||
|  |     preferences = Accounts.load_webhook_preferences(submission.account) | ||||||
|  | 
 | ||||||
|  |     return if preferences['submission.archived'].blank? | ||||||
|  | 
 | ||||||
|  |     resp = begin | ||||||
|  |       Faraday.post(url, | ||||||
|  |                    { | ||||||
|  |                      event_type: 'submission.archived', | ||||||
|  |                      timestamp: Time.current, | ||||||
|  |                      data: submission.as_json(only: %i[id archived_at]) | ||||||
|  |                    }.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? || submitter.account.account_configs.exists?(key: :plan)) | ||||||
|  |       SendSubmissionArchivedWebhookRequestJob.set(wait: (2**attempt).minutes) | ||||||
|  |                                              .perform_later(submitter, { | ||||||
|  |                                                               attempt: attempt + 1, | ||||||
|  |                                                               last_status: resp&.status.to_i | ||||||
|  |                                                             }) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
					Loading…
					
					
				
		Reference in new issue