Sha256: 2328edfb25aeb918d3d28162c2fa7eb4326949eab8890a047bfeed88a1ea87d3

Contents?: true

Size: 1.63 KB

Versions: 2

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

require 'uri'
require 'net/http'
require_relative 'response'

module TochkaCyclopsApi
  # Module for sending requests to the bank's api
  module Request
    def self.send(body, method)
      @method = method
      initialize_request(body)

      uri = URI('https://pre.tochka.com/api/v1/cyclops/v2/jsonrpc')
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true

      request = Net::HTTP::Post.new(uri, {
        'sign-data' => signature(body),
        'sign-thumbprint' => TochkaCyclopsApi.configuration.sign_thumbprint,
        'sign-system' => TochkaCyclopsApi.configuration.sign_system,
        'Content-Type' => 'application/pdf'
      })
      request.body = body

      response = http.request(request)

      case response.code.to_i
      when (200..299)
        @request.update(status: 'finished')
        TochkaCyclopsApi::Response.create(@request, response, method)
      when (400..499)
        -> { 'Our server error' }[]
      else
        @request.update(status: 'failed')
        -> { 'Their server error' }[]
      end
    end

    def self.signature(body)
      digest = OpenSSL::Digest.new('sha256')
      private_key = OpenSSL::PKey::RSA.new(TochkaCyclopsApi.configuration.private_key)
      signature_key = private_key.sign(digest, body)
      base64_signature = Base64.strict_encode64(signature_key)
      base64_signature.gsub("\n", '')
    end

    def self.initialize_request(body)
      @request = TochkaCyclopsRequest.create(
        method: @method,
        body: body,
        request_identifier: @id,
        # idempotency_key:
        status: 'initialized'
      )
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tochka_cyclops_api-0.3.0 lib/tochka_cyclops_api/request.rb
tochka_cyclops_api-0.2.0 lib/tochka_cyclops_api/request.rb