google_wallet 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +118 -7
- data/lib/google_wallet/authentication.rb +33 -0
- data/lib/google_wallet/configuration.rb +30 -0
- data/lib/google_wallet/operations/event_ticket/push_class.rb +75 -0
- data/lib/google_wallet/operations/event_ticket/push_object.rb +76 -0
- data/lib/google_wallet/operations/sign_objects.rb +58 -0
- data/lib/google_wallet/resources/base.rb +56 -0
- data/lib/google_wallet/resources/event_ticket/class.rb +85 -0
- data/lib/google_wallet/resources/event_ticket/object.rb +96 -0
- data/lib/google_wallet/version.rb +1 -1
- data/lib/google_wallet.rb +27 -1
- metadata +54 -5
- data/sig/google_wallet.rbs +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 358156bceb3c82fed5cf3ca4e2abc632dfe03c231082de9c1264d9d9b2c73f63
|
4
|
+
data.tar.gz: e76ce87afd020e4e61bd33d054b4485768c4c55f7c68e8e87a60717cafa46110
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbe474b0ee786e48a16ea9f5c45d7974cbbdd816d60b7fdb63a79e725e05d4c4d0ec3647d241905bde07e3f1c1787679c9610dadc9b36087c7a62709d92bc649
|
7
|
+
data.tar.gz: a000fba2348bac73eba76bee03caec4db80f0580607d4a65b6f8c8c3402a83ba57ddff5bde7fa581dd14253443c5384a491890def57ca71215514e3ac7d143dd
|
data/README.md
CHANGED
@@ -1,22 +1,133 @@
|
|
1
|
+
<p align="right">
|
2
|
+
<a href="https://github.com/vergilet/google_wallet"><img align="" src="https://user-images.githubusercontent.com/2478436/51829223-cb05d600-22f5-11e9-9245-bc6e82dcf028.png" width="56" height="56" /></a>
|
3
|
+
<a href="https://rubygems.org/gems/google_wallet"><img align="right" src="https://user-images.githubusercontent.com/2478436/51829691-c55cc000-22f6-11e9-99a5-42f88a8f2a55.png" width="56" height="56" /></a>
|
4
|
+
</p>
|
5
|
+
|
6
|
+
|
7
|
+
<p align="center">
|
8
|
+
<a href="https://rubygems.org/gems/repost">
|
9
|
+
<img width="460" src="https://github.com/vergilet/google_wallet/assets/2478436/5f9c5925-129a-401e-bd46-82e6ae2b2430"></a>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
|
13
|
+
|
1
14
|
# GoogleWallet
|
15
|
+
Unofficial Ruby Gem for [Google Wallet API](https://developers.google.com/wallet).
|
2
16
|
|
3
|
-
|
17
|
+
## Prerequisites
|
18
|
+
Before you use the Google Wallet API for an integration, complete first four steps from [this guide](https://developers.google.com/wallet/tickets/events/web/prerequisites).
|
4
19
|
|
5
|
-
|
20
|
+
*On 3rd step you are going to obtain **key.json**, which will be needed for the gem initialization.*
|
6
21
|
|
7
22
|
## Installation
|
8
23
|
|
9
|
-
|
24
|
+
Add this line to your application's Gemfile:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
gem 'google_wallet'
|
28
|
+
```
|
10
29
|
|
11
|
-
|
30
|
+
And then execute:
|
12
31
|
|
13
|
-
|
32
|
+
$ bundle install
|
33
|
+
|
34
|
+
Or install it yourself as:
|
14
35
|
|
15
36
|
$ gem install google_wallet
|
16
37
|
|
17
38
|
## Usage
|
18
39
|
|
19
|
-
|
40
|
+
Create initializer:
|
41
|
+
```ruby
|
42
|
+
# config/initializers/google_wallet.rb
|
43
|
+
|
44
|
+
GoogleWallet.configure do |config|
|
45
|
+
config.load_credentials_from_file('./key.json')
|
46
|
+
config.issuer_id = '33880000000XXXXXXXX'
|
47
|
+
config.debug_mode = true
|
48
|
+
config.logger = Logger.new(STDOUT)
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
### EventTicket
|
53
|
+
|
54
|
+
#### Create class (event representation):
|
55
|
+
```ruby
|
56
|
+
event_attributes = {
|
57
|
+
# required fields
|
58
|
+
class_identifier: 'Event-123456',
|
59
|
+
event_name: 'Solo Singing Contest #1 Yay!',
|
60
|
+
issuer_name: 'iChar System',
|
61
|
+
|
62
|
+
# other fields
|
63
|
+
event_id: '123456',
|
64
|
+
logo_url: 'https://images.unsplash.com/photo-1475721027785-f74eccf877e2?auto=format&fit=crop&w=360&h=360',
|
65
|
+
hero_image_url: 'https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?auto=format&fit=crop&w=1032&h=336',
|
66
|
+
homepage_url: 'https://example.com',
|
67
|
+
country_code: 'no',
|
68
|
+
venue_name: 'Opera Theater',
|
69
|
+
venue_address: "Shevchenka street 41/5, Ukraine, Kyiv",
|
70
|
+
start_date_time: '2023-09-27T22:30',
|
71
|
+
end_date_time: '2023-09-28T01:30',
|
72
|
+
hex_background_color: '#ff0077',
|
73
|
+
callback_url: 'https://example.com/gpass_callback'
|
74
|
+
}
|
75
|
+
|
76
|
+
|
77
|
+
# Create Resource of EventTicket Class
|
78
|
+
event = GoogleWallet::Resources::EventTicket::Class.new(attributes: event_attributes)
|
79
|
+
|
80
|
+
# Push Class to Google Wallet API
|
81
|
+
event.push
|
82
|
+
```
|
83
|
+
|
84
|
+
#### Create object (ticket representation):
|
85
|
+
```ruby
|
86
|
+
ticket_attributes = {
|
87
|
+
# required fields
|
88
|
+
object_identifier: 'fd9b637f-0381-42ad-9161-b4d887d79d9f',
|
89
|
+
class_identifier: 'Event-12345',
|
90
|
+
|
91
|
+
# other fields
|
92
|
+
grouping_id: 'order-12345',
|
93
|
+
ticket_type: 'VIP Adult Plus',
|
94
|
+
section: 'The Sponsor Felt-F Overpower',
|
95
|
+
seat: '65',
|
96
|
+
row: '17',
|
97
|
+
gate: 'G3, G4',
|
98
|
+
ticket_holder_name: 'Yaro Developer',
|
99
|
+
qr_code_value: '12345678',
|
100
|
+
ref_number: 'cdeqw',
|
101
|
+
valid_time_start: '2023-09-27T22:30',
|
102
|
+
valid_time_end: '2023-09-28T02:00',
|
103
|
+
micros: 82_000_000,
|
104
|
+
currency_code: 'NOK',
|
105
|
+
hex_background_color: '#0090ff'
|
106
|
+
}
|
107
|
+
|
108
|
+
# Create Resource of EventTicket Object
|
109
|
+
ticket = GoogleWallet::Resources::EventTicket::Object.new(attributes: ticket_attributes)
|
110
|
+
|
111
|
+
# Push Object to Google Wallet API
|
112
|
+
|
113
|
+
# separated push and sign
|
114
|
+
ticket.push
|
115
|
+
jwt = ticket.sign(push_resource: false)
|
116
|
+
|
117
|
+
# or combined - just use sign
|
118
|
+
jwt = ticket.sign # default, push_resource: true
|
119
|
+
|
120
|
+
"https://pay.google.com/gp/v/save/#{jwt}"
|
121
|
+
|
122
|
+
```
|
123
|
+
|
124
|
+
### Result
|
125
|
+
|
126
|
+
<p align="center">
|
127
|
+
<a href="https://rubygems.org/gems/repost">
|
128
|
+
<img src="https://github.com/vergilet/google_wallet/assets/2478436/df8f6ec9-ec45-4226-a0cf-65dc6f69f9b5"></a>
|
129
|
+
</p>
|
130
|
+
|
20
131
|
|
21
132
|
## Development
|
22
133
|
|
@@ -26,7 +137,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
26
137
|
|
27
138
|
## Contributing
|
28
139
|
|
29
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
140
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/vergilet/google_wallet.
|
30
141
|
|
31
142
|
## License
|
32
143
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# lib/google_wallet/authentication.rb
|
2
|
+
|
3
|
+
require 'googleauth'
|
4
|
+
|
5
|
+
module GoogleWallet
|
6
|
+
class Authentication
|
7
|
+
SCOPE = 'https://www.googleapis.com/auth/wallet_object.issuer'
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@credentials = GoogleWallet.configuration.json_credentials
|
11
|
+
end
|
12
|
+
|
13
|
+
def access_token
|
14
|
+
if @credentials
|
15
|
+
begin
|
16
|
+
credentials = Google::Auth::ServiceAccountCredentials.make_creds(
|
17
|
+
json_key_io: StringIO.new(@credentials.to_json),
|
18
|
+
scope: SCOPE
|
19
|
+
)
|
20
|
+
|
21
|
+
credentials.fetch_access_token!
|
22
|
+
credentials.access_token
|
23
|
+
rescue StandardError => e
|
24
|
+
puts "Error while fetching access token: #{e.message}"
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
else
|
28
|
+
puts "No credentials provided."
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# google_wallet/configuration.rb
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module GoogleWallet
|
6
|
+
class Configuration
|
7
|
+
attr_accessor :json_credentials, :issuer_id, :api_endpoint, :debug_mode, :logger
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@api_endpoint = 'https://walletobjects.googleapis.com/walletobjects/v1'
|
11
|
+
@json_credentials = nil
|
12
|
+
@issuer_id = nil
|
13
|
+
@debug_mode = false
|
14
|
+
@logger = Logger.new(STDOUT)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.logger
|
18
|
+
@logger
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_credentials_from_file(file_path)
|
22
|
+
begin
|
23
|
+
json_data = JSON.parse(File.read(file_path))
|
24
|
+
@json_credentials = json_data
|
25
|
+
rescue JSON::ParserError, Errno::ENOENT => e
|
26
|
+
raise "Error loading JSON credentials from file: #{e.message}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
module GoogleWallet
|
6
|
+
module Operations
|
7
|
+
module EventTicket
|
8
|
+
class PushClass
|
9
|
+
ENDPOINT = 'eventTicketClass'
|
10
|
+
|
11
|
+
def initialize(resource:, access_token:)
|
12
|
+
@resource = resource
|
13
|
+
@access_token = access_token
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
return update_class if exists?
|
18
|
+
create_class
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :resource, :access_token
|
24
|
+
|
25
|
+
def exists?
|
26
|
+
response = HTTParty.get(
|
27
|
+
"#{GoogleWallet.configuration.api_endpoint}/#{ENDPOINT}/#{resource.id}",
|
28
|
+
query: { access_token: access_token }
|
29
|
+
)
|
30
|
+
|
31
|
+
if GoogleWallet.debug_mode?
|
32
|
+
GoogleWallet.logger.debug(self.class.name)
|
33
|
+
GoogleWallet.logger.debug(__method__)
|
34
|
+
GoogleWallet.logger.debug(response.inspect)
|
35
|
+
end
|
36
|
+
|
37
|
+
response.success?
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_class
|
41
|
+
response = HTTParty.post(
|
42
|
+
"#{GoogleWallet.configuration.api_endpoint}/#{ENDPOINT}",
|
43
|
+
query: { access_token: access_token },
|
44
|
+
body: resource.attributes.to_json,
|
45
|
+
headers: { 'Content-Type' => 'application/json' }
|
46
|
+
)
|
47
|
+
if GoogleWallet.debug_mode?
|
48
|
+
GoogleWallet.logger.debug(self.class.name)
|
49
|
+
GoogleWallet.logger.debug(__method__)
|
50
|
+
GoogleWallet.logger.debug(response.inspect)
|
51
|
+
end
|
52
|
+
|
53
|
+
response.success?
|
54
|
+
end
|
55
|
+
|
56
|
+
def update_class
|
57
|
+
response = HTTParty.put(
|
58
|
+
"#{GoogleWallet.configuration.api_endpoint}/#{ENDPOINT}/#{resource.id}",
|
59
|
+
query: {access_token: access_token},
|
60
|
+
body: resource.attributes.to_json,
|
61
|
+
headers: { 'Content-Type' => 'application/json' }
|
62
|
+
)
|
63
|
+
|
64
|
+
if GoogleWallet.debug_mode?
|
65
|
+
GoogleWallet.logger.debug(self.class.name)
|
66
|
+
GoogleWallet.logger.debug(__method__)
|
67
|
+
GoogleWallet.logger.debug(response.inspect)
|
68
|
+
end
|
69
|
+
|
70
|
+
response.success?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
module GoogleWallet
|
6
|
+
module Operations
|
7
|
+
module EventTicket
|
8
|
+
class PushObject
|
9
|
+
ENDPOINT = 'eventTicketObject'
|
10
|
+
|
11
|
+
def initialize(resource:, access_token:)
|
12
|
+
@resource = resource
|
13
|
+
@access_token = access_token
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
return update_class if exists?
|
18
|
+
create_class
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :resource, :access_token
|
24
|
+
|
25
|
+
def exists?
|
26
|
+
response = HTTParty.get(
|
27
|
+
"#{GoogleWallet.configuration.api_endpoint}/#{ENDPOINT}/#{resource.id}",
|
28
|
+
query: { access_token: access_token }
|
29
|
+
)
|
30
|
+
|
31
|
+
if GoogleWallet.debug_mode?
|
32
|
+
GoogleWallet.logger.debug(self.class.name)
|
33
|
+
GoogleWallet.logger.debug(__method__)
|
34
|
+
GoogleWallet.logger.debug(response.inspect)
|
35
|
+
end
|
36
|
+
|
37
|
+
response.success?
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_class
|
41
|
+
response = HTTParty.post(
|
42
|
+
"#{GoogleWallet.configuration.api_endpoint}/#{ENDPOINT}",
|
43
|
+
query: { access_token: access_token },
|
44
|
+
body: resource.attributes.to_json,
|
45
|
+
headers: { 'Content-Type' => 'application/json' }
|
46
|
+
)
|
47
|
+
|
48
|
+
if GoogleWallet.debug_mode?
|
49
|
+
GoogleWallet.logger.debug(self.class.name)
|
50
|
+
GoogleWallet.logger.debug(__method__)
|
51
|
+
GoogleWallet.logger.debug(response.inspect)
|
52
|
+
end
|
53
|
+
|
54
|
+
response.success?
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_class
|
58
|
+
response = HTTParty.put(
|
59
|
+
"#{GoogleWallet.configuration.api_endpoint}/#{ENDPOINT}/#{resource.id}",
|
60
|
+
query: {access_token: access_token},
|
61
|
+
body: resource.attributes.to_json,
|
62
|
+
headers: { 'Content-Type' => 'application/json' }
|
63
|
+
)
|
64
|
+
|
65
|
+
if GoogleWallet.debug_mode?
|
66
|
+
GoogleWallet.logger.debug(self.class.name)
|
67
|
+
GoogleWallet.logger.debug(__method__)
|
68
|
+
GoogleWallet.logger.debug(response.inspect)
|
69
|
+
end
|
70
|
+
|
71
|
+
response.success?
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jwt'
|
4
|
+
|
5
|
+
module GoogleWallet
|
6
|
+
module Operations
|
7
|
+
class SignObjects
|
8
|
+
attr_reader :jwt, :resources, :resource_ids, :objects_type
|
9
|
+
DEFAULT_OBJECTS_TYPE = 'genericObjects'
|
10
|
+
|
11
|
+
def initialize(resources: [], resource_ids: [], objects_type: DEFAULT_OBJECTS_TYPE)
|
12
|
+
@resources = resources.kind_of?(Array) ? resources : [resources]
|
13
|
+
@resource_ids = resource_ids.kind_of?(Array) ? resource_ids : [resource_ids]
|
14
|
+
@objects_type = objects_type
|
15
|
+
unless resource_ids.empty?
|
16
|
+
GoogleWallet.logger.info("You didn't provide objects_type, fallback to use default #{DEFAULT_OBJECTS_TYPE}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
payload = {
|
22
|
+
iss: GoogleWallet.configuration.json_credentials["client_email"],
|
23
|
+
aud: 'google',
|
24
|
+
typ: 'savetowallet',
|
25
|
+
payload: objects_payload,
|
26
|
+
origins: []
|
27
|
+
}
|
28
|
+
|
29
|
+
@jwt = JWT.encode(payload, rsa_private_key, 'RS256')
|
30
|
+
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def objects_payload
|
37
|
+
objects.merge(object_ids) { |_key, old_val, new_val| old_val + new_val }
|
38
|
+
end
|
39
|
+
|
40
|
+
def objects
|
41
|
+
@objects ||= resources.each_with_object({}) do |resource, memo|
|
42
|
+
memo[resource.payload_key.to_sym] ||= []
|
43
|
+
memo[resource.payload_key.to_sym] << resource.attributes
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def object_ids
|
48
|
+
return {} if resource_ids.empty?
|
49
|
+
|
50
|
+
{ objects_type.to_sym => resource_ids.map { |resource_id| { id: resource_id } } }
|
51
|
+
end
|
52
|
+
|
53
|
+
def rsa_private_key
|
54
|
+
@rsa_private_key ||= OpenSSL::PKey::RSA.new(GoogleWallet.configuration.json_credentials["private_key"])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GoogleWallet
|
4
|
+
module Resources
|
5
|
+
class Base
|
6
|
+
attr_reader :options
|
7
|
+
|
8
|
+
def initialize(attributes: {}, options: {})
|
9
|
+
@options = options
|
10
|
+
|
11
|
+
attributes.each do |key, value|
|
12
|
+
instance_variable_set("@#{key}", value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def attributes
|
17
|
+
hash = deep_merge(template, options)
|
18
|
+
remove_empty_values(hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
def payload_key
|
22
|
+
raise 'Define in resource'
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def payload_key_logic
|
28
|
+
self.class.name.split("::")[-2].tap { |obj| obj[0] = obj[0].downcase }
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_fields(fields = [])
|
32
|
+
fields.each do |field|
|
33
|
+
raise "#{self.class.name} - #{field} is required" if blank?(instance_variable_get("@#{field}"))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def deep_merge(hash1, hash2)
|
38
|
+
hash1.merge(hash2) do |_key, old_val, new_val|
|
39
|
+
old_val.is_a?(Hash) && new_val.is_a?(Hash) ? deep_merge(old_val, new_val) : new_val
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def remove_empty_values(hash)
|
44
|
+
hash.reject { |_key, value| value.nil? || value == '' || value == {} }
|
45
|
+
end
|
46
|
+
|
47
|
+
def blank?(value)
|
48
|
+
value.nil? || value.to_s.strip.empty?
|
49
|
+
end
|
50
|
+
|
51
|
+
def present?(value)
|
52
|
+
!blank?(value)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GoogleWallet
|
4
|
+
module Resources
|
5
|
+
module EventTicket
|
6
|
+
class Class < Base
|
7
|
+
attr_reader :class_identifier, :issuer_name, :logo_url, :event_id, :event_name,
|
8
|
+
:venue_name, :venue_address, :start_date_time, :end_date_time, :country_code,
|
9
|
+
:hex_background_color, :hero_image_url, :homepage_url, :callback_url, :id
|
10
|
+
|
11
|
+
|
12
|
+
# attributes = {
|
13
|
+
# class_identifier: 'Event-1234',
|
14
|
+
# issuer_name: 'iChar System',
|
15
|
+
# event_name: 'Solo Singing Contest #1 Yay!',
|
16
|
+
# event_id: '123456',
|
17
|
+
# logo_url: 'https://images.unsplash.com/photo-1475721027785-f74eccf877e2?auto=format&fit=crop&w=360&h=360',
|
18
|
+
# hero_image_url: 'https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?auto=format&fit=crop&w=1032&h=336'
|
19
|
+
# homepage_url: 'https://arrangement.ticketco.events',
|
20
|
+
# country_code: 'no',
|
21
|
+
# venue_name: 'Opera Theater',
|
22
|
+
# venue_address: "Shevchenka street 41/5, Ukraine, Lviv",
|
23
|
+
# start_date_time: '2023-08-27T22:30',
|
24
|
+
# end_date_time: '2023-08-28T01:30',
|
25
|
+
# hex_background_color: '#ff0077',
|
26
|
+
# callback_url: 'https://example.com/gpass_callback'
|
27
|
+
# }
|
28
|
+
|
29
|
+
|
30
|
+
def initialize(attributes: {}, options: {})
|
31
|
+
super
|
32
|
+
validate_fields( %w[class_identifier event_name issuer_name])
|
33
|
+
@id = "#{GoogleWallet.configuration.issuer_id}.#{@class_identifier}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def push
|
37
|
+
access_token = GoogleWallet::Authentication.new.access_token
|
38
|
+
GoogleWallet::Operations::EventTicket::PushClass.new(resource: self, access_token: access_token).call
|
39
|
+
end
|
40
|
+
|
41
|
+
def sign(push_resource: true)
|
42
|
+
raise "Class cannot be signed without Object,
|
43
|
+
use GoogleWallet::Operations::SignObjects.new(...)
|
44
|
+
to create/modify simultaneously classes and objects by following jwt link"
|
45
|
+
end
|
46
|
+
|
47
|
+
def payload_key
|
48
|
+
"#{payload_key_logic}Classes"
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def template
|
54
|
+
template = {}
|
55
|
+
|
56
|
+
template[:id] = id
|
57
|
+
template[:issuerName] = issuer_name
|
58
|
+
template[:eventName] = { defaultValue: { language: "en-US", value: event_name } }
|
59
|
+
template[:reviewStatus] = "UNDER_REVIEW"
|
60
|
+
|
61
|
+
template[:eventId] = event_id if present?(event_id)
|
62
|
+
template[:logo] = { sourceUri: { uri: logo_url } } if present?(logo_url)
|
63
|
+
template[:heroImage] = { sourceUri: { uri: hero_image_url } } if present?(hero_image_url)
|
64
|
+
|
65
|
+
template[:homepageUri] = { uri: homepage_url, description: 'Homepage' } if present?(homepage_url)
|
66
|
+
template[:countryCode] = country_code if present?(country_code)
|
67
|
+
template[:hexBackgroundColor] = hex_background_color if present?(hex_background_color)
|
68
|
+
template[:callbackOptions] = { url: callback_url } if present?(callback_url)
|
69
|
+
|
70
|
+
template[:securityAnimation] = { animationType: "FOIL_SHIMMER" }
|
71
|
+
|
72
|
+
template[:venue] = {}
|
73
|
+
template[:venue][:name] = { defaultValue: { language: "en-US", value: venue_name } } if present?(venue_name)
|
74
|
+
template[:venue][:address] = { defaultValue: { language: "en-US", value: venue_address } } if present?(venue_address)
|
75
|
+
|
76
|
+
template[:dateTime] = {}
|
77
|
+
template[:dateTime][:start] = start_date_time if present?(start_date_time)
|
78
|
+
template[:dateTime][:end] = end_date_time if present?(end_date_time)
|
79
|
+
|
80
|
+
template
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GoogleWallet
|
4
|
+
module Resources
|
5
|
+
module EventTicket
|
6
|
+
class Object < Base
|
7
|
+
|
8
|
+
attr_reader :object_identifier, :class_identifier, :seat, :row, :section, :gate,
|
9
|
+
:ticket_type, :grouping_id, :qr_code_value, :ticket_holder_name,
|
10
|
+
:valid_time_start, :valid_time_end, :micros, :currency_code,
|
11
|
+
:hex_background_color, :ticket_number, :id, :class_id, :options
|
12
|
+
|
13
|
+
|
14
|
+
# attributes = {
|
15
|
+
# object_identifier: 'fd9b637f-0381-42ad-9161-b4d887d79d9f',
|
16
|
+
# class_identifier: 'Event-1234',
|
17
|
+
# grouping_id: 'order-12345',
|
18
|
+
# ticket_type: 'Vip Pass + Priority24',
|
19
|
+
# section: 'The Sponsor Felt-F Overpower',
|
20
|
+
# seat: '65',
|
21
|
+
# row: '17',
|
22
|
+
# gate: 'G3, G4',
|
23
|
+
# ticket_holder_name: 'Yaro Developer',
|
24
|
+
# qr_code_value: '12345678',
|
25
|
+
# ref_number: 'cdeqw',
|
26
|
+
# valid_time_start: '2023-09-27T22:30',
|
27
|
+
# valid_time_end: '2023-09-28T02:00',
|
28
|
+
# micros: 82_000_000,
|
29
|
+
# currency_code: 'NOK',
|
30
|
+
# hex_background_color: '#45ffaa'
|
31
|
+
# }
|
32
|
+
|
33
|
+
def initialize(attributes: {}, options: {})
|
34
|
+
super
|
35
|
+
|
36
|
+
validate_fields( %w[object_identifier class_identifier])
|
37
|
+
@id = "#{GoogleWallet.configuration.issuer_id}.#{@object_identifier}"
|
38
|
+
@class_id = "#{GoogleWallet.configuration.issuer_id}.#{@class_identifier}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def push
|
42
|
+
access_token = GoogleWallet::Authentication.new.access_token
|
43
|
+
GoogleWallet::Operations::EventTicket::PushObject.new(resource: self, access_token: access_token).call
|
44
|
+
end
|
45
|
+
|
46
|
+
def sign(push_resource: true)
|
47
|
+
sign_operation =
|
48
|
+
if push_resource
|
49
|
+
push
|
50
|
+
GoogleWallet::Operations::SignObjects.new(resource_ids: [id], objects_type: self.payload_key)
|
51
|
+
else
|
52
|
+
GoogleWallet::Operations::SignObjects.new(resources: [itself])
|
53
|
+
end
|
54
|
+
|
55
|
+
sign_operation.call
|
56
|
+
sign_operation.jwt
|
57
|
+
end
|
58
|
+
|
59
|
+
def payload_key
|
60
|
+
"#{payload_key_logic}Objects"
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def template
|
66
|
+
template = {}
|
67
|
+
|
68
|
+
template[:id] = id
|
69
|
+
template[:classId] = class_id
|
70
|
+
template[:state] = "ACTIVE"
|
71
|
+
|
72
|
+
template[:ticketType] = { defaultValue: { language: "en-us", value: ticket_type } } if present?(ticket_type)
|
73
|
+
template[:groupingInfo] = { groupingId: grouping_id } if present?(grouping_id)
|
74
|
+
template[:barcode] = { type: "QR_CODE", value: qr_code_value, alternateText: qr_code_value } if present?(qr_code_value)
|
75
|
+
template[:faceValue] = { micros: micros, currencyCode: currency_code } if present?(micros) && present?(currency_code)
|
76
|
+
|
77
|
+
template[:seatInfo] = {}
|
78
|
+
template[:seatInfo][:seat] = { defaultValue: { language: "en-us", value: seat } } if present?(seat)
|
79
|
+
template[:seatInfo][:row] = { defaultValue: { language: "en-us", value: row } } if present?(row)
|
80
|
+
template[:seatInfo][:section] = { defaultValue: { language: "en-us", value: section } } if present?(section)
|
81
|
+
template[:seatInfo][:gate] = { defaultValue: { language: "en-us", value: gate } } if present?(gate)
|
82
|
+
|
83
|
+
template[:validTimeInterval] = {}
|
84
|
+
template[:validTimeInterval][:start] = { date: valid_time_start } if present?(valid_time_start)
|
85
|
+
template[:validTimeInterval][:end] = { date: valid_time_end } if present?(valid_time_end)
|
86
|
+
|
87
|
+
template[:hexBackgroundColor] = hex_background_color if present?(hex_background_color)
|
88
|
+
template[:ticketHolderName] = ticket_holder_name if present?(ticket_holder_name)
|
89
|
+
template[:ticketNumber] = ticket_number if present?(ticket_number)
|
90
|
+
|
91
|
+
template
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/lib/google_wallet.rb
CHANGED
@@ -1,8 +1,34 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "google_wallet/version"
|
4
|
+
require_relative "google_wallet/configuration"
|
5
|
+
require_relative "google_wallet/authentication"
|
6
|
+
|
7
|
+
require_relative "google_wallet/resources/base"
|
8
|
+
require_relative "google_wallet/resources/event_ticket/class"
|
9
|
+
require_relative "google_wallet/resources/event_ticket/object"
|
10
|
+
|
11
|
+
require_relative "google_wallet/operations/sign_objects"
|
12
|
+
require_relative "google_wallet/operations/event_ticket/push_class"
|
13
|
+
require_relative "google_wallet/operations/event_ticket/push_object"
|
4
14
|
|
5
15
|
module GoogleWallet
|
6
16
|
class Error < StandardError; end
|
7
|
-
|
17
|
+
|
18
|
+
class << self
|
19
|
+
attr_accessor :configuration
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.configure
|
23
|
+
self.configuration ||= Configuration.new
|
24
|
+
yield(configuration)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.logger
|
28
|
+
configuration.logger
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.debug_mode?
|
32
|
+
configuration.debug_mode
|
33
|
+
end
|
8
34
|
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_wallet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yaro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
12
|
-
dependencies:
|
11
|
+
date: 2023-09-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jwt
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: googleauth
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
13
55
|
description: google wallet
|
14
56
|
email:
|
15
57
|
- osyaroslav@gmail.com
|
@@ -22,8 +64,15 @@ files:
|
|
22
64
|
- README.md
|
23
65
|
- Rakefile
|
24
66
|
- lib/google_wallet.rb
|
67
|
+
- lib/google_wallet/authentication.rb
|
68
|
+
- lib/google_wallet/configuration.rb
|
69
|
+
- lib/google_wallet/operations/event_ticket/push_class.rb
|
70
|
+
- lib/google_wallet/operations/event_ticket/push_object.rb
|
71
|
+
- lib/google_wallet/operations/sign_objects.rb
|
72
|
+
- lib/google_wallet/resources/base.rb
|
73
|
+
- lib/google_wallet/resources/event_ticket/class.rb
|
74
|
+
- lib/google_wallet/resources/event_ticket/object.rb
|
25
75
|
- lib/google_wallet/version.rb
|
26
|
-
- sig/google_wallet.rbs
|
27
76
|
homepage: https://github.com/vergilet/google_wallet
|
28
77
|
licenses:
|
29
78
|
- MIT
|
@@ -46,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
46
95
|
- !ruby/object:Gem::Version
|
47
96
|
version: '0'
|
48
97
|
requirements: []
|
49
|
-
rubygems_version: 3.4.
|
98
|
+
rubygems_version: 3.4.19
|
50
99
|
signing_key:
|
51
100
|
specification_version: 4
|
52
101
|
summary: google wallet
|
data/sig/google_wallet.rbs
DELETED