preserve submitter preferences

This commit is contained in:
Pete Matsyburka
2023-11-23 20:03:52 +02:00
parent 514987138a
commit 01333e5b2e
19 changed files with 252 additions and 65 deletions
+17
View File
@@ -0,0 +1,17 @@
# frozen_string_literal: true
module EmailMessages
module_function
def find_or_create_for_account_user(account, user, subject, body)
subject = SubmitterMailer::DEFAULT_INVITATION_SUBJECT if subject.blank?
sha1 = Digest::SHA1.hexdigest({ subject:, body: }.to_json)
message = account.email_messages.find_by(sha1:)
message ||= account.email_messages.create!(author: user, subject:, body:)
message
end
end
+13 -7
View File
@@ -27,11 +27,17 @@ module Submissions
submission.save!
end
def create_from_emails(template:, user:, emails:, source:, mark_as_sent: false)
def create_from_emails(template:, user:, emails:, source:, mark_as_sent: false, params: {})
preferences = Submitters.normalize_preferences(template.account, user, params)
parse_emails(emails).uniq.map do |email|
submission = template.submissions.new(created_by_user: user, source:, template_submitters: template.submitters)
submission = template.submissions.new(created_by_user: user,
source:,
template_submitters: template.submitters)
submission.submitters.new(email: normalize_email(email),
uuid: template.submitters.first['uuid'],
preferences:,
sent_at: mark_as_sent ? Time.current : nil)
submission.tap(&:save!)
@@ -45,13 +51,13 @@ module Submissions
end
def create_from_submitters(template:, user:, submissions_attrs:, source:, mark_as_sent: false,
submitters_order: DEFAULT_SUBMITTERS_ORDER)
submitters_order: DEFAULT_SUBMITTERS_ORDER, params: {})
Submissions::CreateFromSubmitters.call(
template:, user:, submissions_attrs:, source:, mark_as_sent:, submitters_order:
template:, user:, submissions_attrs:, source:, mark_as_sent:, submitters_order:, params:
)
end
def send_signature_requests(submissions, params)
def send_signature_requests(submissions)
submissions.each do |submission|
submitters = submission.submitters.reject(&:completed_at?)
@@ -59,9 +65,9 @@ module Submissions
first_submitter =
submission.template_submitters.filter_map { |s| submitters.find { |e| e.uuid == s['uuid'] } }.first
Submitters.send_signature_requests([first_submitter], params)
Submitters.send_signature_requests([first_submitter])
else
Submitters.send_signature_requests(submitters, params)
Submitters.send_signature_requests(submitters)
end
end
end
+11 -3
View File
@@ -4,7 +4,9 @@ module Submissions
module CreateFromSubmitters
module_function
def call(template:, user:, submissions_attrs:, source:, submitters_order:, mark_as_sent: false)
def call(template:, user:, submissions_attrs:, source:, submitters_order:, mark_as_sent: false, params: {})
preferences = Submitters.normalize_preferences(template.account, user, params)
Array.wrap(submissions_attrs).map do |attrs|
submission = template.submissions.new(created_by_user: user, source:,
template_submitters: template.submitters, submitters_order:)
@@ -18,7 +20,11 @@ module Submissions
is_order_sent = submitters_order == 'random' || index.zero?
build_submitter(submission:, attrs: submitter_attrs, uuid:, is_order_sent:, mark_as_sent:)
submission_preferences = Submitters.normalize_preferences(template.account, user, attrs)
build_submitter(submission:, attrs: submitter_attrs, uuid:,
is_order_sent:, mark_as_sent:, user:,
preferences: preferences.merge(submission_preferences))
end
submission.tap(&:save!)
@@ -85,8 +91,9 @@ module Submissions
template.submitters[index]&.dig('uuid')
end
def build_submitter(submission:, attrs:, uuid:, is_order_sent:, mark_as_sent:)
def build_submitter(submission:, attrs:, uuid:, is_order_sent:, mark_as_sent:, user:, preferences:)
email = Submissions.normalize_email(attrs[:email])
submitter_preferences = Submitters.normalize_preferences(submission.account, user, attrs)
submission.submitters.new(
email:,
@@ -96,6 +103,7 @@ module Submissions
completed_at: attrs[:completed] ? Time.current : nil,
sent_at: mark_as_sent && email.present? && is_order_sent ? Time.current : nil,
values: attrs[:values] || {},
preferences: preferences.merge(submitter_preferences),
uuid:
)
end
+22 -11
View File
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module Submitters
TRUE_VALUES = ['1', 'true', true].freeze
module_function
def search(submitters, keyword)
@@ -43,21 +45,30 @@ module Submitters
)
end
def send_signature_requests(submitters, params)
return if params[:send_email] != true && params[:send_email] != '1'
def normalize_preferences(account, user, params)
preferences = {}
message_params = params['message'].presence || params.slice('subject', 'body').presence
if message_params.present?
email_message = EmailMessages.find_or_create_for_account_user(account, user,
message_params['subject'],
message_params['body'])
end
preferences['email_message_uuid'] = email_message.uuid if email_message
preferences['send_email'] = params['send_email'].in?(TRUE_VALUES) if params.key?('send_email')
preferences['send_sms'] = params['send_sms'].in?(TRUE_VALUES) if params.key?('send_sms')
preferences
end
def send_signature_requests(submitters)
submitters.each do |submitter|
next if submitter.email.blank?
next if submitter.preferences['send_email'] == false
enqueue_invitation_email(submitter, params)
SendSubmitterInvitationEmailJob.perform_later('submitter_id' => submitter.id)
end
end
def enqueue_invitation_email(submitter, params)
subject, body = params.values_at(:subject, :body) if params[:is_custom_message] == '1'
SendSubmitterInvitationEmailJob.perform_later('submitter_id' => submitter.id,
'body' => body,
'subject' => subject)
end
end