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.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.gitignore +8 -0
  3. data/.idea/coinbase_commerce_client.iml +85 -0
  4. data/.idea/misc.xml +4 -0
  5. data/.idea/modules.xml +8 -0
  6. data/.idea/vcs.xml +6 -0
  7. data/.rspec +3 -0
  8. data/.rubocop.yml +11 -0
  9. data/CODE_OF_CONDUCT.md +84 -0
  10. data/Gemfile +22 -0
  11. data/Gemfile.lock +99 -0
  12. data/LICENSE +21 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +267 -0
  15. data/Rakefile +8 -0
  16. data/assets/banner.png +0 -0
  17. data/badge.svg +1 -0
  18. data/lib/coinbase_commerce_client/api_errors.rb +150 -0
  19. data/lib/coinbase_commerce_client/api_resources/base/api_object.rb +203 -0
  20. data/lib/coinbase_commerce_client/api_resources/base/api_resource.rb +23 -0
  21. data/lib/coinbase_commerce_client/api_resources/base/create.rb +12 -0
  22. data/lib/coinbase_commerce_client/api_resources/base/delete.rb +13 -0
  23. data/lib/coinbase_commerce_client/api_resources/base/list.rb +23 -0
  24. data/lib/coinbase_commerce_client/api_resources/base/save.rb +15 -0
  25. data/lib/coinbase_commerce_client/api_resources/base/update.rb +12 -0
  26. data/lib/coinbase_commerce_client/api_resources/charge.rb +11 -0
  27. data/lib/coinbase_commerce_client/api_resources/checkout.rb +15 -0
  28. data/lib/coinbase_commerce_client/api_resources/event.rb +10 -0
  29. data/lib/coinbase_commerce_client/api_response.rb +36 -0
  30. data/lib/coinbase_commerce_client/client.rb +115 -0
  31. data/lib/coinbase_commerce_client/util.rb +57 -0
  32. data/lib/coinbase_commerce_client/version.rb +5 -0
  33. data/lib/coinbase_commerce_client/webhooks.rb +48 -0
  34. data/lib/coinbase_commerce_client.rb +45 -0
  35. data/sig/coinbase_commerce_client.rbs +4 -0
  36. 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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CoinbaseCommerceClient
4
+ VERSION = '0.1.0'
5
+ 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
@@ -0,0 +1,4 @@
1
+ module CoinbaseCommerceClient
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ 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: []