50 lines
1.2 KiB
Ruby
50 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module AlertEventLifecycle
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
validates :started_at, presence: true
|
|
validates :status, presence: true
|
|
|
|
state_machine :status, initial: :none do
|
|
state :none, value: nil
|
|
|
|
state :firing, value: 0 do
|
|
validates :payload_key, presence: true
|
|
validates :ended_at, absence: true
|
|
end
|
|
|
|
state :resolved, value: 1 do
|
|
validates :ended_at, presence: true
|
|
end
|
|
|
|
event :fire do
|
|
transition none: :firing
|
|
end
|
|
|
|
event :resolve do
|
|
transition firing: :resolved
|
|
end
|
|
|
|
before_transition to: :firing do |alert_event, transition|
|
|
started_at = transition.args.first
|
|
alert_event.started_at = started_at
|
|
end
|
|
|
|
before_transition to: :resolved do |alert_event, transition|
|
|
ended_at = transition.args.first
|
|
alert_event.ended_at = ended_at || Time.current
|
|
end
|
|
end
|
|
|
|
scope :firing, -> { where(status: status_value_for(:firing)) }
|
|
scope :resolved, -> { where(status: status_value_for(:resolved)) }
|
|
|
|
scope :count_by_project_id, -> { group(:project_id).count }
|
|
|
|
def self.status_value_for(name)
|
|
state_machines[:status].states[name].value
|
|
end
|
|
end
|
|
end
|