Module: Beam::UploadControllerMethods

Defined in:
lib/beam/upload_controller_methods.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#modelObject

Returns the value of attribute model.



3
4
5
# File 'lib/beam/upload_controller_methods.rb', line 3

def model
  @model
end

#upload_methodObject

Returns the value of attribute upload_method.



3
4
5
# File 'lib/beam/upload_controller_methods.rb', line 3

def upload_method
  @upload_method
end

Class Method Details

.included(base) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# 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

Instance Method Details

#additional_params_on_successObject

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



23
24
25
# File 'lib/beam/upload_controller_methods.rb', line 23

def additional_params_on_success
  {}
end

#csv_file_status(file) ⇒ Object



49
50
51
52
# 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_fileObject



15
16
17
# 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_statusObject



80
81
82
# 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) ⇒ Object



41
42
43
# 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) ⇒ Object



31
32
33
34
35
36
37
38
39
# 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_statusObject



66
67
68
# 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_statusObject



45
46
47
# File 'lib/beam/upload_controller_methods.rb', line 45

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

#uploadObject



5
6
7
8
9
10
11
12
13
# 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) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
# 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) ⇒ Object



70
71
72
73
74
75
76
77
78
# 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) ⇒ Object



84
85
86
87
88
89
90
# 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) ⇒ Object



100
101
102
103
104
105
106
107
# 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_statusObject



92
93
94
95
96
97
98
# 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) ⇒ Boolean

Returns:

  • (Boolean)


27
28
29
# 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