Sha256: d989c425206157f97af2764652d2e762206dbcbd14d095239b55d1e13abebbef

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

# frozen_string_literal: true

module Webhookr
  class Service
    attr_reader :service_name

    def initialize(service_name, options = {})
      @service_name = (service_name || '').downcase
      @raw_payload = options[:payload]
      available?
      validate_security_token(options[:security_token]) if configured_security_token
    end

    def process!
      Array.wrap(service_adapter.send(:process, @raw_payload)).each do |payload|
        callback(callback_class, payload)
      end
    end

    private

      def callback(object, payload)
        method = method_for(payload)
        object.send(method, payload) if object.respond_to?(method)
      end

      def method_for(payload)
        "on_#{payload.event_type}"
      end

      def callback_class
        callback = Webhookr.config[service_name].try(:callback)
        raise Webhookr::MissingCallbackClassError, service_name if callback.nil?

        @call_back_class || callback.new
      end

      def configured_security_token
        Webhookr.config[service_name].try(:security_token)
      end

      def validate_security_token(token)
        raise Webhookr::InvalidSecurityTokenError if token.nil? || !SecureCompare.compare(token, configured_security_token)
      end

      def service_adapter
        raise Webhookr::InvalidServiceNameError, service_name unless Webhookr.adapters[service_name]
        @service_adapter ||= Webhookr.adapters[service_name]
      end

      def available?
        !!service_adapter
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
webhookr-0.3.0 lib/webhookr/service.rb