discountnetwork 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.hound.yml +3 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +629 -0
  6. data/.sample.pryrc +4 -0
  7. data/.travis.yml +5 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +405 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +7 -0
  13. data/bin/rake +17 -0
  14. data/bin/rspec +17 -0
  15. data/bin/setup +6 -0
  16. data/discountnetwork.gemspec +28 -0
  17. data/lib/discountnetwork/account.rb +28 -0
  18. data/lib/discountnetwork/activation.rb +15 -0
  19. data/lib/discountnetwork/base.rb +20 -0
  20. data/lib/discountnetwork/booking.rb +23 -0
  21. data/lib/discountnetwork/client.rb +54 -0
  22. data/lib/discountnetwork/configuration.rb +17 -0
  23. data/lib/discountnetwork/destination.rb +9 -0
  24. data/lib/discountnetwork/password.rb +21 -0
  25. data/lib/discountnetwork/provider.rb +15 -0
  26. data/lib/discountnetwork/response.rb +19 -0
  27. data/lib/discountnetwork/result.rb +15 -0
  28. data/lib/discountnetwork/rspec.rb +5 -0
  29. data/lib/discountnetwork/search.rb +15 -0
  30. data/lib/discountnetwork/session.rb +9 -0
  31. data/lib/discountnetwork/supplementary.rb +15 -0
  32. data/lib/discountnetwork/testing/discountnetwork_api.rb +240 -0
  33. data/lib/discountnetwork/version.rb +3 -0
  34. data/lib/discountnetwork.rb +16 -0
  35. data/spec/discountnetwork/account_spec.rb +36 -0
  36. data/spec/discountnetwork/activation_spec.rb +46 -0
  37. data/spec/discountnetwork/booking_spec.rb +70 -0
  38. data/spec/discountnetwork/client_spec.rb +40 -0
  39. data/spec/discountnetwork/configuration_spec.rb +30 -0
  40. data/spec/discountnetwork/destination_spec.rb +16 -0
  41. data/spec/discountnetwork/password_spec.rb +41 -0
  42. data/spec/discountnetwork/provider_spec.rb +26 -0
  43. data/spec/discountnetwork/response_spec.rb +16 -0
  44. data/spec/discountnetwork/result_spec.rb +30 -0
  45. data/spec/discountnetwork/search_spec.rb +37 -0
  46. data/spec/discountnetwork/session_spec.rb +18 -0
  47. data/spec/discountnetwork/supplementary_spec.rb +40 -0
  48. data/spec/fixtures/booking.json +86 -0
  49. data/spec/fixtures/destinations.json +22 -0
  50. data/spec/fixtures/empty.json +0 -0
  51. data/spec/fixtures/ping.json +3 -0
  52. data/spec/fixtures/provider.json +16 -0
  53. data/spec/fixtures/providers.json +32 -0
  54. data/spec/fixtures/result.json +89 -0
  55. data/spec/fixtures/results.json +121 -0
  56. data/spec/fixtures/search.json +19 -0
  57. data/spec/fixtures/search_created.json +19 -0
  58. data/spec/fixtures/session_created.json +31 -0
  59. data/spec/fixtures/supplementaries.json +33 -0
  60. data/spec/fixtures/supplementary.json +21 -0
  61. data/spec/fixtures/user.json +31 -0
  62. data/spec/spec_helper.rb +12 -0
  63. metadata +189 -0
data/README.md ADDED
@@ -0,0 +1,405 @@
1
+ # Discount Network
2
+
3
+ [![Build
4
+ Status](https://travis-ci.org/discountnetwork/discountnetwork-ruby.svg?branch=master)](https://travis-ci.org/discountnetwork/discountnetwork-ruby)
5
+ [![Code
6
+ Climate](https://codeclimate.com/github/discountnetwork/discountnetwork-ruby/badges/gpa.svg)](https://codeclimate.com/github/discountnetwork/discountnetwork-ruby)
7
+
8
+ Ruby API client for Discount Network API
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem "discountnetwork", github: "discountnetwork/discountnetwork-ruby"
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ ```sh
21
+ $ bundle
22
+ ```
23
+
24
+ ## Configure
25
+
26
+ Once you have your API keys from Discount Network, then you can add an initializer
27
+ to set up your API keys
28
+
29
+ ```ruby
30
+ DiscountNetwork.configure do |config|
31
+ config.api_key = "YOUR_API_KEY"
32
+
33
+ # Default configurations
34
+ # config.api_host = "https://api.discountnetwork.io/v1"
35
+ end
36
+ ```
37
+
38
+ ## Usages
39
+
40
+ ### Session
41
+
42
+ Session API allow you to authenticate a subscriber, create a new session or
43
+ destroying an existing session.
44
+
45
+ #### Create a new session
46
+
47
+ Creating a new session will verify the subscriber and return the `subscriber`
48
+ object with subscription details.
49
+
50
+ ```ruby
51
+ DiscountNetwork::Session.create(
52
+ name: "username", password: "secret_password"
53
+ )
54
+ ```
55
+
56
+ ### Account
57
+
58
+ #### Find user account
59
+
60
+ To retrieve the user account details using the Discount Network `account` API
61
+
62
+ ```ruby
63
+ #
64
+ # The `auth_token` is optional, if you don't pass any
65
+ # parameter then it will try to retrieve the subscriber
66
+ # using the `auth_token` configuration.
67
+ #
68
+
69
+ DiscountNetwork::Account.find(auth_token)
70
+ ```
71
+
72
+ #### Update user account
73
+
74
+ Once the user is logged in and `auth_token` has been configured properly then
75
+ we can update the user details using the DiscountNetwork `account` API
76
+
77
+ ```ruby
78
+ DiscountNetwork::Account.update(subscriber_attributes)
79
+ ```
80
+
81
+ ### Activation
82
+
83
+ #### Find a subscriber
84
+
85
+ The `activation` offers an easier way to find the subscriber details based on
86
+ the `activation_token`. To find a `subscriber` use
87
+
88
+ ```ruby
89
+ DiscountNetwork::Activation.find(activation_token)
90
+ ```
91
+
92
+ #### Activate a subscriber
93
+
94
+ Once subscriber has provided their required information then we can activate
95
+ their account using the `Activation` API. The API already has validations in
96
+ place but it would be easier to implement some validation before sending any
97
+ activation API request.
98
+
99
+ ```ruby
100
+ DiscountNetwork::Activation.activate(
101
+ activation_token, subscriber_attributes
102
+ )
103
+ ```
104
+
105
+ ### Password
106
+
107
+ #### Forgot password
108
+
109
+ If the subscriber forgot their password then developer can allow them to reset
110
+ their password using the Discount network API.
111
+
112
+ ```ruby
113
+ DiscountNetwork::Password.forgot(email_address)
114
+ ```
115
+
116
+ #### Validate reset token
117
+
118
+ Before allowing subscriber to reset their password, developer can validate if
119
+ the reset token is valid or not as expired or invalid reset token won't allow
120
+ subscriber to reset their password.
121
+
122
+ ```ruby
123
+ DiscountNetwork::Password.validate(reset_token)
124
+ ```
125
+
126
+ #### Set new password
127
+
128
+ Once subscriber has submitted a valid reset request and followed the instruction
129
+ then we can allow them to set their password as follow
130
+
131
+ ```ruby
132
+ DiscountNetwork::Password.create(reset_token, password_attributes)
133
+ ```
134
+
135
+ ### Supplementary
136
+
137
+ Each Discount Network subscription comes with varies number of supplementary
138
+ subscribers, that means primary member can add one or more of this friends or
139
+ family member to his subscription. The supplementary API provides an easier
140
+ way to manage the supplementary subscribers. Please note, This interface expects
141
+ that the subscriber has already been authenticated before making any API call.
142
+
143
+ #### List supplementaries
144
+
145
+ To list all the supplementary subscribers for the authenticated subscriber
146
+ developer can use the `list` interface for supplementary.
147
+
148
+ ```ruby
149
+ DiscountNetwork::Supplementary.list
150
+ ```
151
+
152
+ #### Add supplementary
153
+
154
+ To add a new supplementary subscriber with authenticated subscriber's
155
+ subscription developer can use the `create` interface for supplementary.
156
+
157
+ ```ruby
158
+ DiscountNetwork::Supplementary.create(
159
+ subscriber_attributes
160
+ )
161
+
162
+ # subscriber attributes
163
+ subscriber_attributes = {
164
+ first_name: "John",
165
+ last_name: "Green",
166
+ phone: "+1 123 345 5678",
167
+ email: "john.green@example.com"
168
+ }
169
+ ```
170
+
171
+ ### Destination
172
+
173
+ #### List destinations
174
+
175
+ Retrieve the list of destinations based on a search term. This is useful when
176
+ you are planning to show the list of destinations while user start to type
177
+ destination name
178
+
179
+ ```ruby
180
+ DiscountNetwork::Destination.list(term: "bangkok")
181
+ ```
182
+
183
+ ### Search
184
+
185
+ #### Create new search
186
+
187
+ You can create a new search using the API. Please note: It's advisable to wait
188
+ 10-15 seconds before trying to retrieve the search results.
189
+
190
+ ```ruby
191
+ DiscountNetwork::Search.create(
192
+ adults: 2,
193
+ children: 0,
194
+ room_numbers: 1
195
+ location_id: 835,
196
+ check_in: "25/10/2016",
197
+ check_out: "28/10/2016",
198
+ location_name: "Bangkok, Thailand",
199
+ )
200
+ ```
201
+
202
+ #### Retrieve search details
203
+
204
+ Once, you have created a new search and you have the search id then you can
205
+ retrieve the search details as
206
+
207
+ ```ruby
208
+ DiscountNetwork::Search.find(search_id)
209
+ ```
210
+
211
+ ### Result
212
+
213
+ #### Retrieve search results
214
+
215
+ Retrieve the hotel search results from the Discount Network API.
216
+
217
+ ```ruby
218
+ DiscountNetwork::Result.where(
219
+ search_id: search_id
220
+ )
221
+ ```
222
+
223
+ #### Retrieve a hotel details
224
+
225
+ Retrieve the hotel details for a specific search
226
+
227
+ ```ruby
228
+ DiscountNetwork::Result.find_by(
229
+ search_id: search_id, hotel_id: hotel_id
230
+ )
231
+ ```
232
+
233
+ ### Booking
234
+
235
+ #### Creating a new booking
236
+
237
+ Submit a new booking request for a specific hotel using the API.
238
+
239
+ ```ruby
240
+ # Creating a new booking request for a specific hotel, Pay close
241
+ # attention to the construction of the booking object
242
+ #
243
+ # If you want to add multiple travellers in one booking then
244
+ # pass an Array for travellers as
245
+ # `travellers: [traveller_one_attributes, traveller_two_attributes]`
246
+ #
247
+ # If you need to add multiple properties in one request, like one
248
+ # hotel and a condo in one booking request, then pass an Array as
249
+ #`properties: [property_one_attributes, property_two_attributes]`
250
+
251
+ DiscountNetwork::Booking.create(
252
+ hotel_id: "hotel_id",
253
+ search_id: "search_id",
254
+ travellers: traveller_attributes,
255
+ properties: property_attributes
256
+ )
257
+
258
+ # Traveller attributes
259
+
260
+ traveller_attributes = {
261
+ first_name: "John",
262
+ last_name: "Doe",
263
+ phone: "012 345 6789",
264
+ email: "john.doe@example.com",
265
+ address: "123 Main Street",
266
+ city: "New York",
267
+ state: "New York",
268
+ zip: "NY10310"
269
+ }
270
+
271
+ # Property attributes
272
+
273
+ property_attributes = {
274
+ property_id: "property_101",
275
+ provider_name: "Booking.com",
276
+ name: "Nasa Vagas, Thailand",
277
+ price: "100.99",
278
+ description: "Description",
279
+ review_score: "90",
280
+ total_reviews: "10000",
281
+ currency_code: "USD"
282
+ }
283
+ ```
284
+
285
+ ### Find a booking
286
+
287
+ To find the details for a specific booking request, including the confirmation
288
+ number, use
289
+
290
+ ```ruby
291
+ DiscountNetwork::Booking.find(booking_id)
292
+ ```
293
+
294
+ ### Providers
295
+
296
+ Discount Network partnered with multiple vendors to provide the best possible
297
+ price in all sort of travel. This will allow developer to add those public
298
+ provider in their site and let their subscriber search and contact the support
299
+ to receive their subscriber discount.
300
+
301
+ #### Retrieving providers
302
+
303
+ This will allow developer to retrieve all of the specified public travel partner
304
+ so they can show them to their site. Note: They `type` is mandatory and
305
+ the supported value for `type` are `hotel`, `cruise`, `resort`, `tour`, `package`
306
+ and `car`.
307
+
308
+ ```ruby
309
+ DiscountNetwork::Provider.where(type: "hotel")
310
+ ```
311
+
312
+ ### Find a provider
313
+
314
+ On the provider listing API, one of the most important `attribute` the API
315
+ returns is `slug`, we can use that `slug` to retrieve the details about any
316
+ specific provider.
317
+
318
+ ```ruby
319
+ DiscountNetwork::Provider.find_by_slug(slug)
320
+ ```
321
+
322
+ ## Development
323
+
324
+ We are following Sandi Metz's Rules for this gem, you can read the
325
+ [description of the rules here]
326
+ (http://robots.thoughtbot.com/post/50655960596/sandi-metz-rules-for-developers). All new code should follow these rules. If you make changes in a pre-existing
327
+ file that violates these rules you should fix the violations as part of
328
+ your contribution.
329
+
330
+ ### Setup
331
+
332
+ * Clone the repository.
333
+
334
+ ```sh
335
+ git clone https://github.com/discountnetwork/discountnetwork-ruby.git
336
+ ```
337
+
338
+ * Setup your environment.
339
+
340
+ ```sh
341
+ bin/setup
342
+ ```
343
+
344
+ * Run the test suite
345
+
346
+ ```sh
347
+ bin/rake
348
+ ```
349
+
350
+ ### PlayBox
351
+
352
+ * Setup API keys.
353
+
354
+ ```sh
355
+ cp .sample.pryrc .pryrc
356
+ vim .pryrc
357
+ ```
358
+
359
+ * Start your console.
360
+
361
+ ```sh
362
+ bin/console
363
+ ```
364
+
365
+ * Start playing with it.
366
+
367
+ ```sh
368
+ DiscountNetwork::Session.create(name: "username", password: "password")
369
+ ```
370
+
371
+ ## Testing
372
+
373
+ ### RSpec
374
+
375
+ This gem provides an easier way to test Discount Network API Responses. Simply
376
+ include the following line in your `spec_helper` and you should have access to
377
+ all of the test helpers.
378
+
379
+ ```ruby
380
+ require "discountnetwork/rspec"
381
+ ```
382
+
383
+ ## Contributing
384
+
385
+ First, thank you for contributing! We love pull requests from everyone. By
386
+ participating in this project, you hereby grant the right to grant or transfer
387
+ an unlimited number of non exclusive licenses or sub-licenses to third parties,
388
+ under the copyright covering the contribution to use the contribution by all
389
+ means.
390
+
391
+ Here are a few technical guidelines to follow:
392
+
393
+ 1. Open an [issue][issues] to discuss a new feature.
394
+ 1. Write tests to support your new feature.
395
+ 1. Make sure the entire test suite passes locally and on CI.
396
+ 1. Open a Pull Request.
397
+ 1. [Squash your commits][squash] after receiving feedback.
398
+ 1. Party!
399
+
400
+ [issues]: https://github.com/discountnetwork/discountnetwork-ruby/issues
401
+ [squash]: https://github.com/thoughtbot/guides/tree/master/protocol/git#write-a-feature
402
+
403
+ ## License
404
+
405
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "discountnetwork"
5
+
6
+ require "pry"
7
+ Pry.start
data/bin/rake ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rake", "rake")
data/bin/rspec ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rspec' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rspec-core", "rspec")
data/bin/setup ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "discountnetwork/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "discountnetwork"
8
+ spec.version = Discountnetwork::VERSION
9
+ spec.authors = ["Abu Nashir"]
10
+ spec.email = ["abunashir@gmail.com"]
11
+
12
+ spec.summary = "The Ruby interface to the Discount Network API"
13
+ spec.description = "The Ruby interface to the Discount Network API"
14
+ spec.homepage = "https://github.com/discountnetwork/discountnetwork-ruby"
15
+ spec.license = "MIT"
16
+
17
+ spec.require_paths = ["lib"]
18
+ spec.files = `git ls-files`.split("\n")
19
+ spec.test_files = `git ls-files -- {spec}/*`.split("\n")
20
+
21
+ spec.add_dependency "rest-client", "~> 1.8"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.12"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.0"
26
+ spec.add_development_dependency "webmock", "~> 2.0"
27
+ spec.add_development_dependency "pry", "~> 0.10.3"
28
+ end
@@ -0,0 +1,28 @@
1
+ module DiscountNetwork
2
+ class Account < Base
3
+ def find(auth_token = nil)
4
+ set_account_auth_token(auth_token)
5
+ if auth_token_exists?
6
+ DiscountNetwork.get_resource("account").user
7
+ end
8
+ end
9
+
10
+ def update(attributes)
11
+ if auth_token_exists?
12
+ DiscountNetwork.put_resource("account", subscriber: attributes)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def auth_token_exists?
19
+ !DiscountNetwork.configuration.auth_token.nil?
20
+ end
21
+
22
+ def set_account_auth_token(auth_token)
23
+ if !auth_token.nil?
24
+ DiscountNetwork.configuration.auth_token = auth_token
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module DiscountNetwork
2
+ class Activation < Base
3
+ def find(token)
4
+ DiscountNetwork.get_resource(
5
+ ["account", "activation", token].join("/"),
6
+ ).user
7
+ end
8
+
9
+ def activate(token, attributes)
10
+ DiscountNetwork.put_resource(
11
+ ["account", "activation", token].join("/"), user: attributes
12
+ ).user
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ module DiscountNetwork
2
+ class Base
3
+ def self.method_missing(method_name, *arguments, &block)
4
+ if new.respond_to?(method_name, include_private: false)
5
+ new.send(method_name, *arguments, &block)
6
+ else
7
+ super
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def build_array_params(array_params)
14
+ array_params = [array_params].flatten
15
+ array_params.map.each_with_index do |attribute, index|
16
+ [index, attribute]
17
+ end.to_h
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ module DiscountNetwork
2
+ class Booking < Base
3
+ def find(booking_id)
4
+ DiscountNetwork.get_resource(
5
+ ["bookings", booking_id].join("/")
6
+ ).travel_request
7
+ end
8
+
9
+ def create(search_id:, hotel_id:, travellers:, properties:, **attrs)
10
+ attributes = attrs.merge(
11
+ search_id: search_id,
12
+ travellers_attributes: build_array_params(travellers),
13
+ properties_attributes: build_array_params(
14
+ properties.merge(property_id: hotel_id)
15
+ )
16
+ )
17
+
18
+ DiscountNetwork.post_resource(
19
+ "bookings", booking: attributes
20
+ ).travel_request
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,54 @@
1
+ require "rest-client"
2
+ require "discountnetwork/response"
3
+ require "discountnetwork/configuration"
4
+
5
+ module DiscountNetwork
6
+ class Client
7
+ attr_reader :http_method, :end_point, :attributes
8
+
9
+ def initialize(http_method, end_point, attributes = {})
10
+ @http_method = http_method
11
+ @end_point = end_point
12
+ @attributes = attributes
13
+ end
14
+
15
+ def execute
16
+ Response.new(execute_api_request).parse
17
+ end
18
+
19
+ private
20
+
21
+ def execute_api_request
22
+ RestClient::Request.execute(
23
+ method: http_method,
24
+ url: api_end_point,
25
+ payload: attributes,
26
+ headers: custom_headers
27
+ )
28
+ end
29
+
30
+ def api_end_point
31
+ [DiscountNetwork.configuration.api_host, end_point].join("/")
32
+ end
33
+
34
+ def custom_headers
35
+ {
36
+ "DN-API-KEY" => DiscountNetwork.configuration.api_key,
37
+ "Authorization" =>
38
+ "Token token=\"#{DiscountNetwork.configuration.auth_token}\""
39
+ }
40
+ end
41
+ end
42
+
43
+ def self.get_resource(end_point, attributes = {})
44
+ Client.new(:get, end_point, attributes).execute
45
+ end
46
+
47
+ def self.post_resource(end_point, attributes)
48
+ Client.new(:post, end_point, attributes).execute
49
+ end
50
+
51
+ def self.put_resource(end_point, attributes)
52
+ Client.new(:put, end_point, attributes).execute
53
+ end
54
+ end
@@ -0,0 +1,17 @@
1
+ module DiscountNetwork
2
+ class Configuration
3
+ attr_accessor :api_host, :api_key, :auth_token
4
+
5
+ def initialize
6
+ @api_host ||= "https://api.discountnetwork.io/api/v1"
7
+ end
8
+ end
9
+
10
+ def self.configure
11
+ yield configuration
12
+ end
13
+
14
+ def self.configuration
15
+ @configuration ||= Configuration.new
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module DiscountNetwork
2
+ class Destination
3
+ def self.list(term:)
4
+ DiscountNetwork.get_resource(
5
+ "destinations", term: term
6
+ )
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module DiscountNetwork
2
+ class Password < Base
3
+ def forgot(email)
4
+ DiscountNetwork.post_resource(
5
+ "account/resets", account: { email: email }
6
+ )
7
+ end
8
+
9
+ def validate(token)
10
+ DiscountNetwork.get_resource(
11
+ ["account", "resets", token].join("/"),
12
+ )
13
+ end
14
+
15
+ def create(token, attributes)
16
+ DiscountNetwork.put_resource(
17
+ ["account", "passwords", token].join("/"), account: attributes
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module DiscountNetwork
2
+ class Provider < Base
3
+ def where(type:)
4
+ DiscountNetwork.get_resource(
5
+ "providers", type: type
6
+ ).providers
7
+ end
8
+
9
+ def find_by_slug(slug)
10
+ DiscountNetwork.get_resource(
11
+ ["providers", slug].join("/"),
12
+ ).provider
13
+ end
14
+ end
15
+ end