module Beam::UploadControllerMethods

Attributes

model[RW]
upload_method[RW]

Public Class Methods

included(base) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 19
def self.included(base)
  private

  # hook for post successful upload, in case additional parameters need to be send
  def additional_params_on_success
    {}
  end

  def zip_file?(file)
    ["application/zip", "application/x-zip-compressed", "application/octet-stream"].include?(file.content_type)  && file.original_filename.include?(".zip")
  end

  def file_upload_status(params)
    file_obj = params[:upload] ? params[:upload][:upload_file] : params[:files][0]

    status = file_obj ? file_status(file_obj) : not_file_status
    status[:message] = status[:num_errors] && status[:num_errors].zero? ? status[:success_msg] : status[:error_msg]
    status[:status] = status[:message] == status[:success_msg] ? "success" : "failure"
    status[:status_code] = status[:message] == status[:success_msg] ? 200 : 500
    status
  end

  def file_status(file)
    zip_file?(file) ? csv_file_status(file) : not_csv_file_status
  end

  def not_file_status
    {error_msg: "No file detected, please upload a file"}
  end

  def csv_file_status(file)
    response = upload_file(file)
    upload_status_by_response(response)
  end

  def upload_file(file)
    require 'fileutils'
    @model ||= controller_name.classify.constantize
    tmp = file.tempfile
    file_path = File.join(Beam.config[:data_upload_path], file.original_filename)
    FileUtils.cp_r tmp.path, file_path, remove_destination: true

    @upload_method ? 
      @model.upload_file(file.original_filename, Beam.config[:data_upload_path], @upload_method) :
      @model.upload_file(file.original_filename, Beam.config[:data_upload_path])
  end

  def not_csv_file_status
    {error_msg: "Only zipped csv files are allowed"}
  end

  def upload_status_by_response(response)
    if response[:status] == 500
      failure_status
    else
    response[:errors].zero? ? 
      upload_without_queue_success_status :
      upload_without_queue_failure_status(response[:errors])
    end
  end

  def failure_status
    {num_errors: 1, controller_name: self.controller_name, error_msg: "Please check the format of zipped file"}
  end

  def upload_through_queue_status(errors)
    { 
      num_errors:      nil,
      controller_name: self.controller_name,
      success_msg:     "In Progress"
    }   
  end

  def upload_without_queue_success_status
    { 
      num_errors:      0,
      controller_name: self.controller_name,
      success_msg:     "File uploaded successfully"
    }
  end

  def upload_without_queue_failure_status(errors)
    { 
      num_errors:      errors,
      controller_name: self.controller_name,
      error_msg:       "There are #{errors} row(s) with errors while uploading config file." + 
                        " Please check whether you have selected correct module or you have valid data in the file."
    }
  end
  
end

Public Instance Methods

additional_params_on_success() click to toggle source

hook for post successful upload, in case additional parameters need to be send

# File lib/beam/upload_controller_methods.rb, line 23
def additional_params_on_success
  {}
end
csv_file_status(file) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 49
def csv_file_status(file)
  response = upload_file(file)
  upload_status_by_response(response)
end
error_file() click to toggle source
# File lib/beam/upload_controller_methods.rb, line 15
def error_file
  send_file "#{Beam.config[:data_upload_path]}/errors_#{self.controller_name.downcase}.csv"
end
failure_status() click to toggle source
# File lib/beam/upload_controller_methods.rb, line 80
def failure_status
  {num_errors: 1, controller_name: self.controller_name, error_msg: "Please check the format of zipped file"}
end
file_status(file) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 41
def file_status(file)
  zip_file?(file) ? csv_file_status(file) : not_csv_file_status
end
file_upload_status(params) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 31
def file_upload_status(params)
  file_obj = params[:upload] ? params[:upload][:upload_file] : params[:files][0]

  status = file_obj ? file_status(file_obj) : not_file_status
  status[:message] = status[:num_errors] && status[:num_errors].zero? ? status[:success_msg] : status[:error_msg]
  status[:status] = status[:message] == status[:success_msg] ? "success" : "failure"
  status[:status_code] = status[:message] == status[:success_msg] ? 200 : 500
  status
end
not_csv_file_status() click to toggle source
# File lib/beam/upload_controller_methods.rb, line 66
def not_csv_file_status
  {error_msg: "Only zipped csv files are allowed"}
end
not_file_status() click to toggle source
# File lib/beam/upload_controller_methods.rb, line 45
def not_file_status
  {error_msg: "No file detected, please upload a file"}
end
upload() click to toggle source
# File lib/beam/upload_controller_methods.rb, line 5
def upload
  @upload_status = file_upload_status(params)
  @upload_status.merge!(additional_params_on_success) if @upload_status[:success_msg]

  respond_to do |format|
    format.json { render json: @upload_status }
    format.html { redirect_to :back }
  end
end
upload_file(file) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 54
def upload_file(file)
  require 'fileutils'
  @model ||= controller_name.classify.constantize
  tmp = file.tempfile
  file_path = File.join(Beam.config[:data_upload_path], file.original_filename)
  FileUtils.cp_r tmp.path, file_path, remove_destination: true

  @upload_method ? 
    @model.upload_file(file.original_filename, Beam.config[:data_upload_path], @upload_method) :
    @model.upload_file(file.original_filename, Beam.config[:data_upload_path])
end
upload_status_by_response(response) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 70
def upload_status_by_response(response)
  if response[:status] == 500
    failure_status
  else
  response[:errors].zero? ? 
    upload_without_queue_success_status :
    upload_without_queue_failure_status(response[:errors])
  end
end
upload_through_queue_status(errors) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 84
def upload_through_queue_status(errors)
  { 
    num_errors:      nil,
    controller_name: self.controller_name,
    success_msg:     "In Progress"
  }   
end
upload_without_queue_failure_status(errors) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 100
def upload_without_queue_failure_status(errors)
  { 
    num_errors:      errors,
    controller_name: self.controller_name,
    error_msg:       "There are #{errors} row(s) with errors while uploading config file." + 
                      " Please check whether you have selected correct module or you have valid data in the file."
  }
end
upload_without_queue_success_status() click to toggle source
# File lib/beam/upload_controller_methods.rb, line 92
def upload_without_queue_success_status
  { 
    num_errors:      0,
    controller_name: self.controller_name,
    success_msg:     "File uploaded successfully"
  }
end
zip_file?(file) click to toggle source
# File lib/beam/upload_controller_methods.rb, line 27
def zip_file?(file)
  ["application/zip", "application/x-zip-compressed", "application/octet-stream"].include?(file.content_type)  && file.original_filename.include?(".zip")
end