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.
- 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
|