class AutoAlert::Checker

Attributes

kind[R]

Public Class Methods

new(alert_kind, raise_condition, resolve_condition, reraise_condition = false, message_builder) click to toggle source
# File lib/auto_alert/checker.rb, line 5
def initialize(alert_kind, raise_condition, resolve_condition, reraise_condition = false, message_builder)
  @kind = alert_kind
  @raise_condition = normalize_check_condition raise_condition
  @resolve_condition =
    resolve_condition ?
      normalize_check_condition(resolve_condition) :
      ->(a) { not @raise_condition.call(a) }
  @reraise_condition = if !reraise_condition # If nil or false
      nil
    elsif reraise_condition == true
      @raise_condition
    else
      normalize_check_condition reraise_condition
    end
  @message_builder = message_builder
end

Public Instance Methods

check(alertable) click to toggle source
# File lib/auto_alert/checker.rb, line 22
def check(alertable)
  existing_alert = alertable.send("#{@kind}_alert")

  case [existing_alert, @reraise_condition, existing_alert&.resolved]

  # Check for alert for the first time
  in nil, _, _
    if @raise_condition.call(alertable)
      alertable.alerts.create(kind: @kind, message: message(alertable), resolved: false)
    end

  # Check if alert should be resolveed
  in alert, _, false
    alert.update(resolved: true) if @resolve_condition.call(alertable)

  # Resolved alert should not be re-raised
  in alert, nil, true
    return

  # Check if resolved alert should be re-raised
  in alert, reraise_condition, true
    if reraise_condition.call(alertable)
      alert.update(message: message(alertable), resolved: false)
    end

  else
    return
  end
end
message(alertable) click to toggle source
# File lib/auto_alert/checker.rb, line 52
def message(alertable)
  case @message_builder
  in Proc => p
    p.call(alertable)
  in Symbol => s if alertable.respond_to?(s, true)
    alertable.send(@message_builder)
  else
    @message_builder
  end
end

Private Instance Methods

normalize_check_condition(condition) click to toggle source
# File lib/auto_alert/checker.rb, line 65
def normalize_check_condition(condition)
  if condition.respond_to?(:call)
    condition
  else
    lambda do |record|
      record.send(condition)
    end
  end
end