Skip to content

Commit 6a3a185

Browse files
authored
Merge from docusealco/wip
2 parents d86b16d + 7d381b7 commit 6a3a185

76 files changed

Lines changed: 1736 additions & 227 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/controllers/api/submission_documents_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def index
3030
private
3131

3232
def build_completed_documents(submission, merge: false)
33-
last_submitter = submission.submitters.max_by(&:completed_at)
33+
last_submitter = submission.submitters.select(&:completed_at?).max_by(&:completed_at)
3434

3535
if merge
3636
if submission.merged_document_attachment.blank?

app/controllers/api/submissions_controller.rb

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class SubmissionsController < ApiBaseController
77
TEMPLATE_COLUMNS = %i[id name external_id created_at updated_at folder_id submitters].freeze
88

99
load_and_authorize_resource :template, only: :create
10-
load_and_authorize_resource :submission, only: %i[show index destroy]
10+
load_and_authorize_resource :submission, only: %i[show index update destroy]
1111

1212
before_action only: :create do
1313
authorize!(:create, Submission)
@@ -80,8 +80,9 @@ def create
8080
Submissions.send_signature_requests(submissions)
8181

8282
submissions.each do |submission|
83-
if submission.submitters.all?(&:completed_at?) && Submissions.maybe_update_completed_at(submission)
84-
last_submitter = submission.submitters.max_by(&:completed_at)
83+
if submission.submitters.all? { |s| s.viewer? || s.completed_at? } &&
84+
Submissions.maybe_update_completed_at(submission)
85+
last_submitter = submission.submitters.reject(&:viewer?).max_by(&:completed_at)
8586
end
8687

8788
submission.submitters.each do |submitter|
@@ -103,6 +104,25 @@ def create
103104
render json: { error: e.message }, status: :unprocessable_content
104105
end
105106

107+
def update
108+
@submission = assign_submission_attrs(@submission, submission_params)
109+
110+
@submission.save!
111+
112+
if @submission.saved_change_to_archived_at? && @submission.archived_at?
113+
WebhookUrls.enqueue_events(@submission, 'submission.archived')
114+
end
115+
116+
if @submission.saved_change_to_expire_at? && @submission.expire_at?
117+
ProcessSubmissionExpiredJob.perform_at(@submission.expire_at, 'submission_id' => @submission.id,
118+
'expire_at' => @submission.expire_at.to_i)
119+
end
120+
121+
SearchEntries.enqueue_reindex(@submission) if @submission.saved_change_to_name?
122+
123+
render json: Submissions::SerializeForApi.call(@submission, nil, params, with_events: false)
124+
end
125+
106126
def destroy
107127
if params[:permanently].in?(['true', true])
108128
@submission.destroy!
@@ -117,6 +137,25 @@ def destroy
117137

118138
private
119139

140+
def assign_submission_attrs(submission, attrs)
141+
archived = attrs.key?(:archived) ? attrs[:archived] : attrs[:archived_at]
142+
143+
if archived.in?([true, false, 'true', 'false']) && current_ability.can?(:destroy, submission)
144+
submission.archived_at = archived.in?(Submitters::TRUE_VALUES) ? Time.current : nil
145+
end
146+
147+
submission.name = attrs[:name] if attrs.key?(:name)
148+
submission.expire_at = attrs[:expire_at].presence if attrs.key?(:expire_at)
149+
150+
submission
151+
end
152+
153+
def submission_params
154+
submission_params = params.key?(:submission) ? params.require(:submission) : params
155+
156+
submission_params.permit(:name, :expire_at, :archived, :archived_at)
157+
end
158+
120159
def maybe_return_template_error
121160
return render json: { error: 'Template not found' }, status: :unprocessable_content if @template.nil?
122161

app/controllers/api/submitters_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def submitter_params
101101
private
102102

103103
def maybe_return_submitter_error
104-
if @submitter.completed_at?
104+
if @submitter.completed_at? || @submitter.submission.completed_at?
105105
return render json: { error: 'Submitter has already completed the submission.' }, status: :unprocessable_content
106106
end
107107

app/controllers/api/templates_controller.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ class TemplatesController < ApiBaseController
55
load_and_authorize_resource :template
66

77
def index
8+
@templates = Templates.shared(current_user) if params[:shared].in?(['true', true])
9+
810
templates = filter_templates(@templates, params)
911

1012
templates = paginate(templates.preload(:author, folder: :parent_folder))
@@ -54,7 +56,7 @@ def update
5456

5557
@template.update!(template_params)
5658

57-
SearchEntries.enqueue_reindex(@template)
59+
SearchEntries.enqueue_reindex(@template) if @template.saved_change_to_name?
5860

5961
WebhookUrls.enqueue_events(@template, 'template.updated')
6062

@@ -115,7 +117,13 @@ def preload_relations(templates)
115117
end
116118

117119
def filter_templates(templates, params)
118-
templates = Templates.search(current_user, templates, params[:q])
120+
templates =
121+
if params[:shared].in?(['true', true])
122+
Templates.search_shared(current_user, templates, params[:q])
123+
else
124+
Templates.search(current_user, templates, params[:q])
125+
end
126+
119127
templates = params[:archived].in?(['true', true]) ? templates.archived : templates.active
120128
templates = templates.where(external_id: params[:application_key]) if params[:application_key].present?
121129
templates = templates.where(external_id: params[:external_id]) if params[:external_id].present?

app/controllers/email_smtp_settings_controller.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
class EmailSmtpSettingsController < ApplicationController
44
before_action :load_encrypted_config
55
authorize_resource :encrypted_config, only: :index
6-
authorize_resource :encrypted_config, parent: false, only: :create
6+
authorize_resource :encrypted_config, parent: false, only: %i[create destroy]
77

88
def index; end
99

@@ -23,6 +23,12 @@ def create
2323
render :index, status: :unprocessable_content
2424
end
2525

26+
def destroy
27+
@encrypted_config.destroy!
28+
29+
redirect_to settings_email_index_path, notice: I18n.t('smtp_settings_have_been_reset')
30+
end
31+
2632
private
2733

2834
def load_encrypted_config

app/controllers/send_submission_email_controller.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,16 @@ def create
1616
@submitter =
1717
Submitter.completed.where(submission: template.submissions).find_by(email: params[:email].to_s.downcase)
1818
elsif params[:submission_slug]
19-
submission = Submission.find_by(slug: params[:submission_slug])
19+
submission = Submission.find_by!(slug: params[:submission_slug])
2020

21-
if submission
22-
@submitter = Submitter.completed.find_by(submission: submission, email: params[:email].to_s.downcase)
23-
end
21+
@submitter = submission.submitters.order(:completed_at).find_by(email: params[:email].to_s.downcase)
2422

2523
return redirect_to submissions_preview_completed_path(params[:submission_slug], status: :error) unless @submitter
2624
else
27-
@submitter = Submitter.completed.find_by!(slug: params[:submitter_slug])
25+
@submitter = Submitter.find_by!(slug: params[:submitter_slug])
2826
end
2927

30-
if @submitter
28+
if @submitter && completed_submitter?(@submitter)
3129
RateLimit.call("send-email-#{@submitter.id}", limit: 2, ttl: 5.minutes)
3230

3331
SubmitterMailer.documents_copy_email(@submitter, sig: true).deliver_later! if can_send?(@submitter)
@@ -41,6 +39,10 @@ def create
4139

4240
private
4341

42+
def completed_submitter?(submitter)
43+
submitter.completed_at? || (submitter.viewer? && submitter.submission.completed_at?)
44+
end
45+
4446
def can_send?(submitter)
4547
return false if submitter.account.archived_at?
4648
return false if EmailEvent.exists?(tag: :submitter_documents_copy, email: submitter.email, emailable: submitter,

app/controllers/start_form_controller.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,12 @@ def enqueue_new_submitter_jobs(submitter)
9393

9494
SearchEntries.enqueue_reindex(submitter)
9595

96-
return unless submitter.submission.expire_at?
96+
expire_at = submitter.submission.expire_at
9797

98-
ProcessSubmissionExpiredJob.perform_at(submitter.submission.expire_at, 'submission_id' => submitter.submission_id)
98+
return unless expire_at
99+
100+
ProcessSubmissionExpiredJob.perform_at(expire_at, 'submission_id' => submitter.submission_id,
101+
'expire_at' => expire_at.to_i)
99102
end
100103

101104
def load_resubmit_submitter
@@ -138,15 +141,16 @@ def find_or_initialize_submitter(template, submitter_params)
138141

139142
submitter ||=
140143
Submitter
141-
.where(submission: template.submissions.where(expire_at: Time.current..)
142-
.or(template.submissions.where(expire_at: nil)).where(archived_at: nil))
144+
.where(submission: template.submissions.non_expired.active)
143145
.order(id: :desc)
144146
.where(declined_at: nil)
145147
.where(external_id: nil)
146148
.where(template.preferences['shared_link_2fa'] == true ? {} : { ip: [nil, request.remote_ip] })
147149
.then { |rel| params[:resubmit].present? || params[:selfsign].present? ? rel.where(completed_at: nil) : rel }
148150
.find_or_initialize_by(find_params)
149151

152+
submitter = Submitter.new(find_params) if submitter.submission&.completed_at? && submitter.viewer?
153+
150154
submitter.name = required_params['name'] if submitter.new_record?
151155

152156
unless @resubmit_submitter

app/controllers/submissions_controller.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ def destroy
8787
private
8888

8989
def create_submissions(template, submissions_params, params)
90+
normalize_message_submitter_uuids!(params)
91+
9092
submissions_attrs = submissions_params[:submission].to_h.values
9193

9294
submissions_attrs, _, new_fields =
@@ -111,4 +113,23 @@ def save_template_message(template, params)
111113
def submissions_params
112114
params.permit(submission: { submitters: [:uuid, :email, :phone, :name, { values: {} }] })
113115
end
116+
117+
def normalize_message_submitter_uuids!(params)
118+
return if params[:request_email_per_submitter] == '1'
119+
120+
uuids = params[:email_message_submitter_uuids]
121+
122+
return if uuids.blank?
123+
return if params[:subject].blank? && params[:body].blank?
124+
125+
params[:submitter_preferences] =
126+
Array.wrap(uuids).index_with { { 'subject' => params[:subject], 'body' => params[:body] } }
127+
128+
params[:request_email_per_submitter] = '1'
129+
130+
params.delete(:subject)
131+
params.delete(:body)
132+
133+
params
134+
end
114135
end

app/controllers/submit_form_completed_download_controller.rb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def index
1919

2020
@submitter ||= Submitter.find_by!(slug: submitter_slug)
2121

22-
Submissions::EnsureResultGenerated.call(@submitter)
22+
Submissions::EnsureResultGenerated.call(@submitter) if @submitter.completed_at?
2323

2424
last_submitter = @submitter.submission.submitters.where.not(completed_at: nil).order(:completed_at).last
2525

@@ -28,11 +28,7 @@ def index
2828
Submissions::EnsureResultGenerated.call(last_submitter)
2929

3030
if !signature_valid && !current_user_submitter?(last_submitter)
31-
unless Submitters::AuthorizedForForm.call(@submitter, current_user, request)
32-
Rollbar.info("2FA download error: #{last_submitter.id}") if defined?(Rollbar)
33-
34-
return head :not_found
35-
end
31+
return head :not_found unless Submitters::AuthorizedForForm.call(@submitter, current_user, request)
3632

3733
if last_submitter.completed_at < TTL.ago
3834
Rollbar.info("TTL: #{last_submitter.id}") if defined?(Rollbar)

app/controllers/submit_form_controller.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ def show
1818
submission = @submitter.submission
1919

2020
return render :email_2fa unless Submitters::AuthorizedForForm.pass_email_2fa?(@submitter, request)
21-
return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at?
21+
22+
if @submitter.completed_at? || submission.completed_at?
23+
return redirect_to submit_form_completed_path(@submitter.slug)
24+
end
2225

2326
@form_configs = Submitters::FormConfigs.call(@submitter, CONFIG_KEYS)
2427

@@ -71,6 +74,12 @@ def update
7174
status: :unprocessable_content
7275
end
7376

77+
if @submitter.viewer?
78+
Rollbar.warning("Submit viewer: #{@submitter.id}") if defined?(Rollbar)
79+
80+
return render json: { error: I18n.t('form_is_view_only') }, status: :unprocessable_content
81+
end
82+
7483
Submitters::SubmitValues.call(@submitter, params, request)
7584

7685
head :ok

0 commit comments

Comments
 (0)