Class: PgSqlTriggers::Registry::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/pg_sql_triggers/registry/validator.rb

Overview

rubocop:disable Metrics/ClassLength – validation rules grouped in one class

Constant Summary collapse

VALID_EVENTS =
%w[insert update delete truncate].freeze
VALID_TIMINGS =
%w[before after instead_of].freeze
VALID_FOR_EACH =
%w[row statement].freeze

Class Method Summary collapse

Class Method Details

Prerequisite and dependent DSL triggers for the trigger detail page.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/pg_sql_triggers/registry/validator.rb', line 41

def self.related_triggers_for_show(trigger_record)
  empty = { prerequisites: [], dependents: [] }
  return empty if trigger_record.blank? || trigger_record.source != "dsl"

  defn = parse_definition(trigger_record.definition)
  prerequisite_names = normalize_depends_on(defn)
  prerequisites = prerequisite_names.filter_map do |dep_name|
    PgSqlTriggers::TriggerRegistry.find_by(source: "dsl", trigger_name: dep_name)
  end

  dependents = []
  PgSqlTriggers::TriggerRegistry.where(source: "dsl").find_each do |row|
    next if row.id == trigger_record.id

    other = parse_definition(row.definition)
    dependents << row if normalize_depends_on(other).include?(trigger_record.trigger_name)
  end

  {
    prerequisites: prerequisites.sort_by(&:trigger_name),
    dependents: dependents.sort_by(&:trigger_name)
  }
end

.trigger_order_validation_errorsObject

Returns dependency-related errors (missing refs, cycles, incompatible pairs, name order). Used by rake trigger:validate_order and included in validate!.



35
36
37
38
# File 'lib/pg_sql_triggers/registry/validator.rb', line 35

def self.trigger_order_validation_errors
  dsl_triggers = PgSqlTriggers::TriggerRegistry.where(source: "dsl").to_a
  collect_dependency_and_order_errors(dsl_triggers)
end

.validate!Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/pg_sql_triggers/registry/validator.rb', line 14

def self.validate!
  errors = []
  dsl_triggers = PgSqlTriggers::TriggerRegistry.where(source: "dsl").to_a

  dsl_triggers.each do |trigger|
    errors.concat(validate_dsl_trigger(trigger))
  end

  errors.concat(collect_dependency_and_order_errors(dsl_triggers))

  return true if errors.empty?

  raise PgSqlTriggers::ValidationError.new(
    "Registry validation failed:\n#{errors.map { |e| "  - #{e}" }.join("\n")}",
    error_code: "VALIDATION_FAILED",
    context: { errors: errors }
  )
end