duffel_api 0.0.1.pre.dev → 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 +4 -4
- data/.circleci/config.yml +82 -0
- data/.github/dependabot.yml +6 -0
- data/.gitignore +9 -0
- data/.rubocop.yml +9 -9
- data/CHANGELOG.md +1 -3
- data/CODE_OF_CONDUCT.md +1 -1
- data/Gemfile +10 -2
- data/LICENSE.txt +1 -1
- data/README.md +190 -33
- data/Rakefile +1 -3
- data/bin/console +7 -0
- data/bin/setup +2 -0
- data/duffel_api.gemspec +40 -0
- data/examples/book_and_change.rb +106 -0
- data/examples/book_with_seat.rb +91 -0
- data/examples/exploring_data.rb +43 -0
- data/examples/hold_and_pay_later.rb +82 -0
- data/examples/search_and_book.rb +91 -0
- data/lib/duffel_api/api_response.rb +17 -0
- data/lib/duffel_api/api_service.rb +37 -0
- data/lib/duffel_api/client.rb +87 -0
- data/lib/duffel_api/errors/airline_error.rb +8 -0
- data/lib/duffel_api/errors/api_error.rb +8 -0
- data/lib/duffel_api/errors/authentication_error.rb +8 -0
- data/lib/duffel_api/errors/error.rb +54 -0
- data/lib/duffel_api/errors/invalid_request_error.rb +8 -0
- data/lib/duffel_api/errors/invalid_state_error.rb +8 -0
- data/lib/duffel_api/errors/rate_limit_error.rb +8 -0
- data/lib/duffel_api/errors/validation_error.rb +8 -0
- data/lib/duffel_api/list_response.rb +27 -0
- data/lib/duffel_api/middlewares/raise_duffel_errors.rb +67 -0
- data/lib/duffel_api/paginator.rb +27 -0
- data/lib/duffel_api/request.rb +64 -0
- data/lib/duffel_api/resources/aircraft.rb +26 -0
- data/lib/duffel_api/resources/airline.rb +26 -0
- data/lib/duffel_api/resources/airport.rb +40 -0
- data/lib/duffel_api/resources/base_resource.rb +16 -0
- data/lib/duffel_api/resources/offer.rb +60 -0
- data/lib/duffel_api/resources/offer_passenger.rb +28 -0
- data/lib/duffel_api/resources/offer_request.rb +34 -0
- data/lib/duffel_api/resources/order.rb +58 -0
- data/lib/duffel_api/resources/order_cancellation.rb +34 -0
- data/lib/duffel_api/resources/order_change.rb +46 -0
- data/lib/duffel_api/resources/order_change_offer.rb +46 -0
- data/lib/duffel_api/resources/order_change_request.rb +30 -0
- data/lib/duffel_api/resources/payment.rb +26 -0
- data/lib/duffel_api/resources/payment_intent.rb +52 -0
- data/lib/duffel_api/resources/refund.rb +42 -0
- data/lib/duffel_api/resources/seat_map.rb +24 -0
- data/lib/duffel_api/resources/webhook.rb +32 -0
- data/lib/duffel_api/response.rb +45 -0
- data/lib/duffel_api/services/aircraft_service.rb +36 -0
- data/lib/duffel_api/services/airlines_service.rb +36 -0
- data/lib/duffel_api/services/airports_service.rb +36 -0
- data/lib/duffel_api/services/base_service.rb +29 -0
- data/lib/duffel_api/services/offer_passengers_service.rb +30 -0
- data/lib/duffel_api/services/offer_requests_service.rb +67 -0
- data/lib/duffel_api/services/offers_service.rb +36 -0
- data/lib/duffel_api/services/order_cancellations_service.rb +75 -0
- data/lib/duffel_api/services/order_change_offers_service.rb +36 -0
- data/lib/duffel_api/services/order_change_requests_service.rb +37 -0
- data/lib/duffel_api/services/order_changes_service.rb +56 -0
- data/lib/duffel_api/services/orders_service.rb +74 -0
- data/lib/duffel_api/services/payment_intents_service.rb +56 -0
- data/lib/duffel_api/services/payments_service.rb +26 -0
- data/lib/duffel_api/services/refunds_service.rb +36 -0
- data/lib/duffel_api/services/seat_maps_service.rb +19 -0
- data/lib/duffel_api/services/webhooks_service.rb +83 -0
- data/lib/duffel_api/version.rb +1 -1
- data/lib/duffel_api.rb +51 -4
- 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
|