diff --git a/app/controllers/submissions_download_controller.rb b/app/controllers/submissions_download_controller.rb index 87526281..e9ce7adc 100644 --- a/app/controllers/submissions_download_controller.rb +++ b/app/controllers/submissions_download_controller.rb @@ -4,8 +4,10 @@ class SubmissionsDownloadController < ApplicationController skip_before_action :authenticate_user! skip_authorization_check + TTL = 20.minutes + def index - submitter = Submitter.find_by(slug: params[:submitter_slug]) + submitter = Submitter.find_by!(slug: params[:submitter_slug]) Submissions::EnsureResultGenerated.call(submitter) @@ -13,6 +15,15 @@ class SubmissionsDownloadController < ApplicationController Submissions::EnsureResultGenerated.call(last_submitter) + return head :not_found unless last_submitter.completed_at? + + if last_submitter.completed_at < TTL.ago && + (current_user.nil? || !current_user.account.submitters.exists?(id: last_submitter.id)) + Rollbar.info("TTL: #{last_submitter.id}") if defined?(Rollbar) + + return head :not_found + end + urls = Submitters.select_attachments_for_download(last_submitter).map do |attachment| ActiveStorage::Blob.proxy_url(attachment.blob) diff --git a/app/controllers/submissions_preview_controller.rb b/app/controllers/submissions_preview_controller.rb index 878dfe26..12db79cf 100644 --- a/app/controllers/submissions_preview_controller.rb +++ b/app/controllers/submissions_preview_controller.rb @@ -6,9 +6,21 @@ class SubmissionsPreviewController < ApplicationController PRELOAD_ALL_PAGES_AMOUNT = 200 + TTL = 20.minutes + def show @submission = Submission.find_by!(slug: params[:slug]) + if !@submission.submitters.all?(&:completed_at?) && current_user.blank? + raise ActionController::RoutingError, 'Not Found' + end + + unless submission_valid_ttl?(@submission) + Rollbar.info("TTL: #{@submission.id}") if defined?(Rollbar) + + return redirect_to submissions_preview_completed_path(@submission.slug) + end + ActiveRecord::Associations::Preloader.new( records: [@submission], associations: [:template, { template_schema_documents: :blob }] @@ -26,4 +38,20 @@ class SubmissionsPreviewController < ApplicationController render 'submissions/show', layout: 'plain' end + + def completed + @submission = Submission.find_by!(slug: params[:submissions_preview_slug]) + + render :completed, layout: 'plain' + end + + private + + def submission_valid_ttl?(submission) + return true if current_user && current_user.account.submissions.exists?(id: submission.id) + + last_submitter = submission.submitters.select(&:completed_at?).max_by(&:completed_at) + + last_submitter && last_submitter.completed_at > TTL.ago + end end diff --git a/app/views/start_form/_banner.html.erb b/app/views/start_form/_banner.html.erb index 6b843a19..fb0cb60d 100644 --- a/app/views/start_form/_banner.html.erb +++ b/app/views/start_form/_banner.html.erb @@ -1 +1 @@ -<%= render 'docuseal_logo' %> +<%= render 'start_form/docuseal_logo' %> diff --git a/app/views/submissions_preview/completed.html.erb b/app/views/submissions_preview/completed.html.erb new file mode 100644 index 00000000..0379e8dc --- /dev/null +++ b/app/views/submissions_preview/completed.html.erb @@ -0,0 +1,30 @@ +
+
+
+ <% if Docuseal.multitenant? %> +
+ <%= render 'start_form/docuseal_logo' %> +
+ <% end %> +
+
+
+ <%= svg_icon('writing_sign', class: 'w-10 h-10') %> +
+
+

<%= @submission.template.name %>

+ <% if submitter = @submission.submitters.map(&:completed_at).max %> +

<%= t('signed_on_time', time: l(submitter.to_date, format: :long)) %>

+ <% end %> +
+
+
+
+ <% if Docuseal.multitenant? %> +
+ <%= link_to 'Create free account', registration_path, class: 'white-button w-full' %> +
+ <% end %> +
+
+<%= render 'shared/attribution', link_path: '/start' %> diff --git a/app/views/submit_form/completed.html.erb b/app/views/submit_form/completed.html.erb index 00167f64..4a103102 100644 --- a/app/views/submit_form/completed.html.erb +++ b/app/views/submit_form/completed.html.erb @@ -25,18 +25,20 @@
<% end %> <% end %> - - - <%= svg_icon('download', class: 'w-6 h-6') %> - <%= t('download_documents') %> - - - + <% if @submitter.completed_at > 15.minutes.ago || (current_user && current_user.account.submitters.exists?(id: @submitter.id)) %> + + + <%= svg_icon('download', class: 'w-6 h-6') %> + <%= t('download_documents') %> + + + + <% end %> - <% if @submitter.submission.template.submitters.size == 1 && %w[api embed].exclude?(@submitter.submission.source) && @submitter.account.account_configs.find_or_initialize_by(key: AccountConfig::ALLOW_TO_RESUBMIT).value != false %> + <% if @submitter.submission.template.submitters.size == 1 && %w[api embed].exclude?(@submitter.submission.source) && @submitter.account.account_configs.find_or_initialize_by(key: AccountConfig::ALLOW_TO_RESUBMIT).value != false && !@submitter.template.archived_at? %>
<%= t('or') %>
<%= button_to button_title(title: t('resubmit'), disabled_with: t('resubmit'), icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@submitter.submission.template.slug), params: { submitter: { email: @submitter.email, phone: @submitter.phone, name: @submitter.name }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %> diff --git a/config/routes.rb b/config/routes.rb index 88a6b0e6..9aef918c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -107,7 +107,9 @@ Rails.application.routes.draw do get :completed end - resources :submissions_preview, only: %i[show], path: 'e', param: 'slug' + resources :submissions_preview, only: %i[show], path: 'e', param: 'slug' do + get :completed + end resources :send_submission_email, only: %i[create] do get :success, on: :collection diff --git a/spec/system/submission_preview_spec.rb b/spec/system/submission_preview_spec.rb index aea89e3b..5449f63a 100644 --- a/spec/system/submission_preview_spec.rb +++ b/spec/system/submission_preview_spec.rb @@ -12,6 +12,8 @@ RSpec.describe 'Submission Preview' do let(:submitters) { template.submitters.map { |s| create(:submitter, submission:, uuid: s['uuid']) } } before do + sign_in(user) + visit submissions_preview_path(slug: submission.slug) end