mirror of https://github.com/docusealco/docuseal
				
				
				
			
							parent
							
								
									b4b17d847e
								
							
						
					
					
						commit
						f0d5fc4e2d
					
				| @ -0,0 +1,40 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | class SendSubmissionCreatedWebhookRequestJob < 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.created'].blank? | ||||||
|  | 
 | ||||||
|  |     resp = begin | ||||||
|  |       Faraday.post(url, | ||||||
|  |                    { | ||||||
|  |                      event_type: 'submission.created', | ||||||
|  |                      timestamp: Time.current, | ||||||
|  |                      data: Submissions::SerializeForApi.call(submission) | ||||||
|  |                    }.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? || submission.account.account_configs.exists?(key: :plan)) | ||||||
|  |       SendSubmissionCreatedWebhookRequestJob.set(wait: (2**attempt).minutes) | ||||||
|  |                                             .perform_later(submission, { | ||||||
|  |                                                              attempt: attempt + 1, | ||||||
|  |                                                              last_status: resp&.status.to_i | ||||||
|  |                                                            }) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module Submissions | ||||||
|  |   module SerializeForApi | ||||||
|  |     SERIALIZE_PARAMS = { | ||||||
|  |       only: %i[id source submitters_order created_at updated_at archived_at], | ||||||
|  |       methods: %i[audit_log_url], | ||||||
|  |       include: { | ||||||
|  |         submitters: { only: %i[id slug uuid name email phone | ||||||
|  |                                completed_at opened_at sent_at | ||||||
|  |                                created_at updated_at external_id metadata], | ||||||
|  |                       methods: %i[status application_key] }, | ||||||
|  |         template: { only: %i[id name external_id created_at updated_at], | ||||||
|  |                     methods: %i[folder_name] }, | ||||||
|  |         created_by_user: { only: %i[id email first_name last_name] } | ||||||
|  |       } | ||||||
|  |     }.freeze | ||||||
|  | 
 | ||||||
|  |     module_function | ||||||
|  | 
 | ||||||
|  |     def call(submission, submitters = nil) | ||||||
|  |       submitters ||= submission.submitters.preload(documents_attachments: :blob, attachments_attachments: :blob) | ||||||
|  | 
 | ||||||
|  |       serialized_submitters = submitters.map { |submitter| Submitters::SerializeForApi.call(submitter) } | ||||||
|  | 
 | ||||||
|  |       json = submission.as_json( | ||||||
|  |         SERIALIZE_PARAMS.deep_merge( | ||||||
|  |           include: { submission_events: { only: %i[id submitter_id event_type event_timestamp] } } | ||||||
|  |         ) | ||||||
|  |       ) | ||||||
|  | 
 | ||||||
|  |       if submitters.all?(&:completed_at?) | ||||||
|  |         last_submitter = submitters.max_by(&:completed_at) | ||||||
|  | 
 | ||||||
|  |         json[:documents] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents'] | ||||||
|  |         json[:status] = 'completed' | ||||||
|  |         json[:completed_at] = last_submitter.completed_at | ||||||
|  |       else | ||||||
|  |         json[:documents] = [] | ||||||
|  |         json[:status] = 'pending' | ||||||
|  |         json[:completed_at] = nil | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       json[:submitters] = serialized_submitters | ||||||
|  | 
 | ||||||
|  |       json | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
					Loading…
					
					
				
		Reference in new issue