payrex-ruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f91802f5ac711f39690688ab7d7a63223cb3b9ed3676a8eaeb1d06c0e6a7c2f5
4
+ data.tar.gz: f41c8b40870f8c3a08c3958e033f8b342e5194dab3d2723c8c9da6913888671a
5
+ SHA512:
6
+ metadata.gz: 3768afe1c85418798db0e8e6977c25a74bc9f86b6925230995fa63d36677640160a025e7b2c6edf9ab53c00d8f751d50c822efe7f72350c4065a37e61ea4d06f
7
+ data.tar.gz: fff3b4ef19d2a0f3439eaa45f247aad832e03a6b6757acc4246e9f8582e42a28996eea9a40ae94e383a60903dcca4cf0b005121bc21a61a7667d640962f0077e
@@ -0,0 +1,9 @@
1
+ module Payrex
2
+ class ApiResource
3
+ attr_reader :data
4
+
5
+ def initialize(response)
6
+ @data = response
7
+ end
8
+ end
9
+ end
data/lib/client.rb ADDED
@@ -0,0 +1,23 @@
1
+ module Payrex
2
+ class Client
3
+ attr_reader :config
4
+
5
+ def initialize(api_key)
6
+ @config = Payrex::Config.new(api_key)
7
+
8
+ initialize_services
9
+ end
10
+
11
+ private
12
+
13
+ def initialize_services
14
+ Payrex::Services::ServiceFactory.names.each do |name|
15
+ define_singleton_method(name) do
16
+ service = Payrex::Services::ServiceFactory.get(name)
17
+
18
+ service.new(self)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/config.rb ADDED
@@ -0,0 +1,13 @@
1
+ module Payrex
2
+ class Config
3
+ attr_reader :api_base_url,
4
+ :api_key
5
+
6
+ API_BASE_URL = "https://api.payrexhq.com"
7
+
8
+ def initialize(api_key)
9
+ @api_base_url = API_BASE_URL
10
+ @api_key = api_key
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,49 @@
1
+ module Payrex
2
+ module Entities
3
+ class CheckoutSession
4
+ attr_reader :id,
5
+ :resource,
6
+ :customer_reference_id,
7
+ :client_secret,
8
+ :status,
9
+ :currency,
10
+ :line_items,
11
+ :livemode,
12
+ :url,
13
+ :payment_intent,
14
+ :metadata,
15
+ :success_url,
16
+ :cancel_url,
17
+ :payment_methods,
18
+ :capture_type,
19
+ :description,
20
+ :submit_type,
21
+ :expires_at,
22
+ :created_at,
23
+ :updated_at
24
+
25
+ def initialize(api_resource)
26
+ @id = api_resource.data["id"]
27
+ @resource = api_resource.data["resource"]
28
+ @customer_reference_id = api_resource.data["customer_reference_id"]
29
+ @client_secret = api_resource.data["client_secret"]
30
+ @status = api_resource.data["status"]
31
+ @currency = api_resource.data["currency"]
32
+ @line_items = api_resource.data["line_items"]
33
+ @livemode = api_resource.data["livemode"]
34
+ @url = api_resource.data["url"]
35
+ @payment_intent = api_resource.data["payment_intent"]
36
+ @metadata = api_resource.data["metadata"]
37
+ @success_url = api_resource.data["success_url"]
38
+ @cancel_url = api_resource.data["cancel_url"]
39
+ @payment_methods = api_resource.data["payment_methods"]
40
+ @capture_type = api_resource.data["capture_type"]
41
+ @description = api_resource.data["description"]
42
+ @submit_type = api_resource.data["submit_type"]
43
+ @expires_at = api_resource.data["expires_at"]
44
+ @created_at = api_resource.data["created_at"]
45
+ @updated_at = api_resource.data["updated_at"]
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,13 @@
1
+ module Payrex
2
+ module Entities
3
+ class Listing
4
+ attr_reader :data,
5
+ :has_more
6
+
7
+ def initialize(data:, has_more:)
8
+ @data = data
9
+ @has_more = has_more
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ module Payrex
2
+ module Entities
3
+ class Merchant
4
+ attr_reader :id,
5
+ :resource,
6
+ :connection_type,
7
+ :livemode,
8
+ :created_at,
9
+ :updated_at
10
+
11
+ def initialize(api_resource)
12
+ @id = api_resource.data["id"]
13
+ @resource = api_resource.data["resource"]
14
+ @connection_type = api_resource.data["connection_type"]
15
+ @livemode = api_resource.data["livemode"]
16
+ @created_at = api_resource.data["created_at"]
17
+ @updated_at = api_resource.data["updated_at"]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,45 @@
1
+ module Payrex
2
+ module Entities
3
+ class PaymentIntent
4
+ attr_reader :id,
5
+ :resource,
6
+ :amount,
7
+ :capture_type,
8
+ :client_secret,
9
+ :currency,
10
+ :description,
11
+ :livemode,
12
+ :metadata,
13
+ :latest_payment,
14
+ :payment_method_id,
15
+ :payment_methods,
16
+ :status,
17
+ :next_action,
18
+ :return_url,
19
+ :capture_before_at,
20
+ :created_at,
21
+ :updated_at
22
+
23
+ def initialize(api_resource)
24
+ @id = api_resource.data["id"]
25
+ @resource = api_resource.data["resource"]
26
+ @amount = api_resource.data["amount"]
27
+ @capture_type = api_resource.data["capture_type"]
28
+ @client_secret = api_resource.data["client_secret"]
29
+ @currency = api_resource.data["currency"]
30
+ @description = api_resource.data["description"]
31
+ @livemode = api_resource.data["livemode"]
32
+ @metadata = api_resource.data["metadata"]
33
+ @latest_payment = api_resource.data["latest_payment"]
34
+ @payment_method_id = api_resource.data["payment_method_id"]
35
+ @payment_methods = api_resource.data["payment_methods"]
36
+ @status = api_resource.data["status"]
37
+ @next_action = api_resource.data["next_action"]
38
+ @return_url = api_resource.data["return_url"]
39
+ @capture_before_at = api_resource.data["capture_before_at"]
40
+ @created_at = api_resource.data["created_at"]
41
+ @updated_at = api_resource.data["updated_at"]
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ module Payrex
2
+ module Entities
3
+ class PaymentMethod
4
+ attr_reader :id,
5
+ :resource,
6
+ :type,
7
+ :billing_details,
8
+ :livemode,
9
+ :metadata,
10
+ :created_at,
11
+ :updated_at
12
+
13
+ def initialize(api_resource)
14
+ @id = api_resource.data["id"]
15
+ @resource = api_resource.data["resource"]
16
+ @type = api_resource.data["type"]
17
+ @billing_details = api_resource.data["billing_details"]
18
+ @livemode = api_resource.data["livemode"]
19
+ @metadata = api_resource.data["metadata"]
20
+ @created_at = api_resource.data["created_at"]
21
+ @updated_at = api_resource.data["updated_at"]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ module Payrex
2
+ module Entities
3
+ class Refund
4
+ attr_reader :id,
5
+ :resource,
6
+ :amount,
7
+ :currency,
8
+ :livemode,
9
+ :status,
10
+ :description,
11
+ :reason,
12
+ :remarks,
13
+ :payment_id,
14
+ :metadata,
15
+ :created_at,
16
+ :updated_at
17
+
18
+ def initialize(api_resource)
19
+ @id = api_resource.data["id"]
20
+ @resource = api_resource.data["resource"]
21
+ @amount = api_resource.data["amount"]
22
+ @currency = api_resource.data["currency"]
23
+ @livemode = api_resource.data["livemode"]
24
+ @status = api_resource.data["status"]
25
+ @description = api_resource.data["description"]
26
+ @reason = api_resource.data["reason"]
27
+ @remarks = api_resource.data["remarks"]
28
+ @payment_id = api_resource.data["payment_id"]
29
+ @metadata = api_resource.data["metadata"]
30
+ @created_at = api_resource.data["created_at"]
31
+ @updated_at = api_resource.data["updated_at"]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ module Payrex
2
+ module Entities
3
+ class Webhook
4
+ attr_reader :id,
5
+ :resource,
6
+ :secret_key,
7
+ :status,
8
+ :description,
9
+ :livemode,
10
+ :url,
11
+ :events,
12
+ :created_at,
13
+ :updated_at
14
+
15
+ def initialize(api_resource)
16
+ @id = api_resource.data["id"]
17
+ @resource = api_resource.data["resource"]
18
+ @secret_key = api_resource.data["secret_key"]
19
+ @status = api_resource.data["status"]
20
+ @description = api_resource.data["description"]
21
+ @livemode = api_resource.data["livemode"]
22
+ @url = api_resource.data["url"]
23
+ @events = api_resource.data["events"]
24
+ @created_at = api_resource.data["created_at"]
25
+ @updated_at = api_resource.data["updated_at"]
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ module Payrex
2
+ module Errors
3
+ class AuthenticationInvalidError < BaseError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ module Payrex
2
+ module Errors
3
+ class BaseError < StandardError
4
+ attr_reader :errors
5
+
6
+ def initialize(response)
7
+ @errors = response["errors"].map { |error| PayrexError.new(error) }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ module Payrex
2
+ module Errors
3
+ class RequestInvalidError < BaseError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Payrex
2
+ module Errors
3
+ class ResourceNotFoundError < BaseError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,60 @@
1
+ module Payrex
2
+ class HttpClient
3
+ def initialize(api_key:, base_url:)
4
+ @api_key = api_key
5
+ @base_url = base_url
6
+ end
7
+
8
+ def request(method:, params: {}, path:)
9
+ uri = URI("#{@base_url}/#{path}")
10
+
11
+ request = build_request(method: method, params: params, uri: uri)
12
+
13
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(request) }
14
+
15
+ handle_error(response) if !successful?(response)
16
+
17
+ Payrex::ApiResource.new(JSON.parse(response.body))
18
+ end
19
+
20
+ private
21
+
22
+ def build_request(method:, params: {}, uri:)
23
+ request_class = Net::HTTP.const_get(method.capitalize)
24
+ request = request_class.new(uri)
25
+
26
+ set_request_headers(request)
27
+ set_request_body(request, params) if %i[post put].include?(method)
28
+
29
+ request
30
+ end
31
+
32
+ def handle_error(response)
33
+ json_response_body = JSON.parse(response.body)
34
+
35
+ case response.code
36
+ when "400"
37
+ raise Payrex::Errors::RequestInvalidError.new(json_response_body)
38
+ when "401"
39
+ raise Payrex::Errors::AuthenticationInvalidError.new(json_response_body)
40
+ when "404"
41
+ raise Payrex::Errors::ResourceNotFoundError.new(json_response_body)
42
+ else
43
+ raise Payrex::Errors::BaseError.new(json_response_body)
44
+ end
45
+ end
46
+
47
+ def set_request_headers(request)
48
+ request.basic_auth(@api_key, "")
49
+ request["Content-Type"] = "application/json"
50
+ end
51
+
52
+ def set_request_body(request, params)
53
+ request.body = params.to_json
54
+ end
55
+
56
+ def successful?(response)
57
+ response.code == "200"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,31 @@
1
+ require "json"
2
+ require "net/http"
3
+ require "openssl"
4
+
5
+ require_relative "api_resource"
6
+ require_relative "client"
7
+ require_relative "config"
8
+ require_relative "http_client"
9
+ require_relative "payrex_error"
10
+ require_relative "entities/checkout_session"
11
+ require_relative "entities/listing"
12
+ require_relative "entities/merchant"
13
+ require_relative "entities/payment_intent"
14
+ require_relative "entities/payment_method"
15
+ require_relative "entities/refund"
16
+ require_relative "entities/webhook"
17
+ require_relative "errors/base_error"
18
+ require_relative "errors/authentication_invalid_error"
19
+ require_relative "errors/request_invalid_error"
20
+ require_relative "errors/resource_not_found_error"
21
+ require_relative "services/base_service"
22
+ require_relative "services/checkout_session_service"
23
+ require_relative "services/merchant_service"
24
+ require_relative "services/payment_intent_service"
25
+ require_relative "services/payment_method_service"
26
+ require_relative "services/refund_service"
27
+ require_relative "services/webhook_service"
28
+ require_relative "services/service_factory"
29
+
30
+ module Payrex
31
+ end
@@ -0,0 +1,13 @@
1
+ module Payrex
2
+ class PayrexError
3
+ attr_reader :code,
4
+ :detail,
5
+ :parameter
6
+
7
+ def initialize(error)
8
+ @code = error["code"]
9
+ @detail = error["detail"]
10
+ @parameter = error["parameter"]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ module Payrex
2
+ module Services
3
+ class BaseService
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def request(is_list: false, method:, object:, path:, payload: {})
9
+ http_client = Payrex::HttpClient.new(api_key: @client.config.api_key, base_url: @client.config.api_base_url)
10
+
11
+ api_resource = http_client.request(
12
+ method: method,
13
+ params: payload,
14
+ path: path
15
+ )
16
+
17
+ if is_list
18
+ data = api_resource.data["data"].map { |data| object.new(Payrex::ApiResource.new(data)) }
19
+
20
+ Payrex::Entities::Listing.new(data: data, has_more: api_resource.data["has_more"])
21
+ else
22
+ object.new(api_resource)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,44 @@
1
+ module Payrex
2
+ module Services
3
+ class CheckoutSessionService < BaseService
4
+ PATH = "checkout_sessions"
5
+
6
+ def create(payload)
7
+ request(
8
+ method: :post,
9
+ object: Payrex::Entities::CheckoutSession,
10
+ path: PATH,
11
+ payload: payload
12
+ )
13
+ end
14
+
15
+ def list(payload)
16
+ request(
17
+ is_list: true,
18
+ method: :get,
19
+ object: Payrex::Entities::CheckoutSession,
20
+ path: PATH,
21
+ payload: payload
22
+ )
23
+ end
24
+
25
+ def retrieve(id)
26
+ request(
27
+ method: :get,
28
+ object: Payrex::Entities::CheckoutSession,
29
+ path: "#{PATH}/#{id}",
30
+ payload: {}
31
+ )
32
+ end
33
+
34
+ def expire(id)
35
+ request(
36
+ method: :post,
37
+ object: Payrex::Entities::CheckoutSession,
38
+ path: "#{PATH}/#{id}/expire",
39
+ payload: {}
40
+ )
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,16 @@
1
+ module Payrex
2
+ module Services
3
+ class MerchantService < BaseService
4
+ PATH = "merchants"
5
+
6
+ def create(payload)
7
+ request(
8
+ method: :post,
9
+ object: Payrex::Entities::Merchant,
10
+ path: PATH,
11
+ payload: payload
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,34 @@
1
+ module Payrex
2
+ module Services
3
+ class PaymentIntentService < BaseService
4
+ PATH = "payment_intents"
5
+
6
+ def capture(id, payload)
7
+ request(
8
+ method: :post,
9
+ object: Payrex::Entities::PaymentIntent,
10
+ path: "#{PATH}/#{id}/capture",
11
+ payload: payload
12
+ )
13
+ end
14
+
15
+ def create(payload)
16
+ request(
17
+ method: :post,
18
+ object: Payrex::Entities::PaymentIntent,
19
+ path: PATH,
20
+ payload: payload
21
+ )
22
+ end
23
+
24
+ def retrieve(id)
25
+ request(
26
+ method: :get,
27
+ object: Payrex::Entities::PaymentIntent,
28
+ path: "#{PATH}/#{id}",
29
+ payload: {}
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,16 @@
1
+ module Payrex
2
+ module Services
3
+ class PaymentMethodService < BaseService
4
+ PATH = "payment_methods"
5
+
6
+ def create(payload)
7
+ request(
8
+ method: :post,
9
+ object: Payrex::Entities::PaymentMethod,
10
+ path: PATH,
11
+ payload: payload
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Payrex
2
+ module Services
3
+ class RefundService < BaseService
4
+ PATH = "refunds"
5
+
6
+ def create(payload)
7
+ request(
8
+ method: :post,
9
+ object: Payrex::Entities::Refund,
10
+ path: PATH,
11
+ payload: payload
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+
2
+ module Payrex
3
+ module Services
4
+ class ServiceFactory
5
+ def self.get(name)
6
+ service_name = name.to_s.split("_").map(&:capitalize).join
7
+ service_class = Payrex::Services.const_get("#{service_name}Service")
8
+
9
+ raise ArgumentError, "Unknown service: #{name}" if !service_class.is_a?(Class)
10
+
11
+ service_class
12
+ end
13
+
14
+ def self.names
15
+ Payrex::Services.constants
16
+ .map { |c| Payrex::Services.const_get(c) }
17
+ .select { |c| c.is_a?(Class) }
18
+ .map { |c| c.to_s.split("::").last.sub(/Service$/, "").gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,71 @@
1
+ module Payrex
2
+ module Services
3
+ class WebhookService < BaseService
4
+ PATH = "webhooks"
5
+
6
+ def create(payload)
7
+ request(
8
+ method: :post,
9
+ object: Payrex::Entities::Webhook,
10
+ path: PATH,
11
+ payload: payload
12
+ )
13
+ end
14
+
15
+ def update(id, payload)
16
+ request(
17
+ method: :put,
18
+ object: Payrex::Entities::Webhook,
19
+ path: "#{PATH}/#{id}",
20
+ payload: payload
21
+ )
22
+ end
23
+
24
+ def list(payload)
25
+ request(
26
+ is_list: true,
27
+ method: :get,
28
+ object: Payrex::Entities::Webhook,
29
+ path: PATH,
30
+ payload: payload
31
+ )
32
+ end
33
+
34
+ def retrieve(id)
35
+ request(
36
+ method: :get,
37
+ object: Payrex::Entities::Webhook,
38
+ path: "#{PATH}/#{id}",
39
+ payload: {}
40
+ )
41
+ end
42
+
43
+ def enable(id)
44
+ request(
45
+ method: :post,
46
+ object: Payrex::Entities::Webhook,
47
+ path: "#{PATH}/#{id}/enable",
48
+ payload: {}
49
+ )
50
+ end
51
+
52
+ def disable(id)
53
+ request(
54
+ method: :post,
55
+ object: Payrex::Entities::Webhook,
56
+ path: "#{PATH}/#{id}/disable",
57
+ payload: {}
58
+ )
59
+ end
60
+
61
+ def delete(id)
62
+ request(
63
+ method: :delete,
64
+ object: Payrex::Entities::Webhook,
65
+ path: "#{PATH}/#{id}",
66
+ payload: {}
67
+ )
68
+ end
69
+ end
70
+ end
71
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: payrex-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - PayRex
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: PayRex Ruby Library
14
+ email: support@payrexhq.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/api_resource.rb
20
+ - lib/client.rb
21
+ - lib/config.rb
22
+ - lib/entities/checkout_session.rb
23
+ - lib/entities/listing.rb
24
+ - lib/entities/merchant.rb
25
+ - lib/entities/payment_intent.rb
26
+ - lib/entities/payment_method.rb
27
+ - lib/entities/refund.rb
28
+ - lib/entities/webhook.rb
29
+ - lib/errors/authentication_invalid_error.rb
30
+ - lib/errors/base_error.rb
31
+ - lib/errors/request_invalid_error.rb
32
+ - lib/errors/resource_not_found_error.rb
33
+ - lib/http_client.rb
34
+ - lib/payrex-ruby.rb
35
+ - lib/payrex_error.rb
36
+ - lib/services/base_service.rb
37
+ - lib/services/checkout_session_service.rb
38
+ - lib/services/merchant_service.rb
39
+ - lib/services/payment_intent_service.rb
40
+ - lib/services/payment_method_service.rb
41
+ - lib/services/refund_service.rb
42
+ - lib/services/service_factory.rb
43
+ - lib/services/webhook_service.rb
44
+ homepage: https://www.payrexhq.com/
45
+ licenses:
46
+ - MIT
47
+ metadata: {}
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubygems_version: 3.0.3.1
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: PayRex Ruby
67
+ test_files: []