Sha256: 0135d7c7256a00e3a7991487c0fc9bb7535a28013cbc4a04147ced0c3ca7374a

Contents?: true

Size: 1.49 KB

Versions: 2

Compression:

Stored size: 1.49 KB

Contents

module WebhookSystem

  # This is the ActiveJob in charge of actually sending each event
  class Job < ActiveJob::Base

    # Exception class around non 200 responses
    class RequestFailed < RuntimeError
      def initialize(message, code)
        super(message)
        @code = code
      end
    end

    def perform(subscription, event)
      self.class.post(subscription, event)
    end

    def self.post(subscription, event)
      client = build_client
      request = build_request(client, subscription, event)
      response = client.builder.build_response(client, request)
      log_response(subscription, event, request, response)
      ensure_success(response)
    end

    def self.ensure_success(response)
      status = response.status
      unless status == 200
        raise RequestFailed.new("request failed with code: #{status}", status)
      end
    end

    def self.build_request(client, subscription, event)
      payload = Encoder.encode(subscription.secret, event)
      client.build_request(:post) do |req|
        req.url subscription.url
        req.headers['Content-Type'] = 'application/json; base64+aes256'
        req.body = payload.to_s
      end
    end

    def self.log_response(subscription, event, request, response)
      EventLog.construct(subscription, event, request, response).save!
    end

    def self.build_client
      Faraday.new do |faraday|
        faraday.response :logger if ENV['WEBHOOK_DEBUG']
        faraday.adapter Faraday.default_adapter
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
webhook_system-1.0.1 lib/webhook_system/job.rb
webhook_system-1.0.0 lib/webhook_system/job.rb