5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-23 05:06:22 +00:00
panel/app/models/concerns/aasm_events_concern.rb

60 lines
1.6 KiB
Ruby
Raw Normal View History

2024-03-04 16:49:07 +00:00
# frozen_string_literal: true
module AasmEventsConcern
extend ActiveSupport::Concern
included do
# Todos los eventos de la máquina de estados
#
# @return [Array<Symbol>]
def self.events
aasm.events.map(&:name) - self::IGNORED_EVENTS
end
# Encuentra todos los eventos que se pueden ejecutar con el filtro
# actual.
#
# @return [Array<Symbol>]
def self.transitionable_events(current_state)
self.events.select do |event|
aasm.events.find { |x| x.name == event }.transitions_from_state? current_state
end
end
# Todos los estados de la máquina de estados
#
# @return [Array<Symbol>]
def self.states
aasm.states.map(&:name) - self::IGNORED_STATES
end
# Define un método que cambia el estado para todos los objetos del
# scope actual.
#
# @return [Bool] Si hubo al menos un error, devuelve false.
self.events.each do |event|
define_singleton_method(:"#{event}_all!") do
success = true
self.find_each do |object|
object.public_send(:"#{event}!") if object.public_send(:"may_#{event}?")
rescue Exception => e
success = false
notify_exception! e, object
end
success
end
end
# Envía notificación de errores
#
# @param exception [Exception]
# @param record [ApplicationRecord]
def notify_exception!(exception, record)
ExceptionNotifier.notify_exception(exception, data: { site: site.name, record_type: record.class.name, record_id: record.id })
end
2024-03-04 16:49:07 +00:00
end
end