duffel_api 0.0.1.pre.dev → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +82 -0
  3. data/.github/dependabot.yml +6 -0
  4. data/.gitignore +9 -0
  5. data/.rubocop.yml +9 -9
  6. data/CHANGELOG.md +1 -3
  7. data/CODE_OF_CONDUCT.md +1 -1
  8. data/Gemfile +10 -2
  9. data/LICENSE.txt +1 -1
  10. data/README.md +190 -33
  11. data/Rakefile +1 -3
  12. data/bin/console +7 -0
  13. data/bin/setup +2 -0
  14. data/duffel_api.gemspec +40 -0
  15. data/examples/book_and_change.rb +106 -0
  16. data/examples/book_with_seat.rb +91 -0
  17. data/examples/exploring_data.rb +43 -0
  18. data/examples/hold_and_pay_later.rb +82 -0
  19. data/examples/search_and_book.rb +91 -0
  20. data/lib/duffel_api/api_response.rb +17 -0
  21. data/lib/duffel_api/api_service.rb +37 -0
  22. data/lib/duffel_api/client.rb +87 -0
  23. data/lib/duffel_api/errors/airline_error.rb +8 -0
  24. data/lib/duffel_api/errors/api_error.rb +8 -0
  25. data/lib/duffel_api/errors/authentication_error.rb +8 -0
  26. data/lib/duffel_api/errors/error.rb +54 -0
  27. data/lib/duffel_api/errors/invalid_request_error.rb +8 -0
  28. data/lib/duffel_api/errors/invalid_state_error.rb +8 -0
  29. data/lib/duffel_api/errors/rate_limit_error.rb +8 -0
  30. data/lib/duffel_api/errors/validation_error.rb +8 -0
  31. data/lib/duffel_api/list_response.rb +27 -0
  32. data/lib/duffel_api/middlewares/raise_duffel_errors.rb +67 -0
  33. data/lib/duffel_api/paginator.rb +27 -0
  34. data/lib/duffel_api/request.rb +64 -0
  35. data/lib/duffel_api/resources/aircraft.rb +26 -0
  36. data/lib/duffel_api/resources/airline.rb +26 -0
  37. data/lib/duffel_api/resources/airport.rb +40 -0
  38. data/lib/duffel_api/resources/base_resource.rb +16 -0
  39. data/lib/duffel_api/resources/offer.rb +60 -0
  40. data/lib/duffel_api/resources/offer_passenger.rb +28 -0
  41. data/lib/duffel_api/resources/offer_request.rb +34 -0
  42. data/lib/duffel_api/resources/order.rb +58 -0
  43. data/lib/duffel_api/resources/order_cancellation.rb +34 -0
  44. data/lib/duffel_api/resources/order_change.rb +46 -0
  45. data/lib/duffel_api/resources/order_change_offer.rb +46 -0
  46. data/lib/duffel_api/resources/order_change_request.rb +30 -0
  47. data/lib/duffel_api/resources/payment.rb +26 -0
  48. data/lib/duffel_api/resources/payment_intent.rb +52 -0
  49. data/lib/duffel_api/resources/refund.rb +42 -0
  50. data/lib/duffel_api/resources/seat_map.rb +24 -0
  51. data/lib/duffel_api/resources/webhook.rb +32 -0
  52. data/lib/duffel_api/response.rb +45 -0
  53. data/lib/duffel_api/services/aircraft_service.rb +36 -0
  54. data/lib/duffel_api/services/airlines_service.rb +36 -0
  55. data/lib/duffel_api/services/airports_service.rb +36 -0
  56. data/lib/duffel_api/services/base_service.rb +29 -0
  57. data/lib/duffel_api/services/offer_passengers_service.rb +30 -0
  58. data/lib/duffel_api/services/offer_requests_service.rb +67 -0
  59. data/lib/duffel_api/services/offers_service.rb +36 -0
  60. data/lib/duffel_api/services/order_cancellations_service.rb +75 -0
  61. data/lib/duffel_api/services/order_change_offers_service.rb +36 -0
  62. data/lib/duffel_api/services/order_change_requests_service.rb +37 -0
  63. data/lib/duffel_api/services/order_changes_service.rb +56 -0
  64. data/lib/duffel_api/services/orders_service.rb +74 -0
  65. data/lib/duffel_api/services/payment_intents_service.rb +56 -0
  66. data/lib/duffel_api/services/payments_service.rb +26 -0
  67. data/lib/duffel_api/services/refunds_service.rb +36 -0
  68. data/lib/duffel_api/services/seat_maps_service.rb +19 -0
  69. data/lib/duffel_api/services/webhooks_service.rb +83 -0
  70. data/lib/duffel_api/version.rb +1 -1
  71. data/lib/duffel_api.rb +51 -4
  72. metadata +90 -12
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module DuffelAPI
5
+ module Resources
6
+ class Webhook < BaseResource
7
+ attr_reader :active
8
+ attr_reader :created_at
9
+ attr_reader :events
10
+ attr_reader :id
11
+ attr_reader :live_mode
12
+ attr_reader :secret
13
+ attr_reader :updated_at
14
+ attr_reader :url
15
+
16
+ def initialize(object, response = nil)
17
+ @object = object
18
+
19
+ @active = object["active"]
20
+ @created_at = object["created_at"]
21
+ @events = object["events"]
22
+ @id = object["id"]
23
+ @live_mode = object["live_mode"]
24
+ @secret = object["secret"]
25
+ @updated_at = object["updated_at"]
26
+ @url = object["url"]
27
+
28
+ super(object, response)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ class Response
5
+ extend Forwardable
6
+
7
+ def_delegator :@response, :headers
8
+ def_delegator :@response, :status, :status_code
9
+
10
+ def initialize(response)
11
+ @response = response
12
+ end
13
+
14
+ def raw_body
15
+ @response.body
16
+ end
17
+
18
+ # Return the body of parsed JSON body of the API response
19
+ def parsed_body
20
+ JSON.parse(raw_body) unless raw_body.empty?
21
+ end
22
+
23
+ # Returns the meta hash of the response
24
+ def meta
25
+ return {} if parsed_body.nil?
26
+
27
+ parsed_body.fetch("meta", {})
28
+ rescue JSON::ParserError
29
+ {}
30
+ end
31
+
32
+ # Returns the request ID from the response headers
33
+ def request_id
34
+ normalised_headers["x-request-id"]
35
+ end
36
+
37
+ private
38
+
39
+ def normalised_headers
40
+ headers.transform_keys(&:downcase)
41
+ end
42
+
43
+ def json?; end
44
+ end
45
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class AircraftService < BaseService
6
+ def list(options = {})
7
+ path = "/air/aircraft"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Aircraft,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ DuffelAPI::Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/aircraft/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Aircraft.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class AirlinesService < BaseService
6
+ def list(options = {})
7
+ path = "/air/airlines"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Airline,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ DuffelAPI::Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/airlines/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Airline.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class AirportsService < BaseService
6
+ def list(options = {})
7
+ path = "/air/airports"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Airport,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ DuffelAPI::Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/airports/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Airport.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cgi"
4
+
5
+ module DuffelAPI
6
+ module Services
7
+ class BaseService
8
+ def initialize(api_service)
9
+ @api_service = api_service
10
+ end
11
+
12
+ def make_request(method, path, options = {})
13
+ @api_service.make_request(method, path, options)
14
+ end
15
+
16
+ private
17
+
18
+ def substitute_url_pattern(url, param_map)
19
+ param_map.reduce(url) do |new_url, (param, value)|
20
+ new_url.gsub(":#{param}", CGI.escape(value))
21
+ end
22
+ end
23
+
24
+ def unenvelope_body(parsed_body)
25
+ parsed_body["data"]
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OfferPassengersService < BaseService
6
+ def update(offer_id, passenger_id, options = {})
7
+ path = substitute_url_pattern(
8
+ "/air/offers/:offer_id/passengers/:passenger_id",
9
+ "offer_id" => offer_id,
10
+ "passenger_id" => passenger_id,
11
+ )
12
+
13
+ params = options.delete(:params) || {}
14
+ options[:params] = {}
15
+ options[:params]["data"] = params
16
+
17
+ begin
18
+ response = make_request(:patch, path, options)
19
+
20
+ # Response doesn't raise any errors until #body is called
21
+ response.tap(&:raw_body)
22
+ end
23
+
24
+ return if response.raw_body.nil?
25
+
26
+ Resources::OfferPassenger.new(unenvelope_body(response.parsed_body), response)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OfferRequestsService < BaseService
6
+ def create(options = {})
7
+ path = "/air/offer_requests"
8
+
9
+ params = options.delete(:params) || {}
10
+
11
+ # The "Create offer request" API expects a JSON body and can also accept the
12
+ # `return_offers` query parameter. No other endpoints in the Duffel API allow
13
+ # both. To avoid making the client library interface confusing, we get the client
14
+ # to pass this value in along with the body params, and we know to move it into
15
+ # the querystring.
16
+ return_offers = params.delete(:return_offers)
17
+
18
+ unless return_offers.nil?
19
+ options[:query_params] = { return_offers: return_offers }
20
+ end
21
+
22
+ options[:params] = {}
23
+ options[:params]["data"] = params
24
+
25
+ begin
26
+ response = make_request(:post, path, options)
27
+
28
+ # Response doesn't raise any errors until #body is called
29
+ response.tap(&:raw_body)
30
+ end
31
+
32
+ return if response.raw_body.nil?
33
+
34
+ Resources::OfferRequest.new(unenvelope_body(response.parsed_body), response)
35
+ end
36
+
37
+ def list(options = {})
38
+ path = "/air/offer_requests"
39
+
40
+ response = make_request(:get, path, options)
41
+
42
+ ListResponse.new(
43
+ response: response,
44
+ unenveloped_body: unenvelope_body(response.parsed_body),
45
+ resource_class: Resources::OfferRequest,
46
+ )
47
+ end
48
+
49
+ def all(options = {})
50
+ Paginator.new(
51
+ service: self,
52
+ options: options,
53
+ ).enumerator
54
+ end
55
+
56
+ def get(id, options = {})
57
+ path = substitute_url_pattern("/air/offer_requests/:id", "id" => id)
58
+
59
+ response = make_request(:get, path, options)
60
+
61
+ return if response.raw_body.nil?
62
+
63
+ Resources::OfferRequest.new(unenvelope_body(response.parsed_body), response)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OffersService < BaseService
6
+ def list(options = {})
7
+ path = "/air/offers"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Offer,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/offers/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Offer.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderCancellationsService < BaseService
6
+ def create(options = {})
7
+ path = "/air/order_cancellations"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::OrderCancellation.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def confirm(id, options = {})
26
+ path = substitute_url_pattern("/air/order_cancellations/:id/actions/confirm",
27
+ "id" => id)
28
+
29
+ params = options.delete(:params) || {}
30
+ options[:params] = {}
31
+ options[:params]["data"] = params
32
+
33
+ begin
34
+ response = make_request(:post, path, options)
35
+
36
+ # Response doesn't raise any errors until #body is called
37
+ response.tap(&:raw_body)
38
+ end
39
+
40
+ return if response.raw_body.nil?
41
+
42
+ Resources::OrderCancellation.new(unenvelope_body(response.parsed_body), response)
43
+ end
44
+
45
+ def list(options = {})
46
+ path = "/air/order_cancellations"
47
+
48
+ response = make_request(:get, path, options)
49
+
50
+ ListResponse.new(
51
+ response: response,
52
+ unenveloped_body: unenvelope_body(response.parsed_body),
53
+ resource_class: Resources::OrderCancellation,
54
+ )
55
+ end
56
+
57
+ def all(options = {})
58
+ Paginator.new(
59
+ service: self,
60
+ options: options,
61
+ ).enumerator
62
+ end
63
+
64
+ def get(id, options = {})
65
+ path = substitute_url_pattern("/air/order_cancellations/:id", "id" => id)
66
+
67
+ response = make_request(:get, path, options)
68
+
69
+ return if response.raw_body.nil?
70
+
71
+ Resources::OrderCancellation.new(unenvelope_body(response.parsed_body), response)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderChangeOffersService < BaseService
6
+ def list(options = {})
7
+ path = "/air/order_change_offers"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::OrderChangeOffer,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/order_change_offers/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::OrderChangeOffer.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderChangeRequestsService < BaseService
6
+ def create(options = {})
7
+ path = "/air/order_change_requests"
8
+
9
+ params = options.delete(:params) || {}
10
+
11
+ options[:params] = {}
12
+ options[:params]["data"] = params
13
+
14
+ begin
15
+ response = make_request(:post, path, options)
16
+
17
+ # Response doesn't raise any errors until #body is called
18
+ response.tap(&:raw_body)
19
+ end
20
+
21
+ return if response.raw_body.nil?
22
+
23
+ Resources::OrderChangeRequest.new(unenvelope_body(response.parsed_body), response)
24
+ end
25
+
26
+ def get(id, options = {})
27
+ path = substitute_url_pattern("/air/order_change_requests/:id", "id" => id)
28
+
29
+ response = make_request(:get, path, options)
30
+
31
+ return if response.raw_body.nil?
32
+
33
+ Resources::OrderChangeRequest.new(unenvelope_body(response.parsed_body), response)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderChangesService < BaseService
6
+ def create(options = {})
7
+ path = "/air/order_changes"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::OrderChange.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def confirm(id, options = {})
26
+ path = substitute_url_pattern("/air/order_changes/:id/actions/confirm",
27
+ "id" => id)
28
+
29
+ params = options.delete(:params) || {}
30
+ options[:params] = {}
31
+ options[:params]["data"] = params
32
+
33
+ begin
34
+ response = make_request(:post, path, options)
35
+
36
+ # Response doesn't raise any errors until #body is called
37
+ response.tap(&:raw_body)
38
+ end
39
+
40
+ return if response.raw_body.nil?
41
+
42
+ Resources::OrderChange.new(unenvelope_body(response.parsed_body), response)
43
+ end
44
+
45
+ def get(id, options = {})
46
+ path = substitute_url_pattern("/air/order_changes/:id", "id" => id)
47
+
48
+ response = make_request(:get, path, options)
49
+
50
+ return if response.raw_body.nil?
51
+
52
+ Resources::OrderChange.new(unenvelope_body(response.parsed_body), response)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrdersService < BaseService
6
+ def create(options = {})
7
+ path = "/air/orders"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::Order.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def update(id, options = {})
26
+ path = substitute_url_pattern("/air/orders/:id", "id" => id)
27
+
28
+ params = options.delete(:params) || {}
29
+ options[:params] = {}
30
+ options[:params]["data"] = params
31
+
32
+ begin
33
+ response = make_request(:patch, path, options)
34
+
35
+ # Response doesn't raise any errors until #body is called
36
+ response.tap(&:raw_body)
37
+ end
38
+
39
+ return if response.raw_body.nil?
40
+
41
+ Resources::Order.new(unenvelope_body(response.parsed_body), response)
42
+ end
43
+
44
+ def list(options = {})
45
+ path = "/air/orders"
46
+
47
+ response = make_request(:get, path, options)
48
+
49
+ ListResponse.new(
50
+ response: response,
51
+ unenveloped_body: unenvelope_body(response.parsed_body),
52
+ resource_class: Resources::Order,
53
+ )
54
+ end
55
+
56
+ def all(options = {})
57
+ Paginator.new(
58
+ service: self,
59
+ options: options,
60
+ ).enumerator
61
+ end
62
+
63
+ def get(id, options = {})
64
+ path = substitute_url_pattern("/air/orders/:id", "id" => id)
65
+
66
+ response = make_request(:get, path, options)
67
+
68
+ return if response.raw_body.nil?
69
+
70
+ Resources::Order.new(unenvelope_body(response.parsed_body), response)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class PaymentIntentsService < BaseService
6
+ def create(options = {})
7
+ path = "/payments/payment_intents"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::PaymentIntent.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def confirm(id, options = {})
26
+ path = substitute_url_pattern("/payments/payment_intents/:id/actions/confirm",
27
+ "id" => id)
28
+
29
+ params = options.delete(:params) || {}
30
+ options[:params] = {}
31
+ options[:params]["data"] = params
32
+
33
+ begin
34
+ response = make_request(:post, path, options)
35
+
36
+ # Response doesn't raise any errors until #body is called
37
+ response.tap(&:raw_body)
38
+ end
39
+
40
+ return if response.raw_body.nil?
41
+
42
+ Resources::PaymentIntent.new(unenvelope_body(response.parsed_body), response)
43
+ end
44
+
45
+ def get(id, options = {})
46
+ path = substitute_url_pattern("/payments/payment_intents/:id", "id" => id)
47
+
48
+ response = make_request(:get, path, options)
49
+
50
+ return if response.raw_body.nil?
51
+
52
+ Resources::PaymentIntent.new(unenvelope_body(response.parsed_body), response)
53
+ end
54
+ end
55
+ end
56
+ end