Class: CommandTower::Configuration::Registry::PrincipalCapabilities::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/command_tower/configuration/registry/principal_capabilities/config.rb

Constant Summary collapse

PLATFORM_CAPABILITIES =

Curated CT-owned frontend-projectable capabilities (1:1 entity names). Deliberate registration only — never an automatic Entity.entities dump.

%i[
  admin_workspace
  admin_audit_events
  admin_messaging_announcements
  admin_users
  admin_users_update
  admin_rbac_assignments
  admin_impersonation
  me_audit_events
].freeze

Instance Method Summary collapse

Constructor Details

#initializeConfig

Returns a new instance of Config.



24
25
26
27
28
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 24

def initialize
  @definitions = {}
  @finalized = false
  seed_platform_capabilities!
end

Instance Method Details

#capability(name, owner: :host) {|definition| ... } ⇒ 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/command_tower/configuration/registry/principal_capabilities/config.rb', line 30

def capability(name, owner: :host)
  raise CommandTower::PrincipalCapabilities::FrozenRegistryError,
    "principal capabilities registry is frozen" if @finalized

  normalized = normalize_name!(name)
  existing = @definitions[normalized]
  if existing
    if existing.owner == :command_tower && owner == :host
      raise CommandTower::PrincipalCapabilities::HostOverrideError,
        "host cannot redefine CommandTower-owned principal capability #{normalized}"
    end

    raise CommandTower::PrincipalCapabilities::DuplicateCapabilityError,
      "principal capability #{normalized} is already registered"
  end

  definition = CapabilityDefinition.new
  yield definition if block_given?
  definition.owner = owner
  definition.validate_definition!(name: normalized)
  @definitions[normalized] = definition
  definition
end

#definitionsObject



71
72
73
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 71

def definitions
  @definitions.dup.freeze
end

#fetch(name) ⇒ Object



54
55
56
57
58
59
60
61
62
63
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 54

def fetch(name)
  normalized = normalize_name!(name)
  definition = @definitions[normalized]
  if definition.nil?
    raise CommandTower::PrincipalCapabilities::UnregisteredCapabilityError,
      "principal capability #{normalized} is not registered"
  end

  definition
end

#finalize!Object



75
76
77
78
79
80
81
82
83
84
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 75

def finalize!
  @definitions.each_value do |definition|
    next unless definition.respond_to?(:class_composer_freeze_objects!)

    definition.class_composer_freeze_objects!(behavior: :raise, children: true)
  end
  @definitions.freeze
  @finalized = true
  self
end

#finalized?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 86

def finalized?
  @finalized
end

#registered?(name) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
68
69
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 65

def registered?(name)
  @definitions.key?(normalize_name!(name))
rescue CommandTower::PrincipalCapabilities::InvalidCapabilityNameError
  false
end

#reset_host_definitions!Object



102
103
104
105
106
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 102

def reset_host_definitions!
  thaw_for_test!
  @definitions.delete_if { |_name, definition| definition.owner == :host }
  self
end

#validate_required_entities!(entities) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
# File 'lib/command_tower/configuration/registry/principal_capabilities/config.rb', line 90

def validate_required_entities!(entities)
  missing = @definitions.filter_map do |name, definition|
    next if entities.key?(definition.required_entity)

    "#{name} requires #{definition.required_entity}"
  end
  return self if missing.empty?

  raise CommandTower::PrincipalCapabilities::MissingRequiredEntityError,
    "principal capabilities reference unknown RBAC entities: #{missing.join(", ")}"
end