coinbase_commerce_client 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 +7 -0
- data/.idea/.gitignore +8 -0
- data/.idea/coinbase_commerce_client.iml +85 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rspec +3 -0
- data/.rubocop.yml +11 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +99 -0
- data/LICENSE +21 -0
- data/LICENSE.txt +21 -0
- data/README.md +267 -0
- data/Rakefile +8 -0
- data/assets/banner.png +0 -0
- data/badge.svg +1 -0
- data/lib/coinbase_commerce_client/api_errors.rb +150 -0
- data/lib/coinbase_commerce_client/api_resources/base/api_object.rb +203 -0
- data/lib/coinbase_commerce_client/api_resources/base/api_resource.rb +23 -0
- data/lib/coinbase_commerce_client/api_resources/base/create.rb +12 -0
- data/lib/coinbase_commerce_client/api_resources/base/delete.rb +13 -0
- data/lib/coinbase_commerce_client/api_resources/base/list.rb +23 -0
- data/lib/coinbase_commerce_client/api_resources/base/save.rb +15 -0
- data/lib/coinbase_commerce_client/api_resources/base/update.rb +12 -0
- data/lib/coinbase_commerce_client/api_resources/charge.rb +11 -0
- data/lib/coinbase_commerce_client/api_resources/checkout.rb +15 -0
- data/lib/coinbase_commerce_client/api_resources/event.rb +10 -0
- data/lib/coinbase_commerce_client/api_response.rb +36 -0
- data/lib/coinbase_commerce_client/client.rb +115 -0
- data/lib/coinbase_commerce_client/util.rb +57 -0
- data/lib/coinbase_commerce_client/version.rb +5 -0
- data/lib/coinbase_commerce_client/webhooks.rb +48 -0
- data/lib/coinbase_commerce_client.rb +45 -0
- data/sig/coinbase_commerce_client.rbs +4 -0
- metadata +150 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module CoinbaseCommerceClient
|
|
2
|
+
module Util
|
|
3
|
+
def self.object_classes
|
|
4
|
+
# Class mappings for api responce fetching
|
|
5
|
+
@object_classes ||= {
|
|
6
|
+
# API Resources
|
|
7
|
+
APIResources::Checkout::OBJECT_NAME => APIResources::Checkout,
|
|
8
|
+
APIResources::Charge::OBJECT_NAME => APIResources::Charge,
|
|
9
|
+
APIResources::Event::OBJECT_NAME => APIResources::Event
|
|
10
|
+
}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.convert_to_api_object(data, client = nil, klass = nil)
|
|
14
|
+
# Converts a hash of fields or an array of hashes into a
|
|
15
|
+
# appropriate APIResources of APIObjects form
|
|
16
|
+
case data
|
|
17
|
+
when Array
|
|
18
|
+
data.map { |i| convert_to_api_object(i, client, klass) }
|
|
19
|
+
when Hash
|
|
20
|
+
# If class received in params, create instance
|
|
21
|
+
if klass
|
|
22
|
+
klass.create_from(data, client)
|
|
23
|
+
else
|
|
24
|
+
# Try converting to a known object class.
|
|
25
|
+
# If none available, fall back to generic APIObject
|
|
26
|
+
klass = object_classes.fetch(data[:resource], APIResources::Base::APIObject)
|
|
27
|
+
# Provide client relation only for APIResource objects
|
|
28
|
+
klass != APIResources::Base::APIObject ? klass.create_from(data, client) : klass.create_from(data)
|
|
29
|
+
end
|
|
30
|
+
else
|
|
31
|
+
data
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.symbolize_names(object)
|
|
36
|
+
# Convert object key and values to symbols if its possible
|
|
37
|
+
case object
|
|
38
|
+
when Hash
|
|
39
|
+
new_hash = {}
|
|
40
|
+
object.each do |key, value|
|
|
41
|
+
key = (
|
|
42
|
+
begin
|
|
43
|
+
key.to_sym
|
|
44
|
+
rescue StandardError
|
|
45
|
+
key
|
|
46
|
+
end) || key
|
|
47
|
+
new_hash[key] = symbolize_names(value)
|
|
48
|
+
end
|
|
49
|
+
new_hash
|
|
50
|
+
when Array
|
|
51
|
+
object.map { |value| symbolize_names(value) }
|
|
52
|
+
else
|
|
53
|
+
object
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module CoinbaseCommerceClient
|
|
2
|
+
module Webhook
|
|
3
|
+
def self.construct_event(payload, sig_header, secret)
|
|
4
|
+
data = JSON.parse(payload, symbolize_names: true)
|
|
5
|
+
if data.key?(:event)
|
|
6
|
+
WebhookSignature.verify_header(payload, sig_header, secret)
|
|
7
|
+
CoinbaseCommerceClient::APIResources::Event.create_from(data[:event])
|
|
8
|
+
else
|
|
9
|
+
raise CoinbaseCommerceClient::Errors::WebhookInvalidPayload.new("No event in payload", sig_header, http_body: payload)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module WebhookSignature
|
|
14
|
+
def self.verify_header(payload, sig_header, secret)
|
|
15
|
+
unless [payload, sig_header, secret].all?
|
|
16
|
+
raise CoinbaseCommerceClient::Errors::WebhookInvalidPayload.new("Missing, payload or signature", sig_header, http_body: payload)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
expected_sig = compute_signature(payload, secret)
|
|
20
|
+
unless secure_compare(expected_sig, sig_header)
|
|
21
|
+
raise CoinbaseCommerceClient::Errors::SignatureVerificationError.new(
|
|
22
|
+
"No signatures found matching the expected signature for payload",
|
|
23
|
+
sig_header, http_body: payload
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.secure_compare(a, b)
|
|
30
|
+
return false unless a.bytesize == b.bytesize
|
|
31
|
+
|
|
32
|
+
one = a.unpack "C#{a.bytesize}"
|
|
33
|
+
res = 0
|
|
34
|
+
b.each_byte {|byte| res |= byte ^ one.shift}
|
|
35
|
+
res.zero?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private_class_method :secure_compare
|
|
39
|
+
|
|
40
|
+
def self.compute_signature(payload, secret)
|
|
41
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, payload)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private_class_method :compute_signature
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# general
|
|
4
|
+
require "json"
|
|
5
|
+
require "uri"
|
|
6
|
+
require "openssl"
|
|
7
|
+
require "faraday"
|
|
8
|
+
|
|
9
|
+
# version
|
|
10
|
+
require "coinbase_commerce_client/version"
|
|
11
|
+
|
|
12
|
+
# client
|
|
13
|
+
require "coinbase_commerce_client/client"
|
|
14
|
+
|
|
15
|
+
# api response and errors
|
|
16
|
+
require "coinbase_commerce_client/api_errors"
|
|
17
|
+
require "coinbase_commerce_client/api_response"
|
|
18
|
+
|
|
19
|
+
# api base object
|
|
20
|
+
require "coinbase_commerce_client/api_resources/base/api_object"
|
|
21
|
+
|
|
22
|
+
# api resource base model
|
|
23
|
+
require "coinbase_commerce_client/api_resources/base/api_resource"
|
|
24
|
+
|
|
25
|
+
# api base operations
|
|
26
|
+
require "coinbase_commerce_client/api_resources/base/create"
|
|
27
|
+
require "coinbase_commerce_client/api_resources/base/update"
|
|
28
|
+
require "coinbase_commerce_client/api_resources/base/save"
|
|
29
|
+
require "coinbase_commerce_client/api_resources/base/list"
|
|
30
|
+
require "coinbase_commerce_client/api_resources/base/delete"
|
|
31
|
+
|
|
32
|
+
# api resources
|
|
33
|
+
require "coinbase_commerce_client/api_resources/checkout"
|
|
34
|
+
require "coinbase_commerce_client/api_resources/charge"
|
|
35
|
+
require "coinbase_commerce_client/api_resources/event"
|
|
36
|
+
|
|
37
|
+
# webhooks
|
|
38
|
+
require "coinbase_commerce_client/webhooks"
|
|
39
|
+
|
|
40
|
+
# utils
|
|
41
|
+
require "coinbase_commerce_client/util"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module CoinbaseCommerceClient
|
|
45
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: coinbase_commerce_client
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Vinicius Borges
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2022-10-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: faraday
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.6'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.6'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: multipart-post
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '2.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rake
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: webmock
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
description: Coinbase Commerce integration client for crypto payments
|
|
84
|
+
email:
|
|
85
|
+
- viniciusborgeis@gmail.com
|
|
86
|
+
executables: []
|
|
87
|
+
extensions: []
|
|
88
|
+
extra_rdoc_files: []
|
|
89
|
+
files:
|
|
90
|
+
- ".idea/.gitignore"
|
|
91
|
+
- ".idea/coinbase_commerce_client.iml"
|
|
92
|
+
- ".idea/misc.xml"
|
|
93
|
+
- ".idea/modules.xml"
|
|
94
|
+
- ".idea/vcs.xml"
|
|
95
|
+
- ".rspec"
|
|
96
|
+
- ".rubocop.yml"
|
|
97
|
+
- CODE_OF_CONDUCT.md
|
|
98
|
+
- Gemfile
|
|
99
|
+
- Gemfile.lock
|
|
100
|
+
- LICENSE
|
|
101
|
+
- LICENSE.txt
|
|
102
|
+
- README.md
|
|
103
|
+
- Rakefile
|
|
104
|
+
- assets/banner.png
|
|
105
|
+
- badge.svg
|
|
106
|
+
- lib/coinbase_commerce_client.rb
|
|
107
|
+
- lib/coinbase_commerce_client/api_errors.rb
|
|
108
|
+
- lib/coinbase_commerce_client/api_resources/base/api_object.rb
|
|
109
|
+
- lib/coinbase_commerce_client/api_resources/base/api_resource.rb
|
|
110
|
+
- lib/coinbase_commerce_client/api_resources/base/create.rb
|
|
111
|
+
- lib/coinbase_commerce_client/api_resources/base/delete.rb
|
|
112
|
+
- lib/coinbase_commerce_client/api_resources/base/list.rb
|
|
113
|
+
- lib/coinbase_commerce_client/api_resources/base/save.rb
|
|
114
|
+
- lib/coinbase_commerce_client/api_resources/base/update.rb
|
|
115
|
+
- lib/coinbase_commerce_client/api_resources/charge.rb
|
|
116
|
+
- lib/coinbase_commerce_client/api_resources/checkout.rb
|
|
117
|
+
- lib/coinbase_commerce_client/api_resources/event.rb
|
|
118
|
+
- lib/coinbase_commerce_client/api_response.rb
|
|
119
|
+
- lib/coinbase_commerce_client/client.rb
|
|
120
|
+
- lib/coinbase_commerce_client/util.rb
|
|
121
|
+
- lib/coinbase_commerce_client/version.rb
|
|
122
|
+
- lib/coinbase_commerce_client/webhooks.rb
|
|
123
|
+
- sig/coinbase_commerce_client.rbs
|
|
124
|
+
homepage: https://github.com/viniciusborgeis/coinbase_commerce_client
|
|
125
|
+
licenses:
|
|
126
|
+
- MIT
|
|
127
|
+
metadata:
|
|
128
|
+
homepage_uri: https://github.com/viniciusborgeis/coinbase_commerce_client
|
|
129
|
+
source_code_uri: https://github.com/viniciusborgeis/coinbase_commerce_client
|
|
130
|
+
changelog_uri: https://github.com/viniciusborgeis/coinbase_commerce_client
|
|
131
|
+
post_install_message:
|
|
132
|
+
rdoc_options: []
|
|
133
|
+
require_paths:
|
|
134
|
+
- lib
|
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
136
|
+
requirements:
|
|
137
|
+
- - ">="
|
|
138
|
+
- !ruby/object:Gem::Version
|
|
139
|
+
version: 2.6.0
|
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
|
+
requirements:
|
|
142
|
+
- - ">="
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: '0'
|
|
145
|
+
requirements: []
|
|
146
|
+
rubygems_version: 3.3.7
|
|
147
|
+
signing_key:
|
|
148
|
+
specification_version: 4
|
|
149
|
+
summary: Coinbase Commerce integration client for crypto payments
|
|
150
|
+
test_files: []
|