Module: Sidekiq::Undertaker::WebExtension::APIHelpers

Defined in:
lib/sidekiq/undertaker/web_extension/api_helpers.rb

Overview

rubocop:disable Metrics/ModuleLength

Constant Summary collapse

EXPORT_CHUNK_SIZE =
2000

Instance Method Summary collapse

Instance Method Details

#bad_requestObject



195
196
197
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 195

def bad_request
  [400, { "Content-Type" => "text/plain" }, ["Bad Request"]]
end

#handle_selected_jobs(jobs) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 86

def handle_selected_jobs(jobs)
  return send_data(*prepare_data(jobs.map(&:item), EXPORT_CHUNK_SIZE)) if parsed_params["export"]

  if parsed_params["retry"]
    jobs.each(&:retry)
  elsif parsed_params["delete"]
    jobs.each(&:delete)
  end

  redirect redirect_path(request)
end

#parsed_paramsObject



152
153
154
155
156
157
158
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 152

def parsed_params
  @parsed_params ||= if params["error_msg"] && params["error_msg"] != "all"
                       params.merge("error_msg" => Base64.urlsafe_decode64(params["error_msg"]))
                     else
                       params
                     end
end

#post_import_jobsObject



126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 126

def post_import_jobs
  file = parsed_params["upload_file"]
  raise ::ArgumentError.new("The file is not a json") if file.nil? || file[:type] != "application/json"

  data = parsed_params["upload_file"][:tempfile].read
  dead_set = Sidekiq::DeadSet.new

  JSON.parse(data).each do |job|
    dead_set.kill(Sidekiq.dump_json(job))
  end
  redirect redirect_path(request)
rescue StandardError
  bad_request
end

#post_undertakerObject



76
77
78
79
80
81
82
83
84
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 76

def post_undertaker
  raise ::ArgumentError.new("Key missing") unless parsed_params["key"]

  jobs = parsed_params["key"].map { |k| Sidekiq::DeadSet.new.fetch(*parse_params(k)).first }.compact

  handle_selected_jobs jobs
rescue ::ArgumentError
  bad_request
end

#post_undertaker_job_class_error_class_error_msg_bucket_name_deleteObject



98
99
100
101
102
103
104
105
106
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 98

def post_undertaker_job_class_error_class_error_msg_bucket_name_delete
  store_request_params
  @dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
  @dead_jobs.each do |dead_job|
    dead_job.job.delete
  end

  redirect redirect_path(request)
end

#post_undertaker_job_class_error_class_error_msg_bucket_name_exportObject



119
120
121
122
123
124
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 119

def post_undertaker_job_class_error_class_error_msg_bucket_name_export
  store_request_params

  @dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
  send_data(*prepare_data(@dead_jobs.map { |j| j.job.item }, EXPORT_CHUNK_SIZE))
end

#post_undertaker_job_class_error_class_error_msg_bucket_name_retryObject



108
109
110
111
112
113
114
115
116
117
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 108

def post_undertaker_job_class_error_class_error_msg_bucket_name_retry
  store_request_params

  @dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
  @dead_jobs.each do |dead_job|
    dead_job.job.retry
  end

  redirect redirect_path(request)
end

#prepare_data(data, chunk_size) ⇒ Object



169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 169

def prepare_data(data, chunk_size)
  filename = Time.now.strftime("%Y-%m-%d_%H-%M").to_s
  return [data.to_json, "application/json", "#{filename}.json"] if data.length <= chunk_size

  filename = "#{@req_job_class}_#{filename}"
  zip = Zip::OutputStream.write_buffer do |file|
    data.each_slice(chunk_size).with_index do |chunk, index|
      file.put_next_entry("#{filename}_part-#{index + 1}.json")
      file.write chunk.to_json
    end
  end

  [zip.string, "application/zip", "#{filename}.zip"]
end

#redirect_path(request) ⇒ Object



164
165
166
167
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 164

def redirect_path(request)
  path = request.referer ? URI.parse(request.referer).path : request.path
  path.gsub("/delete", "").gsub("/retry", "").gsub("/export", "")
end

#render_result(template) ⇒ Object



141
142
143
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 141

def render_result(template)
  render(:erb, File.read(File.join(view_path, template)))
end

#send_data(data, content_type = "text/plain", file_name = "attachment.txt") ⇒ Object



184
185
186
187
188
189
190
191
192
193
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 184

def send_data(data, content_type = "text/plain", file_name = "attachment.txt")
  [
    200,
    {
      "Content-Type"        => content_type,
      "Content-Disposition" => "attachment; filename=\"#{file_name}\""
    },
    [data]
  ]
end

#show_filterObject



16
17
18
19
20
21
22
23
24
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 16

def show_filter
  store_request_params

  @dead_jobs    = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
  @distribution = Sidekiq::Undertaker::JobDistributor.new(@dead_jobs).group_by_job_class
  @total_dead   = @dead_jobs.size

  render_result("filter.erb")
end

#show_filter_by_job_class_bucket_nameObject



26
27
28
29
30
31
32
33
34
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 26

def show_filter_by_job_class_bucket_name
  store_request_params

  @dead_jobs    = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
  @distribution = Sidekiq::Undertaker::JobDistributor.new(@dead_jobs).group_by_error_class
  @total_dead   = @dead_jobs.size

  render_result("filter_job_class.erb")
end

#show_filter_by_job_class_error_class_bucket_nameObject



36
37
38
39
40
41
42
43
44
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 36

def show_filter_by_job_class_error_class_bucket_name
  store_request_params

  @dead_jobs    = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
  @distribution = Sidekiq::Undertaker::JobDistributor.new(@dead_jobs).group_by_error_msg
  @total_dead   = @dead_jobs.size

  render_result("filter_job_class_error_class.erb")
end

#show_undertaker_by_job_class_error_class_error_msg_bucket_nameObject



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
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 46

def show_undertaker_by_job_class_error_class_error_msg_bucket_name
  store_request_params

  @dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)

  # Display dead jobs as list
  @dead_jobs = @dead_jobs.map(&:job)

  @undertaker_path = "undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{@req_bucket_name}"

  # Pagination
  @total_dead   = @dead_jobs.size
  @current_page = (parsed_params[:page] || 1).to_i
  @count        = 50 # per page
  @dead_jobs    = @dead_jobs[((@current_page - 1) * @count), @count]

  # HINT: For making the pagination from sidekiq work, @total_size needs to be set
  #       https://github.com/mperham/sidekiq/blob/master/web/views/_paging.erb#L1
  @total_size = @total_dead

  # Remove unrelated arguments to allow _paginate url to be clean
  # Hack to continue to reuse sidekiq's _pagination template
  params.delete("job_class")
  params.delete("bucket_name")
  params.delete("error_class")
  params.delete("error_msg")

  render_result("morgue.erb")
end

#store_request_paramsObject



145
146
147
148
149
150
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 145

def store_request_params
  @req_job_class   = parsed_params["job_class"]
  @req_bucket_name = parsed_params["bucket_name"]
  @req_error_class = parsed_params["error_class"]
  @req_error_msg   = parsed_params["error_msg"]
end

#view_pathObject



160
161
162
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 160

def view_path
  File.join(File.expand_path(__dir__), "../../../../web/views")
end