Module: Legion::API::Routes::Transport

Defined in:
lib/legion/api/transport.rb

Class Method Summary collapse

Class Method Details

.register_discovery(app) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/legion/api/transport.rb', line 40

def self.register_discovery(app)
  app.get '/api/transport/exchanges' do
    klass = defined?(Legion::Transport::Exchange) ? Legion::Transport::Exchange : nil
    json_response(klass ? transport_subclasses(klass) : [])
  end

  app.get '/api/transport/queues' do
    klass = defined?(Legion::Transport::Queue) ? Legion::Transport::Queue : nil
    json_response(klass ? transport_subclasses(klass) : [])
  end
end

.register_publish(app) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/legion/api/transport.rb', line 52

def self.register_publish(app)
  app.post '/api/transport/publish' do
    Legion::Logging.debug "API: POST /api/transport/publish params=#{params.keys}"
    body = parse_request_body
    unless body[:exchange]
      Legion::Logging.warn 'API POST /api/transport/publish returned 422: exchange is required'
      halt 422, json_error('missing_field', 'exchange is required', status_code: 422)
    end
    unless body[:routing_key]
      Legion::Logging.warn 'API POST /api/transport/publish returned 422: routing_key is required'
      halt 422, json_error('missing_field', 'routing_key is required', status_code: 422)
    end

    message = Legion::Transport::Messages::Dynamic.new(
      exchange: body[:exchange], routing_key: body[:routing_key], **(body[:payload] || {})
    )
    message.publish
    Legion::Logging.info "API: published message to exchange=#{body[:exchange]} routing_key=#{body[:routing_key]}"
    json_response({ published: true, exchange: body[:exchange], routing_key: body[:routing_key] }, status_code: 201)
  rescue StandardError => e
    Legion::Logging.error "API POST /api/transport/publish: #{e.class}#{e.message}"
    json_error('publish_error', e.message, status_code: 500)
  end
end

.register_status(app) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/legion/api/transport.rb', line 13

def self.register_status(app)
  app.get '/api/transport' do
    connected = begin
      Legion::Settings[:transport][:connected]
    rescue StandardError => e
      Legion::Logging.debug "Transport#status failed to read connected setting: #{e.message}" if defined?(Legion::Logging)
      false
    end
    session_open = begin
      Legion::Transport::Connection.session_open?
    rescue StandardError => e
      Legion::Logging.debug "Transport#status failed to check session_open: #{e.message}" if defined?(Legion::Logging)
      false
    end
    channel_open = begin
      Legion::Transport::Connection.channel_open?
    rescue StandardError => e
      Legion::Logging.debug "Transport#status failed to check channel_open: #{e.message}" if defined?(Legion::Logging)
      false
    end
    connector = defined?(Legion::Transport::TYPE) ? Legion::Transport::TYPE.to_s : 'unknown'

    json_response({ connected: connected, session_open: session_open,
                    channel_open: channel_open, connector: connector })
  end
end

.registered(app) ⇒ Object



7
8
9
10
11
# File 'lib/legion/api/transport.rb', line 7

def self.registered(app)
  register_status(app)
  register_discovery(app)
  register_publish(app)
end