You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.3 KiB
121 lines
4.3 KiB
class CollectionResourcesController < ApplicationController |
|
include CollectionResourcesHelper |
|
|
|
before_action :authenticate_user!, except: %i[download_mandatory_collection_resource] |
|
|
|
def index |
|
render_not_found unless current_user.support? |
|
|
|
@mandatory_lettings_collection_resources_per_year = MandatoryCollectionResourcesService.generate_resources("lettings", editable_collection_resource_years) |
|
@mandatory_sales_collection_resources_per_year = MandatoryCollectionResourcesService.generate_resources("sales", editable_collection_resource_years) |
|
end |
|
|
|
def download_mandatory_collection_resource |
|
log_type = params[:log_type] |
|
year = params[:year].to_i |
|
resource_type = params[:resource_type] |
|
|
|
return render_not_found unless resource_for_year_can_be_downloaded?(year) |
|
|
|
resource = MandatoryCollectionResourcesService.generate_resource(log_type, year, resource_type) |
|
return render_not_found unless resource |
|
|
|
download_resource(resource.download_filename) |
|
end |
|
|
|
def edit |
|
return render_not_found unless current_user.support? |
|
|
|
year = params[:year].to_i |
|
resource_type = params[:resource_type] |
|
log_type = params[:log_type] |
|
|
|
return render_not_found unless resource_for_year_can_be_updated?(year) |
|
|
|
@collection_resource = MandatoryCollectionResourcesService.generate_resource(log_type, year, resource_type) |
|
|
|
return render_not_found unless @collection_resource |
|
|
|
render "collection_resources/edit" |
|
end |
|
|
|
def update |
|
return render_not_found unless current_user.support? |
|
|
|
year = resource_params[:year].to_i |
|
resource_type = resource_params[:resource_type] |
|
log_type = resource_params[:log_type] |
|
file = resource_params[:file] |
|
|
|
return render_not_found unless resource_for_year_can_be_updated?(year) |
|
|
|
@collection_resource = MandatoryCollectionResourcesService.generate_resource(log_type, year, resource_type) |
|
render_not_found unless @collection_resource |
|
|
|
validate_file(file) |
|
|
|
return render "collection_resources/edit" if @collection_resource.errors.any? |
|
|
|
filename = @collection_resource.download_filename |
|
begin |
|
UploadCollectionResourcesService.upload_collection_resource(filename, file) |
|
rescue StandardError |
|
@collection_resource.errors.add(:file, "There was an error uploading this file.") |
|
return render "collection_resources/edit" |
|
end |
|
|
|
flash[:notice] = "The #{log_type} #{text_year_range_format(year)} #{@collection_resource.short_display_name.downcase} has been updated" |
|
redirect_to collection_resources_path |
|
end |
|
|
|
private |
|
|
|
def resource_params |
|
params.require(:collection_resource).permit(:year, :log_type, :resource_type, :file) |
|
end |
|
|
|
def download_resource(filename) |
|
url = "https://#{Rails.application.config.collection_resources_s3_bucket_name}.s3.amazonaws.com/#{filename}" |
|
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 |
|
|
|
def resource_for_year_can_be_downloaded?(year) |
|
return true if current_user&.support? && editable_collection_resource_years.include?(year) |
|
|
|
displayed_collection_resource_years.include?(year) |
|
end |
|
|
|
def resource_for_year_can_be_updated?(year) |
|
editable_collection_resource_years.include?(year) |
|
end |
|
|
|
def validate_file(file) |
|
return @collection_resource.errors.add(:file, "Select which file to upload") unless file |
|
return @collection_resource.errors.add(:file, "The file is above 100MB") if file.size > 100.megabytes |
|
|
|
argv = %W[file --brief --mime-type -- #{file.path}] |
|
output = `#{argv.shelljoin}` |
|
|
|
case @collection_resource.resource_type |
|
when "paper_form" |
|
unless output.match?(/application\/pdf/) |
|
@collection_resource.errors.add(:file, "The paper form must be a PDF.") |
|
end |
|
when "bulk_upload_template", "bulk_upload_specification" |
|
unless output.match?(/application\/vnd\.ms-excel|application\/vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet/) |
|
@collection_resource.errors.add(:file, "The #{@collection_resource.short_display_name.downcase} must be a Microsoft Excel file.") |
|
end |
|
end |
|
end |
|
end
|
|
|