diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index a83a1e5b..aa4db085 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -147,6 +147,7 @@ module Api def submissions_params permitted_attrs = [ :send_email, :send_sms, :bcc_completed, :completed_redirect_url, :reply_to, :go_to_last, + :expire_at, { message: %i[subject body], submitters: [[:send_email, :send_sms, :completed_redirect_url, :uuid, :name, :email, :role, diff --git a/app/controllers/start_form_controller.rb b/app/controllers/start_form_controller.rb index d5f033c2..3d73410d 100644 --- a/app/controllers/start_form_controller.rb +++ b/app/controllers/start_form_controller.rb @@ -17,7 +17,8 @@ class StartFormController < ApplicationController def update return redirect_to start_form_path(@template.slug) if @template.archived_at? - @submitter = Submitter.where(submission: @template.submissions.where(archived_at: nil)) + @submitter = Submitter.where(submission: @template.submissions.where(expire_at: Time.current..) + .or(@template.submissions.where(expire_at: nil)).where(archived_at: nil)) .order(id: :desc) .then { |rel| params[:resubmit].present? ? rel.where(completed_at: nil) : rel } .find_or_initialize_by(**submitter_params.compact_blank) diff --git a/app/controllers/submit_form_controller.rb b/app/controllers/submit_form_controller.rb index 7f32f5d5..87cc217f 100644 --- a/app/controllers/submit_form_controller.rb +++ b/app/controllers/submit_form_controller.rb @@ -14,6 +14,7 @@ class SubmitFormController < ApplicationController return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at? return render :archived if @submitter.submission.template.archived_at? || @submitter.submission.archived_at? + return render :expired if @submitter.submission.expired? Submitters.preload_with_pages(@submitter) @@ -51,6 +52,10 @@ class SubmitFormController < ApplicationController return render json: { error: 'Form has been archived.' }, status: :unprocessable_entity end + if submitter.submission.expired? + return render json: { error: 'Form has been expired.' }, status: :unprocessable_entity + end + Submitters::SubmitValues.call(submitter, params, request) head :ok diff --git a/app/models/submission.rb b/app/models/submission.rb index 55bb8fcd..353af713 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -6,6 +6,7 @@ # # id :bigint not null, primary key # archived_at :datetime +# expire_at :datetime # preferences :text not null # slug :string not null # source :text not null @@ -75,6 +76,10 @@ class Submission < ApplicationRecord preserved: 'preserved' }, scope: false, prefix: true + def expired? + expire_at && expire_at <= Time.current + end + def audit_trail_url return if audit_trail.blank? diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index 4fe01ca2..41d3b29e 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -54,7 +54,7 @@ <% end %> - <% elsif @submission.submitters.to_a.size == 1 %> + <% elsif @submission.submitters.to_a.size == 1 && !@submission.expired? %> <%= render 'shared/clipboard_copy', text: start_form_url(slug: @submission.template.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy Share Link', copied_title: 'Copied to Clipboard' %> <% end %> @@ -146,15 +146,15 @@ <%= submitter&.completed_at? ? l(submitter.completed_at.in_time_zone(@submission.account.timezone), format: :long, locale: @submission.account.locale) : 'Not completed yet' %> - <% if signed_in? && submitter && submitter.email && !submitter.completed_at && !@submission.archived_at? && can?(:update, submitter) && Accounts.can_send_emails?(current_account) %> + <% if signed_in? && submitter && submitter.email && !submitter.completed_at && !@submission.archived_at? && can?(:update, submitter) && Accounts.can_send_emails?(current_account) && !@submission.expired? %>