From bcee73f11b2d3dde4d1773eb4ba078574383ce8d Mon Sep 17 00:00:00 2001 From: Kat Date: Tue, 8 Oct 2024 19:11:16 +0100 Subject: [PATCH] Extract methods into a service --- app/controllers/start_controller.rb | 18 +++-------- app/helpers/collection_resources_helper.rb | 13 +++----- app/services/collection_resources_service.rb | 33 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 app/services/collection_resources_service.rb diff --git a/app/controllers/start_controller.rb b/app/controllers/start_controller.rb index 64173d11a..cffd310db 100644 --- a/app/controllers/start_controller.rb +++ b/app/controllers/start_controller.rb @@ -66,20 +66,10 @@ class StartController < ApplicationController private - def download_resource(file, filename) - 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 + def download_resource(filename, download_filename) + file = CollectionResourcesService.new.get_file(filename) + render_not_found unless file - if response.is_a?(Net::HTTPSuccess) - send_data(response.body, disposition: "attachment", filename:) - else - render_not_found - end + send_data(file, disposition: "attachment", filename: download_filename) end end diff --git a/app/helpers/collection_resources_helper.rb b/app/helpers/collection_resources_helper.rb index c5941dbc4..fcb75e18b 100644 --- a/app/helpers/collection_resources_helper.rb +++ b/app/helpers/collection_resources_helper.rb @@ -11,17 +11,12 @@ module CollectionResourcesHelper def file_type_size_and_pages(file, number_of_pages: nil) file_pages = number_of_pages ? pluralize(number_of_pages, "page") : nil - 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) + metadata = CollectionResourcesService.new.get_file_metadata(file) - 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) + return [file_pages].compact.join(", ") unless metadata - 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_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 new file mode 100644 index 000000000..f4e778351 --- /dev/null +++ b/app/services/collection_resources_service.rb @@ -0,0 +1,33 @@ +class CollectionResourcesService + def initialize + @storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["COLLECTION_RESOURCES_BUCKET"]) + 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 + 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 + end +end