mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							77 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
	
	
							77 lines
						
					
					
						
							2.1 KiB
						
					
					
				| # frozen_string_literal: true
 | |
| 
 | |
| module Submitters
 | |
|   module SubmitValues
 | |
|     ValidationError = Class.new(StandardError)
 | |
| 
 | |
|     module_function
 | |
| 
 | |
|     def call(submitter, params, request)
 | |
|       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)
 | |
| 
 | |
|       submitter.submission.save!
 | |
| 
 | |
|       return submitter unless submitter.completed_at?
 | |
| 
 | |
|       ProcessSubmitterCompletionJob.perform_later(submitter)
 | |
| 
 | |
|       submitter
 | |
|     end
 | |
| 
 | |
|     def update_submitter!(submitter, params, request)
 | |
|       values = normalized_values(params)
 | |
| 
 | |
|       submitter.values.merge!(values)
 | |
|       submitter.opened_at ||= Time.current
 | |
| 
 | |
|       if params[:completed] == 'true'
 | |
|         submitter.completed_at = Time.current
 | |
|         submitter.ip = request.remote_ip
 | |
|         submitter.ua = request.user_agent
 | |
|       end
 | |
| 
 | |
|       ApplicationRecord.transaction do
 | |
|         validate_values!(values, submitter, params, request)
 | |
| 
 | |
|         SubmissionEvents.create_with_tracking_data(submitter, 'complete_form', request) if params[:completed] == 'true'
 | |
| 
 | |
|         submitter.save!
 | |
|       end
 | |
| 
 | |
|       submitter
 | |
|     end
 | |
| 
 | |
|     def normalized_values(params)
 | |
|       params.fetch(:values, {}).to_unsafe_h.transform_values do |v|
 | |
|         if params[:cast_boolean] == 'true'
 | |
|           v == 'true'
 | |
|         elsif params[:normalize_phone] == 'true'
 | |
|           v.to_s.gsub(/[^0-9+]/, '')
 | |
|         else
 | |
|           v.is_a?(Array) ? v.compact_blank : v
 | |
|         end
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def validate_values!(values, submitter, params, request)
 | |
|       values.each do |key, value|
 | |
|         field = submitter.submission.template_fields.find { |e| e['uuid'] == key }
 | |
| 
 | |
|         validate_value!(value, field, params, submitter, request)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def validate_value!(_value, _field, _params, _submitter, _request)
 | |
|       true
 | |
|     end
 | |
|   end
 | |
| end
 |