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



206
207
208
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 206

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

#filter_paramsObject



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

def filter_params
  {
    "bucket_name" => parsed_route_params(:bucket_name),
    "error_class" => parsed_route_params(:error_class),
    "error_msg"   => parsed_route_params(:error_msg),
    "job_class"   => parsed_route_params(:job_class)
  }
end

#handle_selected_jobs(jobs) ⇒ Object



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

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

  if url_params("retry")
    jobs.each(&:retry)
  elsif url_params("delete")
    jobs.each(&:delete)
  end

  redirect redirect_path(request)
end

#parsed_route_params(key) ⇒ Object



161
162
163
164
165
166
167
168
169
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 161

def parsed_route_params(key)
  if key == :error_msg
    msg = route_params(key)
    msg = Base64.urlsafe_decode64(msg) if !msg.nil? && msg != "all"
    msg
  else
    route_params(key)
  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 = url_params("upload_file")
  raise ::ArgumentError.new("The file is not a json") if file.nil? || file[:type] != "application/json"

  data = url_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



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

def post_undertaker
  raise ::ArgumentError.new("Key missing") unless url_params("key")

  jobs = url_params("key").map { |k| Sidekiq::DeadSet.new.fetch(*parse_key(k)).first }.compact

  handle_selected_jobs jobs
rescue ::ArgumentError
  bad_request
end

#post_undertaker_job_class_error_class_error_msg_bucket_name_deleteObject



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

def post_undertaker_job_class_error_class_error_msg_bucket_name_delete
  store_request_params
  @dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(filter_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



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

def post_undertaker_job_class_error_class_error_msg_bucket_name_export
  store_request_params
  @dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(filter_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



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

def post_undertaker_job_class_error_class_error_msg_bucket_name_retry
  store_request_params

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

  redirect redirect_path(request)
end

#prepare_data(data, chunk_size) ⇒ Object



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

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



175
176
177
178
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 175

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



195
196
197
198
199
200
201
202
203
204
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 195

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(filter_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(filter_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(filter_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
75
# 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(filter_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 = (url_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
  # FIXME: https://github.com/sidekiq/sidekiq/blob/main/lib/sidekiq/web/action.rb#L64-L67
  # 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_bucket_name = parsed_route_params(:bucket_name)
  @req_error_class = parsed_route_params(:error_class)
  @req_error_msg   = parsed_route_params(:error_msg)
  @req_job_class   = parsed_route_params(:job_class)
end

#view_pathObject



171
172
173
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 171

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