diff --git a/app/controllers/start_controller.rb b/app/controllers/start_controller.rb index cffd310db..dd4232b7b 100644 --- a/app/controllers/start_controller.rb +++ b/app/controllers/start_controller.rb @@ -68,7 +68,7 @@ private def download_resource(filename, download_filename) file = CollectionResourcesService.new.get_file(filename) - render_not_found unless file + return render_not_found unless file send_data(file, disposition: "attachment", filename: download_filename) end diff --git a/app/helpers/collection_resources_helper.rb b/app/helpers/collection_resources_helper.rb index fcb75e18b..5ab539cde 100644 --- a/app/helpers/collection_resources_helper.rb +++ b/app/helpers/collection_resources_helper.rb @@ -15,8 +15,8 @@ module CollectionResourcesHelper return [file_pages].compact.join(", ") unless metadata - file_size = number_to_human_size(metadata["Content-Length"].to_i) - file_type = HUMAN_READABLE_CONTENT_TYPE[metadata["Content-Type"].to_sym] || "Unknown File Type" + file_size = number_to_human_size(metadata["content_length"].to_i) + file_type = HUMAN_READABLE_CONTENT_TYPE[metadata["content_type"].to_sym] || "Unknown File Type" [file_type, file_size, file_pages].compact.join(", ") end end diff --git a/app/services/collection_resources_service.rb b/app/services/collection_resources_service.rb index f4e778351..50e1fc59a 100644 --- a/app/services/collection_resources_service.rb +++ b/app/services/collection_resources_service.rb @@ -1,33 +1,21 @@ class CollectionResourcesService def initialize - @storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["COLLECTION_RESOURCES_BUCKET"]) + @storage_service = if FeatureToggle.local_storage? + Storage::LocalDiskService.new + else + Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["COLLECTION_RESOURCES_BUCKET"]) + end end def get_file(file) - storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["COLLECTION_RESOURCES_BUCKET"]) - url = "https://#{storage_service.configuration.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 - - return unless response.is_a?(Net::HTTPSuccess) - - response.body + @storage_service.get_file_io(file) + rescue StandardError + nil end def get_file_metadata(file) - storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["COLLECTION_RESOURCES_BUCKET"]) - url = "https://#{storage_service.configuration.bucket_name}.s3.amazonaws.com/#{file}" - uri = URI.parse(url) - - response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http| - http.request_head(uri) - end - return unless response.is_a?(Net::HTTPSuccess) || response.is_a?(Net::HTTPRedirection) - - response + @storage_service.get_file_metadata(file) + rescue StandardError + nil end end diff --git a/app/services/feature_toggle.rb b/app/services/feature_toggle.rb index 91989ff86..f63eceaef 100644 --- a/app/services/feature_toggle.rb +++ b/app/services/feature_toggle.rb @@ -34,4 +34,8 @@ class FeatureToggle def self.delete_user_enabled? true end + + def self.local_storage? + Rails.env.development? + end end diff --git a/app/services/storage/local_disk_service.rb b/app/services/storage/local_disk_service.rb index f0cc358d1..cd99d3d48 100644 --- a/app/services/storage/local_disk_service.rb +++ b/app/services/storage/local_disk_service.rb @@ -22,5 +22,14 @@ module Storage f.write data end end + + def get_file_metadata(filename) + path = Rails.root.join("tmp/storage", filename) + + { + "content_length" => File.size(path), + "content_type" => MiniMime.lookup_by_filename(path.to_s)&.content_type || "application/octet-stream", + } + end end end diff --git a/app/services/storage/s3_service.rb b/app/services/storage/s3_service.rb index 3592eaa67..0cd4a1f20 100644 --- a/app/services/storage/s3_service.rb +++ b/app/services/storage/s3_service.rb @@ -39,6 +39,10 @@ module Storage ) end + def get_file_metadata(file_name) + @client.head_object(bucket: @configuration.bucket_name, key: file_name) + end + private def create_configuration diff --git a/spec/features/accessibility_spec.rb b/spec/features/accessibility_spec.rb index 6f950cffc..2a95b684e 100644 --- a/spec/features/accessibility_spec.rb +++ b/spec/features/accessibility_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" RSpec.describe "Accessibility", js: true do let(:user) { create(:user, :support) } let!(:other_user) { create(:user, name: "new user", organisation: user.organisation, email: "new_user@example.com", confirmation_token: "abc") } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } def find_routes(type, resource, subresource) routes = Rails.application.routes.routes.select do |route| diff --git a/spec/features/lettings_log_spec.rb b/spec/features/lettings_log_spec.rb index b1d6f8dae..ea250529d 100644 --- a/spec/features/lettings_log_spec.rb +++ b/spec/features/lettings_log_spec.rb @@ -1,7 +1,7 @@ require "rails_helper" RSpec.describe "Lettings Log Features" do - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) diff --git a/spec/features/notifications_spec.rb b/spec/features/notifications_spec.rb index 360569dbb..a542cc97f 100644 --- a/spec/features/notifications_spec.rb +++ b/spec/features/notifications_spec.rb @@ -3,7 +3,7 @@ require_relative "form/helpers" RSpec.describe "Notifications Features" do include Helpers - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) diff --git a/spec/features/organisation_spec.rb b/spec/features/organisation_spec.rb index 1e3f89b72..98ae86475 100644 --- a/spec/features/organisation_spec.rb +++ b/spec/features/organisation_spec.rb @@ -10,7 +10,7 @@ RSpec.describe "User Features" do let(:notify_client) { instance_double(Notifications::Client) } let(:confirmation_token) { "MCDH5y6Km-U7CFPgAMVS" } let(:devise_notify_mailer) { DeviseNotifyMailer.new } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) diff --git a/spec/features/start_page_spec.rb b/spec/features/start_page_spec.rb index 3f1102869..555db9238 100644 --- a/spec/features/start_page_spec.rb +++ b/spec/features/start_page_spec.rb @@ -4,7 +4,7 @@ require_relative "form/helpers" RSpec.describe "Start Page Features" do include Helpers let(:user) { FactoryBot.create(:user) } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) diff --git a/spec/features/test_spec.rb b/spec/features/test_spec.rb index 7ea2eebc9..a58867182 100644 --- a/spec/features/test_spec.rb +++ b/spec/features/test_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" RSpec.describe "Test Features" do - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) diff --git a/spec/features/user_spec.rb b/spec/features/user_spec.rb index a2680fb95..bc562824c 100644 --- a/spec/features/user_spec.rb +++ b/spec/features/user_spec.rb @@ -6,7 +6,7 @@ RSpec.describe "User Features" do let(:notify_client) { instance_double(Notifications::Client) } let(:reset_password_token) { "MCDH5y6Km-U7CFPgAMVS" } let(:devise_notify_mailer) { DeviseNotifyMailer.new } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(DeviseNotifyMailer).to receive(:new).and_return(devise_notify_mailer) diff --git a/spec/helpers/collection_resources_helper_spec.rb b/spec/helpers/collection_resources_helper_spec.rb index 5a07dcb66..4d39a0c2d 100644 --- a/spec/helpers/collection_resources_helper_spec.rb +++ b/spec/helpers/collection_resources_helper_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" RSpec.describe CollectionResourcesHelper do let(:current_user) { create(:user, :data_coordinator) } let(:user) { create(:user, :data_coordinator) } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) @@ -13,8 +13,7 @@ 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" }) + allow(storage_service).to receive(:get_file_metadata).with("2023_24_lettings_paper_form.pdf").and_return("content_length" => 292_864, "content_type" => "application/pdf") end it "returns correct metadata" do @@ -24,8 +23,7 @@ RSpec.describe CollectionResourcesHelper do 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" }) + allow(storage_service).to receive(:get_file_metadata).with("bulk-upload-lettings-template-2023-24.xlsx").and_return("content_length" => 19_456, "content_type" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") end it "returns correct metadata" do diff --git a/spec/request_helper.rb b/spec/request_helper.rb index e8a6726e9..f1f208ec6 100644 --- a/spec/request_helper.rb +++ b/spec/request_helper.rb @@ -103,9 +103,6 @@ module RequestHelper address = request.uri.query_values["query"].split(",") { status: 200, body: { results: [{ DPA: { MATCH: 0.9, BUILDING_NAME: "result #{address[0]}", POST_TOWN: "result town or city", POSTCODE: address[1], UPRN: "1" } }] }.to_json, headers: {} } end - - WebMock.stub_request(:head, /https:\/\/core-test-collection-resources\.s3\.amazonaws\.com/) - .to_return(status: 200, body: "", headers: { "Content-Type" => "application/pdf", "Content-Length" => 1000 }) end def self.real_http_requests diff --git a/spec/requests/auth/passwords_controller_spec.rb b/spec/requests/auth/passwords_controller_spec.rb index 544dedab5..7f9bdfa30 100644 --- a/spec/requests/auth/passwords_controller_spec.rb +++ b/spec/requests/auth/passwords_controller_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Auth::PasswordsController, type: :request do let(:page) { Capybara::Node::Simple.new(response.body) } let(:notify_client) { instance_double(Notifications::Client) } let(:devise_notify_mailer) { DeviseNotifyMailer.new } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(DeviseNotifyMailer).to receive(:new).and_return(devise_notify_mailer) diff --git a/spec/requests/maintenance_controller_spec.rb b/spec/requests/maintenance_controller_spec.rb index fa5b47fd0..28287dbc0 100644 --- a/spec/requests/maintenance_controller_spec.rb +++ b/spec/requests/maintenance_controller_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" RSpec.describe MaintenanceController, type: :request do let(:page) { Capybara::Node::Simple.new(response.body) } let(:user) { FactoryBot.create(:user) } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(Storage::S3Service).to receive(:new).and_return(storage_service) diff --git a/spec/requests/rails_admin_controller_spec.rb b/spec/requests/rails_admin_controller_spec.rb index 3f83896d0..79f56d18f 100644 --- a/spec/requests/rails_admin_controller_spec.rb +++ b/spec/requests/rails_admin_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe "RailsAdmin", type: :request do let(:user) { create(:user) } let(:support_user) { create(:user, :support) } let(:page) { Capybara::Node::Simple.new(response.body) } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(support_user).to receive(:need_two_factor_authentication?).and_return(false) diff --git a/spec/requests/start_controller_spec.rb b/spec/requests/start_controller_spec.rb index 77c8e27f8..40c45a9f9 100644 --- a/spec/requests/start_controller_spec.rb +++ b/spec/requests/start_controller_spec.rb @@ -5,7 +5,7 @@ RSpec.describe StartController, type: :request do let(:page) { Capybara::Node::Simple.new(response.body) } let(:notify_client) { instance_double(Notifications::Client) } let(:devise_notify_mailer) { DeviseNotifyMailer.new } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(DeviseNotifyMailer).to receive(:new).and_return(devise_notify_mailer) diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index 95239b658..05dc06d5b 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -10,7 +10,7 @@ RSpec.describe UsersController, type: :request do let(:params) { { id: user.id, user: { name: new_name } } } let(:notify_client) { instance_double(Notifications::Client) } let(:devise_notify_mailer) { DeviseNotifyMailer.new } - let(:storage_service) { instance_double(Storage::S3Service) } + let(:storage_service) { instance_double(Storage::S3Service, get_file_metadata: nil) } before do allow(DeviseNotifyMailer).to receive(:new).and_return(devise_notify_mailer)