diff --git a/app/controllers/start_controller.rb b/app/controllers/start_controller.rb index f3f793a17..bc89cd7f8 100644 --- a/app/controllers/start_controller.rb +++ b/app/controllers/start_controller.rb @@ -1,4 +1,6 @@ class StartController < ApplicationController + include CollectionResourcesHelper + def index if current_user @homepage_presenter = HomepagePresenter.new(current_user) @@ -7,114 +9,76 @@ class StartController < ApplicationController end def download_24_25_sales_form - send_file( - Rails.root.join("public/files/2024_25_sales_paper_form.pdf"), - filename: "2024-25 Sales paper form.pdf", - type: "application/pdf", - ) + download_resource("2024_25_sales_paper_form.pdf", "2024-25 Sales paper form.pdf") end def download_23_24_sales_form - send_file( - Rails.root.join("public/files/2023_24_sales_paper_form.pdf"), - filename: "2023-24 Sales paper form.pdf", - type: "application/pdf", - ) + download_resource("2023_24_sales_paper_form.pdf", "2023-24 Sales paper form.pdf") end def download_24_25_lettings_form - send_file( - Rails.root.join("public/files/2024_25_lettings_paper_form.pdf"), - filename: "2024-25 Lettings paper form.pdf", - type: "application/pdf", - ) + download_resource("2024_25_lettings_paper_form.pdf", "2024-25 Lettings paper form.pdf") end def download_23_24_lettings_form - send_file( - Rails.root.join("public/files/2023_24_lettings_paper_form.pdf"), - filename: "2023-24 Lettings paper form.pdf", - type: "application/pdf", - ) + download_resource("2023_24_lettings_paper_form.pdf", "2023-24 Lettings paper form.pdf") end def download_24_25_lettings_bulk_upload_template - send_file( - Rails.root.join("public/files/bulk-upload-lettings-template-2024-25.xlsx"), - filename: "2024-25-lettings-bulk-upload-template.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-lettings-template-2024-25.xlsx", "2024-25-lettings-bulk-upload-template.xlsx") end def download_24_25_lettings_bulk_upload_specification - send_file( - Rails.root.join("public/files/bulk-upload-lettings-specification-2024-25.xlsx"), - filename: "2024-25-lettings-bulk-upload-specification.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-lettings-specification-2024-25.xlsx", "2024-25-lettings-bulk-upload-specification.xlsx") end def download_24_25_sales_bulk_upload_template - send_file( - Rails.root.join("public/files/bulk-upload-sales-template-2024-25.xlsx"), - filename: "2024-25-sales-bulk-upload-template.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-sales-template-2024-25.xlsx", "2024-25-sales-bulk-upload-template.xlsx") end def download_24_25_sales_bulk_upload_specification - send_file( - Rails.root.join("public/files/bulk-upload-sales-specification-2024-25.xlsx"), - filename: "2024-25-sales-bulk-upload-specification.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-sales-specification-2024-25.xlsx", "2024-25-sales-bulk-upload-specification.xlsx") end def download_23_24_lettings_bulk_upload_template - send_file( - Rails.root.join("public/files/bulk-upload-lettings-template-2023-24.xlsx"), - filename: "2023-24-lettings-bulk-upload-template.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-lettings-template-2023-24.xlsx", "2023-24-lettings-bulk-upload-template.xlsx") end def download_23_24_lettings_bulk_upload_legacy_template - send_file( - Rails.root.join("public/files/bulk-upload-lettings-legacy-template-2023-24.xlsx"), - filename: "2023-24-lettings-bulk-upload-legacy-template.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-lettings-legacy-template-2023-24.xlsx", "2023-24-lettings-bulk-upload-legacy-template.xlsx") end def download_23_24_lettings_bulk_upload_specification - send_file( - Rails.root.join("public/files/bulk-upload-lettings-specification-2023-24.xlsx"), - filename: "2023-24-lettings-bulk-upload-specification.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-lettings-specification-2023-24.xlsx", "2023-24-lettings-bulk-upload-specification.xlsx") end def download_23_24_sales_bulk_upload_template - send_file( - Rails.root.join("public/files/bulk-upload-sales-template-2023-24.xlsx"), - filename: "2023-24-sales-bulk-upload-template.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-sales-template-2023-24.xlsx", "2023-24-sales-bulk-upload-template.xlsx") end def download_23_24_sales_bulk_upload_legacy_template - send_file( - Rails.root.join("public/files/bulk-upload-sales-legacy-template-2023-24.xlsx"), - filename: "2023-24-sales-bulk-upload-legacy-template.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-sales-legacy-template-2023-24.xlsx", "2023-24-sales-bulk-upload-legacy-template.xlsx") end def download_23_24_sales_bulk_upload_specification - send_file( - Rails.root.join("public/files/bulk-upload-sales-specification-2023-24.xlsx"), - filename: "2023-24-sales-bulk-upload-specification.xlsx", - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ) + download_resource("bulk-upload-sales-specification-2023-24.xlsx", "2023-24-sales-bulk-upload-specification.xlsx") + end + +private + + def download_resource(file, filename) + url = "https://#{Rails.application.config.collection_resources_s3_bucket_name}.s3.amazonaws.com/#{file}" + uri = URI.parse(url) + + response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| + request = Net::HTTP::Get.new(uri) + http.request(request) + end + + if response.is_a?(Net::HTTPSuccess) + send_data(response.body, disposition: "attachment", filename:) + else + render_not_found + end end end diff --git a/app/helpers/collection_resources_helper.rb b/app/helpers/collection_resources_helper.rb index a85670bda..797fda2e1 100644 --- a/app/helpers/collection_resources_helper.rb +++ b/app/helpers/collection_resources_helper.rb @@ -1,15 +1,26 @@ module CollectionResourcesHelper + HUMAN_READABLE_CONTENT_TYPE = { "application/pdf": "PDF", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "Microsoft Excel", + "application/vnd.ms-excel": "Microsoft Excel (Old Format)", + "application/msword": "Microsoft Word", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "Microsoft Word (DOCX)", + "image/jpeg": "JPEG Image", + "image/png": "PNG Image", + "text/plain": "Text Document", + "text/html": "HTML Document" }.freeze + def file_type_size_and_pages(file, number_of_pages: nil) - extension_mapping = { - "xlsx" => "Microsoft Excel", - "pdf" => "PDF", - } - extension = File.extname(file)[1..] + file_pages = number_of_pages ? pluralize(number_of_pages, "page") : nil + url = "https://#{Rails.application.config.collection_resources_s3_bucket_name}.s3.amazonaws.com/#{file}" + uri = URI.parse(url) - file_type = extension_mapping.fetch(extension, extension) + response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http| + http.request_head(uri) + end + return [file_pages].compact.join(", ") unless response.is_a?(Net::HTTPSuccess) || response.is_a?(Net::HTTPRedirection) - file_size = number_to_human_size(File.size("public/files/#{file}"), precision: 0, significant: false) - file_pages = number_of_pages ? pluralize(number_of_pages, "page") : nil + file_size = number_to_human_size(response["Content-Length"].to_i) + file_type = HUMAN_READABLE_CONTENT_TYPE[response["Content-Type"].to_sym] || "Unknown File Type" [file_type, file_size, file_pages].compact.join(", ") end end diff --git a/app/models/forms/bulk_upload_lettings/prepare_your_file.rb b/app/models/forms/bulk_upload_lettings/prepare_your_file.rb index 159436ce1..984451dbb 100644 --- a/app/models/forms/bulk_upload_lettings/prepare_your_file.rb +++ b/app/models/forms/bulk_upload_lettings/prepare_your_file.rb @@ -35,25 +35,25 @@ module Forms def legacy_template_path case year when 2023 - "/files/bulk-upload-lettings-legacy-template-2023-24.xlsx" + download_23_24_lettings_bulk_upload_legacy_template_path end end def template_path case year when 2023 - "/files/bulk-upload-lettings-template-2023-24.xlsx" + download_23_24_lettings_bulk_upload_template_path when 2024 - "/files/bulk-upload-lettings-template-2024-25.xlsx" + download_24_25_lettings_bulk_upload_template_path end end def specification_path case year when 2023 - "/files/bulk-upload-lettings-specification-2023-24.xlsx" + download_23_24_lettings_bulk_upload_specification_path when 2024 - "/files/bulk-upload-lettings-specification-2024-25.xlsx" + download_24_25_lettings_bulk_upload_specification_path end end diff --git a/app/models/forms/bulk_upload_sales/prepare_your_file.rb b/app/models/forms/bulk_upload_sales/prepare_your_file.rb index 4bf0797a8..d6d5276c2 100644 --- a/app/models/forms/bulk_upload_sales/prepare_your_file.rb +++ b/app/models/forms/bulk_upload_sales/prepare_your_file.rb @@ -34,25 +34,25 @@ module Forms def legacy_template_path case year when 2023 - "/files/bulk-upload-sales-legacy-template-2023-24.xlsx" + download_23_24_sales_bulk_upload_legacy_template_path end end def template_path case year when 2023 - "/files/bulk-upload-sales-template-2023-24.xlsx" + download_23_24_sales_bulk_upload_template_path when 2024 - "/files/bulk-upload-sales-template-2024-25.xlsx" + download_24_25_sales_bulk_upload_template_path end end def specification_path case year when 2023 - "/files/bulk-upload-sales-specification-2023-24.xlsx" + download_23_24_sales_bulk_upload_specification_path when 2024 - "/files/bulk-upload-sales-specification-2024-25.xlsx" + download_24_25_sales_bulk_upload_specification_path end end diff --git a/config/environments/development.rb b/config/environments/development.rb index 7e1890b02..ebdedc474 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -85,4 +85,5 @@ Rails.application.configure do config.active_record.yaml_column_permitted_classes = [Time, BigDecimal] config.active_job.queue_adapter = :inline + config.collection_resources_s3_bucket_name = "core-dev-collection-resources" end diff --git a/config/environments/production.rb b/config/environments/production.rb index 55f442b3d..5bcd011fc 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -147,4 +147,5 @@ Rails.application.configure do end } end + config.collection_resources_s3_bucket_name = "core-prod-collection-resources" end diff --git a/config/environments/review.rb b/config/environments/review.rb index f7438fdb6..e970cac70 100644 --- a/config/environments/review.rb +++ b/config/environments/review.rb @@ -127,4 +127,5 @@ Rails.application.configure do # see https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017 config.active_record.yaml_column_permitted_classes = [Time, BigDecimal] + config.collection_resources_s3_bucket_name = "core-dev-collection-resources" end diff --git a/config/environments/staging.rb b/config/environments/staging.rb index 56352d3bb..941b3e0e0 100644 --- a/config/environments/staging.rb +++ b/config/environments/staging.rb @@ -127,4 +127,5 @@ Rails.application.configure do # see https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017 config.active_record.yaml_column_permitted_classes = [Time, BigDecimal] + config.collection_resources_s3_bucket_name = "core-staging-collection-resources" end diff --git a/config/environments/test.rb b/config/environments/test.rb index aa3fe7bba..4c90378a6 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -67,4 +67,5 @@ Rails.application.configure do config.active_record.yaml_column_permitted_classes = [Time, BigDecimal] config.active_job.queue_adapter = :test + config.collection_resources_s3_bucket_name = "core-test-collection-resources" end diff --git a/spec/helpers/collection_resources_helper_spec.rb b/spec/helpers/collection_resources_helper_spec.rb index c028177ce..9ad0802f7 100644 --- a/spec/helpers/collection_resources_helper_spec.rb +++ b/spec/helpers/collection_resources_helper_spec.rb @@ -6,12 +6,22 @@ RSpec.describe CollectionResourcesHelper do describe "when displaying file metadata" do context "with pages" do + before do + stub_request(:head, "https://core-test-collection-resources.s3.amazonaws.com/2023_24_lettings_paper_form.pdf") + .to_return(status: 200, body: "", headers: { "Content-Length" => 292_864, "Content-Type" => "application/pdf" }) + end + it "returns correct metadata" do expect(file_type_size_and_pages("2023_24_lettings_paper_form.pdf", number_of_pages: 8)).to eq("PDF, 286 KB, 8 pages") end end context "without pages" do + before do + stub_request(:head, "https://core-test-collection-resources.s3.amazonaws.com/bulk-upload-lettings-template-2023-24.xlsx") + .to_return(status: 200, body: "", headers: { "Content-Length" => 19_456, "Content-Type" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }) + end + it "returns correct metadata" do expect(file_type_size_and_pages("bulk-upload-lettings-template-2023-24.xlsx")).to eq("Microsoft Excel, 19 KB") end