Module: Legion::Trigger

Defined in:
lib/legion/trigger.rb,
lib/legion/trigger/envelope.rb,
lib/legion/trigger/sources/base.rb,
lib/legion/trigger/sources/slack.rb,
lib/legion/trigger/sources/github.rb,
lib/legion/trigger/sources/linear.rb

Defined Under Namespace

Modules: Sources Classes: Envelope

Constant Summary collapse

SOURCES =
{
  'github' => Sources::Github,
  'slack'  => Sources::Slack,
  'linear' => Sources::Linear
}.freeze

Class Method Summary collapse

Class Method Details

.process(source_name:, headers:, body_raw:, body:) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/legion/trigger.rb', line 27

def process(source_name:, headers:, body_raw:, body:)
  adapter = source_for(source_name)
  secret = secret_for(source_name)

  verified = if secret
               adapter.verify_signature(headers: headers, body_raw: body_raw, secret: secret)
             else
               false
             end

  normalized = adapter.normalize(headers: headers, body: body)
  envelope = Envelope.new(**normalized, verified: verified)

  return { success: false, reason: :duplicate, delivery_id: envelope.delivery_id } if duplicate?(envelope)

  return { success: false, reason: :unverified } if !verified && require_verified?(source_name)

  bridge(envelope)
  mark_seen(envelope)

  { success: true, correlation_id: envelope.correlation_id, routing_key: envelope.routing_key }
rescue ArgumentError => e
  { success: false, reason: :unknown_source, error: e.message }
rescue StandardError => e
  Legion::Logging.error "[Trigger] process failed: #{e.message}" if defined?(Legion::Logging)
  dead_letter(source_name, body_raw, e)
  { success: false, reason: :error, error: e.message }
end

.registered_sourcesObject



56
57
58
# File 'lib/legion/trigger.rb', line 56

def registered_sources
  SOURCES.keys
end

.source_for(name) ⇒ Object

Raises:

  • (ArgumentError)


20
21
22
23
24
25
# File 'lib/legion/trigger.rb', line 20

def source_for(name)
  klass = SOURCES[name.to_s]
  raise ArgumentError, "unknown trigger source: #{name} (available: #{SOURCES.keys.join(', ')})" unless klass

  klass.new
end