Module: SideBro::WebHelpers

Included in:
SideBro::Web::Action
Defined in:
lib/side_bro/web/helpers.rb

Constant Summary collapse

QUEUE_NAME_RE =
/\A[a-z_:.\-0-9]+\z/i
ACTIVEJOB_WRAPPER =
"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"

Instance Method Summary collapse

Instance Method Details

#clean_aj_args(obj) ⇒ Object



108
109
110
111
112
113
114
115
116
117
# File 'lib/side_bro/web/helpers.rb', line 108

def clean_aj_args(obj)
  case obj
  when Array then obj.map { |v| clean_aj_args(v) }
  when Hash
    cleaned = obj.reject { |k, _| k.to_s.start_with?("_aj_") }
      .transform_values { |v| clean_aj_args(v) }
    cleaned.size == 1 ? cleaned.values.first : cleaned
  else obj
  end
end

#csrf_tokenObject



149
150
151
# File 'lib/side_bro/web/helpers.rb', line 149

def csrf_token
  session[:csrf] ||= SecureRandom.hex(16)
end

#current_pageObject



125
126
127
128
129
# File 'lib/side_bro/web/helpers.rb', line 125

def current_page
  page = [(params["page"] || 1).to_i - 1, 0].max
  per_page = (params["per_page"] || 25).to_i.clamp(1, 250)
  [page, per_page]
end

#current_path?(path) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
# File 'lib/side_bro/web/helpers.rb', line 23

def current_path?(path)
  request.path == "#{root_path}#{path}".chomp("/")
end

#display_args(job_hash) ⇒ Object



87
88
89
90
91
# File 'lib/side_bro/web/helpers.rb', line 87

def display_args(job_hash)
  truncate(JSON.generate(raw_args(job_hash)))
rescue
  ""
end

#format_args_short(job_hash, per_row: 2) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/side_bro/web/helpers.rb', line 93

def format_args_short(job_hash, per_row: 2)
  raw = raw_args(job_hash)
  if raw.length == 1 && raw.first.is_a?(Hash)
    pairs = raw.first.map { |k, v|
      val = v.is_a?(String) ? v : JSON.generate(v)
      "#{k}: #{truncate(val, 20)}"
    }
    pairs.each_slice(per_row).map { |s| s.join("   ") }.join("\n")
  else
    truncate(JSON.generate(raw), 60)
  end
rescue
  ""
end

#format_memory(kb) ⇒ Object



59
60
61
62
63
# File 'lib/side_bro/web/helpers.rb', line 59

def format_memory(kb)
  return "" unless kb
  mb = kb / 1024.0
  mb >= 1024 ? "%.1f GB" % (mb / 1024.0) : "%.0f MB" % mb
end

#h(text) ⇒ Object



140
141
142
143
144
145
146
147
# File 'lib/side_bro/web/helpers.rb', line 140

def h(text)
  text.to_s
    .gsub("&", "&")
    .gsub("<", "&lt;")
    .gsub(">", "&gt;")
    .gsub('"', "&quot;")
    .gsub("'", "&#39;")
end

#handle_job_action(set) ⇒ Object



161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/side_bro/web/helpers.rb', line 161

def handle_job_action(set)
  action_name = params["action"]
  keys = Array(params["key"])
  keys.each do |jid|
    job = set.find { |j| j.jid == jid }
    next unless job
    case action_name
    when "retry" then job.retry
    when "delete" then job.delete
    when "kill" then job.kill if job.respond_to?(:kill)
    when "add_to_queue" then job.add_to_queue if job.respond_to?(:add_to_queue)
    end
  end
end

#job_display_class(job_hash) ⇒ Object



72
73
74
75
76
# File 'lib/side_bro/web/helpers.rb', line 72

def job_display_class(job_hash)
  return job_hash["class"] unless job_hash["class"] == ACTIVEJOB_WRAPPER
  inner = (job_hash["args"] || []).first
  inner.is_a?(Hash) ? (inner["job_class"] || ACTIVEJOB_WRAPPER) : ACTIVEJOB_WRAPPER
end

#localeObject



33
34
35
# File 'lib/side_bro/web/helpers.rb', line 33

def locale
  session[:locale] || "en"
end

#metrics_enabled?Boolean

Returns:

  • (Boolean)


157
158
159
# File 'lib/side_bro/web/helpers.rb', line 157

def metrics_enabled?
  Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("7.0")
end

#number_with_delimiter(n) ⇒ Object



153
154
155
# File 'lib/side_bro/web/helpers.rb', line 153

def number_with_delimiter(n)
  n.to_s.reverse.gsub(/(\d{3})(?=\d)/, "\\1,").reverse
end

#page_sliceObject



131
132
133
134
# File 'lib/side_bro/web/helpers.rb', line 131

def page_slice
  page, per_page = current_page
  [page * per_page, per_page]
end

#paginate(set, page, per_page = 25) ⇒ Object



119
120
121
122
123
# File 'lib/side_bro/web/helpers.rb', line 119

def paginate(set, page, per_page = 25)
  total = set.size
  items = set.map { |j| j }.slice(page * per_page, per_page) || []
  [items, total]
end

#query_string(overrides = {}) ⇒ Object

Builds a query string from current request params merged with overrides. Pass nil as a value to remove that key from the result.



12
13
14
15
16
17
# File 'lib/side_bro/web/helpers.rb', line 12

def query_string(overrides = {})
  overrides = overrides.transform_keys(&:to_s)
  base = request.params.reject { |k, _| overrides.key?(k.to_s) }
  merged = base.merge(overrides.compact)
  merged.map { |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join("&")
end

#raw_args(job_hash) ⇒ Object



78
79
80
81
82
83
84
85
# File 'lib/side_bro/web/helpers.rb', line 78

def raw_args(job_hash)
  if job_hash["class"] == ACTIVEJOB_WRAPPER
    inner = (job_hash["args"] || []).first
    inner.is_a?(Hash) ? clean_aj_args(inner["arguments"] || []) : []
  else
    job_hash["args"] || []
  end
end

#relative_time(time) ⇒ Object



49
50
51
52
53
54
55
56
57
# File 'lib/side_bro/web/helpers.rb', line 49

def relative_time(time)
  return "" unless time
  secs = (Time.now - time).to_i.abs
  if secs < 60 then "#{secs}s"
  elsif secs < 3600 then "#{secs / 60}m"
  elsif secs < 86400 then "#{secs / 3600}h"
  else "#{secs / 86400}d"
  end
end

#root_pathObject



27
28
29
30
31
# File 'lib/side_bro/web/helpers.rb', line 27

def root_path
  # Strips trailing slash from SCRIPT_NAME so prefix is always clean
  script = request.env["SCRIPT_NAME"] || ""
  script.end_with?("/") ? script : "#{script}/"
end

#rtl?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/side_bro/web/helpers.rb', line 136

def rtl?
  %w[ar fa he ur].include?(locale)
end

#t(key, **opts) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/side_bro/web/helpers.rb', line 37

def t(key, **opts)
  str = SideBro::Web.translations.dig(locale.to_s, key.to_s) ||
    SideBro::Web.translations.dig("en", key.to_s) ||
    key.to_s
  return str if opts.empty?
  begin
    str % opts
  rescue
    str
  end
end

#truncate(str, len = 200) ⇒ Object



65
66
67
68
# File 'lib/side_bro/web/helpers.rb', line 65

def truncate(str, len = 200)
  return str if str.nil? || str.length <= len
  "#{str[0, len]}"
end

#validate_queue_name!(name) ⇒ Object



19
20
21
# File 'lib/side_bro/web/helpers.rb', line 19

def validate_queue_name!(name)
  halt(404) unless name&.match?(QUEUE_NAME_RE)
end