pepijn/omni_kassa

View on GitHub
lib/omni_kassa/request.rb

Summary

Maintainability
A
0 mins
Test Coverage
module OmniKassa
  class Request
    # OmniKassa requirement, doesn't do anything
    KEY_VERSION = 1

    # OmniKassa requirement, doesn't do anything
    INTERFACE_VERSION = 'HP_1.0'

    REQUIRED = :merchant_id, :currency_code, :transaction_reference,
      :order_id, :amount, :normal_return_url, :key_version,
      :automatic_response_url, :customer_language

    OPTIONAL = :payment_mean_brand_list, :customer_language, :expiration_date

    attr_accessor *REQUIRED, *OPTIONAL

    def initialize
      self.key_version = KEY_VERSION

      # Load default settings into the request
      OmniKassa.request_settings.each do |key, value|
        send key.to_s + '=', value
      end
    end

    def valid?
      REQUIRED.map do |attr|
        value = send attr
        return false if value.nil?
      end
    end

    def perform
      HTTParty.post(OmniKassa.url, query: query).body
    end

    def transaction_reference
      @transaction_reference.call(order_id)
    end

    def query
      {
        InterfaceVersion: INTERFACE_VERSION,
        Data: data,
        Seal: seal
      }
    end

    protected

    def data
      data_hash.to_a.map {|a| a.join('=') }.join('|')
    end

    def data_hash
      REQUIRED.each do |param|
        value = send param
        raise RequestError, "attribute '#{param}' missing" if value.nil?
      end
      [OPTIONAL, REQUIRED].flatten.map do |param|
        value = send param
        [param.to_s.camelcase(:lower), value]
      end
    end

    def seal
      Digest::SHA2.new.update data + OmniKassa.secret_key
    end

    class RequestError < OmniKassaError; end
  end
end