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
- #bad_request ⇒ Object
- #filter_params ⇒ Object
- #handle_selected_jobs(jobs) ⇒ Object
- #parsed_route_params(key) ⇒ Object
- #post_import_jobs ⇒ Object
- #post_undertaker ⇒ Object
- #post_undertaker_job_class_error_class_error_msg_bucket_name_delete ⇒ Object
- #post_undertaker_job_class_error_class_error_msg_bucket_name_export ⇒ Object
- #post_undertaker_job_class_error_class_error_msg_bucket_name_retry ⇒ Object
- #prepare_data(data, chunk_size) ⇒ Object
- #redirect_path(request) ⇒ Object
- #render_result(template) ⇒ Object
- #send_data(data, content_type = "text/plain", file_name = "attachment.txt") ⇒ Object
- #show_filter ⇒ Object
- #show_filter_by_job_class_bucket_name ⇒ Object
- #show_filter_by_job_class_error_class_bucket_name ⇒ Object
- #show_undertaker_by_job_class_error_class_error_msg_bucket_name ⇒ Object
- #store_request_params ⇒ Object
- #view_path ⇒ Object
Instance Method Details
#bad_request ⇒ Object
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_params ⇒ Object
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_jobs ⇒ Object
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_undertaker ⇒ Object
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_delete ⇒ Object
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_export ⇒ Object
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_retry ⇒ Object
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_filter ⇒ Object
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_name ⇒ Object
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_name ⇒ Object
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_name ⇒ Object
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_params ⇒ Object
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_path ⇒ Object
171 172 173 |
# File 'lib/sidekiq/undertaker/web_extension/api_helpers.rb', line 171 def view_path File.join(File.(__dir__), "../../../../web/views") end |