Class: LcpRuby::Workflow::StateMachine
- Inherits:
-
Object
- Object
- LcpRuby::Workflow::StateMachine
- Defined in:
- lib/lcp_ruby/workflow/state_machine.rb
Instance Attribute Summary collapse
-
#workflow_definition ⇒ Object
readonly
Returns the value of attribute workflow_definition.
Instance Method Summary collapse
-
#available_transitions(record, user:, evaluator:) ⇒ Object
Returns transitions available for the given record, filtered by state, roles, and guard.
- #can_transition?(record, transition_name, user:, evaluator:) ⇒ Boolean
-
#initialize(workflow_definition) ⇒ StateMachine
constructor
A new instance of StateMachine.
- #validate_transition!(record, transition_name, user:, evaluator:) ⇒ Object
Constructor Details
#initialize(workflow_definition) ⇒ StateMachine
Returns a new instance of StateMachine.
6 7 8 |
# File 'lib/lcp_ruby/workflow/state_machine.rb', line 6 def initialize(workflow_definition) @workflow_definition = workflow_definition end |
Instance Attribute Details
#workflow_definition ⇒ Object (readonly)
Returns the value of attribute workflow_definition.
4 5 6 |
# File 'lib/lcp_ruby/workflow/state_machine.rb', line 4 def workflow_definition @workflow_definition end |
Instance Method Details
#available_transitions(record, user:, evaluator:) ⇒ Object
Returns transitions available for the given record, filtered by state, roles, and guard.
11 12 13 14 15 16 17 18 |
# File 'lib/lcp_ruby/workflow/state_machine.rb', line 11 def available_transitions(record, user:, evaluator:) current_state = record.send(@workflow_definition.field)&.to_s return [] unless current_state @workflow_definition.transitions_from(current_state).select do |transition| transition_allowed?(transition, record, user: user, evaluator: evaluator) end end |
#can_transition?(record, transition_name, user:, evaluator:) ⇒ Boolean
20 21 22 23 24 25 26 27 28 |
# File 'lib/lcp_ruby/workflow/state_machine.rb', line 20 def can_transition?(record, transition_name, user:, evaluator:) transition = @workflow_definition.transition(transition_name) return false unless transition current_state = record.send(@workflow_definition.field)&.to_s return false unless transition.available_from?(current_state) transition_allowed?(transition, record, user: user, evaluator: evaluator) end |
#validate_transition!(record, transition_name, user:, evaluator:) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/lcp_ruby/workflow/state_machine.rb', line 30 def validate_transition!(record, transition_name, user:, evaluator:) transition = @workflow_definition.transition(transition_name) unless transition raise TransitionDeniedError, "Transition '#{transition_name}' is not defined in workflow '#{@workflow_definition.name}'" end current_state = record.send(@workflow_definition.field)&.to_s unless transition.available_from?(current_state) raise TransitionDeniedError, "Transition '#{transition_name}' is not available from state '#{current_state}'" end unless role_allowed?(transition, evaluator) raise TransitionDeniedError, "Transition '#{transition_name}' is not permitted for the current user's role" end unless guard_passes?(transition, record, user: user) raise TransitionDeniedError, "Transition '#{transition_name}' guard condition is not satisfied" end end |