@@ -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
0 commit comments