Files
docuseal/lib/submitters/submit_values.rb
T

129 lines
3.7 KiB
Ruby
Raw Normal View History

2023-08-12 12:34:02 +03:00
# frozen_string_literal: true
module Submitters
module SubmitValues
2023-09-05 01:00:21 +03:00
ValidationError = Class.new(StandardError)
2023-11-05 01:41:54 +02:00
VARIABLE_REGEXP = /\{\{?(\w+)\}\}?/
2023-08-12 12:34:02 +03:00
module_function
2023-08-17 10:33:53 +03:00
def call(submitter, params, request)
2023-09-14 20:31:07 +03:00
Submissions.update_template_fields!(submitter.submission) if submitter.submission.template_fields.blank?
2023-09-10 12:55:41 +03:00
2023-09-14 20:31:07 +03:00
unless submitter.submission_events.exists?(event_type: 'start_form')
2023-09-10 12:55:41 +03:00
SubmissionEvents.create_with_tracking_data(submitter, 'start_form', request)
2023-09-14 20:31:07 +03:00
SendFormStartedWebhookRequestJob.perform_later(submitter)
2023-09-10 12:55:41 +03:00
end
2023-08-12 12:34:02 +03:00
2023-09-05 01:00:21 +03:00
update_submitter!(submitter, params, request)
2023-08-12 12:34:02 +03:00
submitter.submission.save!
2023-11-30 21:36:57 +02:00
ProcessSubmitterCompletionJob.perform_later(submitter) if submitter.completed_at?
2023-08-12 12:34:02 +03:00
submitter
end
2023-08-17 10:33:53 +03:00
def update_submitter!(submitter, params, request)
2023-09-05 01:00:21 +03:00
values = normalized_values(params)
submitter.values.merge!(values)
2023-08-12 12:34:02 +03:00
submitter.opened_at ||= Time.current
2023-08-17 10:33:53 +03:00
if params[:completed] == 'true'
submitter.completed_at = Time.current
submitter.ip = request.remote_ip
submitter.ua = request.user_agent
2023-11-05 01:41:54 +02:00
submitter.values = merge_default_values(submitter)
2023-08-17 10:33:53 +03:00
end
2023-09-27 23:28:33 +03:00
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
2023-08-12 12:34:02 +03:00
submitter
end
def normalized_values(params)
params.fetch(:values, {}).to_unsafe_h.transform_values do |v|
if params[:cast_boolean] == 'true'
v == 'true'
2023-09-05 01:00:21 +03:00
elsif params[:normalize_phone] == 'true'
v.to_s.gsub(/[^0-9+]/, '')
2023-08-12 12:34:02 +03:00
else
v.is_a?(Array) ? v.compact_blank : v
end
end
end
2023-09-05 01:00:21 +03:00
2023-09-27 23:28:33 +03:00
def validate_values!(values, submitter, params, request)
2023-09-05 01:00:21 +03:00
values.each do |key, value|
field = submitter.submission.template_fields.find { |e| e['uuid'] == key }
2023-09-27 23:28:33 +03:00
validate_value!(value, field, params, submitter, request)
2023-09-05 01:00:21 +03:00
end
end
2023-11-05 01:41:54 +02:00
def merge_default_values(submitter)
default_values = submitter.submission.template_fields.each_with_object({}) do |field, acc|
next if field['submitter_uuid'] != submitter.uuid
value = field['default_value']
next if value.blank?
acc[field['uuid']] = template_default_value_for_submitter(value, submitter, with_time: true)
end
default_values.compact_blank.merge(submitter.values)
end
def template_default_value_for_submitter(value, submitter, with_time: false)
return if value.blank?
2023-11-15 16:19:00 +02:00
return if submitter.blank?
2023-11-05 01:41:54 +02:00
role = submitter.submission.template_submitters.find { |e| e['uuid'] == submitter.uuid }['name']
replace_default_variables(value,
submitter.attributes.merge('role' => role),
submitter.submission.template,
with_time:)
end
def replace_default_variables(value, attrs, template, with_time: false)
return if value.blank?
value.gsub(VARIABLE_REGEXP) do |e|
case key = ::Regexp.last_match(1)
when 'time'
if with_time
I18n.l(Time.current.in_time_zone(template.account.timezone), format: :long, locale: template.account.locale)
2023-11-06 13:36:38 +02:00
else
e
2023-11-05 01:41:54 +02:00
end
when 'date'
2023-11-06 13:36:38 +02:00
if with_time
I18n.l(Time.current.in_time_zone(template.account.timezone).to_date)
else
e
end
when 'role', 'email', 'phone', 'name'
2023-11-05 01:41:54 +02:00
attrs[key] || e
else
e
end
end
end
2023-09-27 23:28:33 +03:00
def validate_value!(_value, _field, _params, _submitter, _request)
2023-09-05 01:00:21 +03:00
true
end
2023-08-12 12:34:02 +03:00
end
end