Module: Bp3::Noticed::PrependPerform

Includes:
CommonIncludes
Defined in:
lib/bp3/noticed/prepend_perform.rb

Instance Method Summary collapse

Methods included from CommonIncludes

#check, #ensure_site, #global_request_state_class, #include_log_error, #job_key, #run, #set_global_request_state, #site_class, #state

Instance Method Details

#perform(*args, **kwargs) ⇒ Object

rubocop:disable Metrics/MethodLength



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/bp3/noticed/prepend_perform.rb', line 9

def perform(*args, **kwargs)
  @args = args
  @kwargs = kwargs
  set_global_request_state
  details = { args:, kwargs: }
  log = nil
  args = remove_state(args)
  kwargs = remove_state(kwargs)
  begin
    super
  rescue ArgumentError
    super() # in case super is relying on run_attrs
  end
  disposition = 'finished'
  log = prepend_log_info(key: "#{job_type}.#{disposition}.#{job_key}", message: "#{disposition} job_type",
                         details:)
rescue StandardError => e
  disposition = 'failed'
  log = prepend_log_exception(e, key: "#{job_type}.#{disposition}.#{job_key}", details:)
  raise e # to continue the normal job flow
ensure
  prepend_add_event(eventable: log, disposition:)
  global_request_state_class.clear!
end

#prepend_add_event(eventable:, disposition:) ⇒ Object (private)

override in subclasses if needed



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/bp3/noticed/prepend_perform.rb', line 48

def prepend_add_event(eventable:, disposition:)
  return add_event(eventable:, disposition:) if respond_to?(:add_event, true)

  creator = global_request_state_class. || global_request_state_class.current_visitor
  who = creator.nil? ? 'nil' : "#{creator.class.name}/#{creator.id}"
  did = disposition
  what = eventable.nil? ? 'nil' : "#{eventable.class.name}/#{eventable.id}"
  message = "Warning: #{self.class.name}#add_event: unable to add event #{who}/#{did}/#{what}"
  Rails.logger.warn { message }
  nil
end

#prepend_log_exception(exception, key:, details: {}) ⇒ Object (private)

override in subclasses if needed



70
71
72
73
74
75
76
# File 'lib/bp3/noticed/prepend_perform.rb', line 70

def prepend_log_exception(exception, key:, details: {})
  return log_exception(exception, key:, details:) if respond_to?(:log_exception, true)

  message = "Warning: #{self.class.name}#log_exception: unable to log exception #{exception}/#{key}/#{details}"
  Rails.logger.warn { message }
  nil
end

#prepend_log_info(key:, message:, details: {}) ⇒ Object (private)

override in subclasses if needed



61
62
63
64
65
66
67
# File 'lib/bp3/noticed/prepend_perform.rb', line 61

def prepend_log_info(key:, message:, details: {})
  return log_info(key:, message:, details:) if respond_to?(:log_info, true)

  message = "Warning: #{self.class.name}#log_info: unable to log info #{key}/#{message}/#{details}"
  Rails.logger.warn { message }
  nil
end

#remove_state(obj) ⇒ Object (private)



37
38
39
40
41
42
43
44
45
# File 'lib/bp3/noticed/prepend_perform.rb', line 37

def remove_state(obj)
  if obj.is_a?(Hash)
    obj.except(:state, 'state')
  elsif obj.is_a?(Array)
    obj.reject { |e| e.is_a?(Hash) && (e.key?(:state) || e.key?('state')) }
  else
    obj
  end
end