-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathsubmission_email_input.rb
More file actions
99 lines (79 loc) · 3.29 KB
/
submission_email_input.rb
File metadata and controls
99 lines (79 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
class Forms::SubmissionEmailInput < BaseInput
attr_accessor :form, :temporary_submission_email, :email_code, :confirmation_code, :current_user, :notify_response_id
EMAIL_REGEX = /.*@.*/
validates :temporary_submission_email, presence: true
validates :temporary_submission_email, format: { with: EMAIL_REGEX, message: :invalid_email }
validates :temporary_submission_email, allowed_email_domain: true
EMAIL_CODE_REGEX = /[0-9]{6}/
validates :email_code, format: { with: EMAIL_CODE_REGEX, message: :invalid_email_code }, if: -> { email_code.present? }
validate :email_code_matches_confirmation_code
def submit
return false if invalid?
confirmation_code = generate_confirmation_code
form_submission_email = FormSubmissionEmail.find_by_form_id(form.id)
form_processed = if form_submission_email.nil?
create_submission_email_record(confirmation_code)
else
update_submission_email_record(confirmation_code, form_submission_email)
end
if form_processed && temporary_submission_email.present?
# send notify email?
Rails.logger.info "Email sent to #{temporary_submission_email} with code #{confirmation_code}"
SubmissionEmailMailer.send_confirmation_code(
new_submission_email: temporary_submission_email,
form_name: form.name,
confirmation_code:,
notify_response_id:,
current_user:,
).deliver_now
true
else
false
end
end
def confirm_confirmation_code
return false if invalid?
# Update the submission email in the form
form.submission_email = temporary_submission_email
FormRepository.save!(form)
mark_submission_email_as_confirmed
end
def mark_submission_email_as_confirmed
self.confirmation_code = nil
form_submission_email = FormSubmissionEmail.find_by_form_id(form.id)
form_submission_email.update!(confirmation_code: nil, updated_by_name: current_user.name, updated_by_email: current_user.email)
end
def assign_form_values
form_submission_email = FormSubmissionEmail.find_by_form_id(form.id)
if form_submission_email.nil?
self.temporary_submission_email = form.submission_email
else
self.temporary_submission_email = form_submission_email.temporary_submission_email
self.confirmation_code = form_submission_email.confirmation_code
end
self.notify_response_id ||= SecureRandom.uuid
self
end
private
def generate_confirmation_code
SecureRandom.random_number(10**6).to_s.rjust(6, "0")
end
def email_code_matches_confirmation_code
if confirmation_code.present? && email_code != confirmation_code
errors.add(:email_code, :email_code_mismatch)
end
end
def create_submission_email_record(confirmation_code)
FormSubmissionEmail.create!(form_id: form.id,
temporary_submission_email:,
confirmation_code:,
created_by_name: current_user.name,
created_by_email: current_user.email)
end
def update_submission_email_record(confirmation_code, form)
form.update(temporary_submission_email:,
confirmation_code:,
updated_by_name: current_user.name,
updated_by_email: current_user.email)
end
end