Class: LcpRuby::Workflow::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/lcp_ruby/workflow/registry.rb

Class Method Summary collapse

Class Method Details

.available?Boolean

Whether the workflow subsystem is configured and ready.

Returns:

  • (Boolean)


92
93
94
# File 'lib/lcp_ruby/workflow/registry.rb', line 92

def available?
  @available == true
end

.clear!Object

Full reset — called from LcpRuby.reset!



58
59
60
61
62
63
64
# File 'lib/lcp_ruby/workflow/registry.rb', line 58

def clear!
  monitor.synchronize do
    @available = false
    @loader = nil
    @model_cache = nil
  end
end

.mark_available!Object

Mark registry as available (called after setup completes).



97
98
99
# File 'lib/lcp_ruby/workflow/registry.rb', line 97

def mark_available!
  @available = true
end

.readonly_fields_for(record, model_name:) ⇒ Array<String>

Returns readonly field names for a record based on its current workflow state.

Parameters:

  • record (Object)

    the record

  • model_name (String)

    the LCP model name

Returns:

  • (Array<String>)

    readonly field names (empty if no workflow or no state)



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/lcp_ruby/workflow/registry.rb', line 70

def readonly_fields_for(record, model_name:)
  return [] unless available?

  workflow = workflow_for_model(model_name)
  return [] unless workflow

  current_state = record.send(workflow.field)&.to_s
  return [] unless current_state

  state_def = workflow.state(current_state)
  return [] unless state_def

  if state_def.all_readonly?
    model_def = LcpRuby.loader.model_definitions[model_name]
    return [] unless model_def
    model_def.fields.map(&:name)
  else
    state_def.readonly_fields
  end
end

.reload!Object

Clears the cached data, forcing a reload on next access.



51
52
53
54
55
# File 'lib/lcp_ruby/workflow/registry.rb', line 51

def reload!
  monitor.synchronize do
    @model_cache = nil
  end
end

.set_loader(loader_instance) ⇒ Object

Sets the loader that backs this registry.

Parameters:

  • loader_instance (Object)

    must include Workflow::Contract



43
44
45
46
47
48
# File 'lib/lcp_ruby/workflow/registry.rb', line 43

def set_loader(loader_instance)
  monitor.synchronize do
    @loader = loader_instance
    @model_cache = nil
  end
end

.workflow_by_name(name) ⇒ WorkflowDefinition?

Returns a workflow definition by name.

Parameters:

  • name (String)

Returns:



35
36
37
38
39
# File 'lib/lcp_ruby/workflow/registry.rb', line 35

def workflow_by_name(name)
  return nil unless available?

  loader.workflow_by_name(name.to_s)
end

.workflow_for_model(model_name) ⇒ WorkflowDefinition?

Returns the workflow definition for the given model.

Parameters:

  • model_name (String)

Returns:



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/lcp_ruby/workflow/registry.rb', line 12

def workflow_for_model(model_name)
  return nil unless available?

  monitor.synchronize do
    @model_cache ||= {}
    @model_cache[model_name.to_s] ||= begin
      wf = loader.workflows_for(model_name.to_s).first
      if wf.nil?
        # STI child fallback: try parent model's workflow
        model_def = LcpRuby.loader.model_definitions[model_name.to_s]
        if (parent_name = model_def&.sti_parent_name)
          loader.workflows_for(parent_name).first
        end
      else
        wf
      end
    end
  end
end