bookingsync-api 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile +2 -1
- data/Guardfile +3 -6
- data/README.md +11 -3
- data/bookingsync-api.gemspec +2 -2
- data/lib/bookingsync/api.rb +0 -2
- data/lib/bookingsync/api/client.rb +151 -54
- data/lib/bookingsync/api/client/amenities.rb +22 -0
- data/lib/bookingsync/api/client/billing_addresses.rb +22 -0
- data/lib/bookingsync/api/client/bookings.rb +7 -9
- data/lib/bookingsync/api/client/bookings_payments.rb +22 -0
- data/lib/bookingsync/api/client/clients.rb +43 -0
- data/lib/bookingsync/api/client/destinations.rb +22 -0
- data/lib/bookingsync/api/client/inquiries.rb +2 -2
- data/lib/bookingsync/api/client/payments.rb +53 -0
- data/lib/bookingsync/api/client/periods.rb +54 -0
- data/lib/bookingsync/api/client/photos.rb +22 -0
- data/lib/bookingsync/api/client/rates.rb +23 -0
- data/lib/bookingsync/api/client/rates_rules.rb +22 -0
- data/lib/bookingsync/api/client/rates_tables.rb +53 -0
- data/lib/bookingsync/api/client/rental_agreements.rb +50 -0
- data/lib/bookingsync/api/client/rentals.rb +39 -1
- data/lib/bookingsync/api/client/reviews.rb +31 -0
- data/lib/bookingsync/api/client/seasons.rb +53 -0
- data/lib/bookingsync/api/client/special_offers.rb +54 -0
- data/lib/bookingsync/api/relation.rb +87 -0
- data/lib/bookingsync/api/resource.rb +58 -0
- data/lib/bookingsync/api/response.rb +79 -0
- data/lib/bookingsync/api/serializer.rb +100 -0
- data/lib/bookingsync/api/version.rb +1 -1
- data/spec/bookingsync/api/client/amenities_spec.rb +12 -0
- data/spec/bookingsync/api/client/billing_addresses_spec.rb +12 -0
- data/spec/bookingsync/api/client/billings_payments_spec.rb +12 -0
- data/spec/bookingsync/api/client/bookings_spec.rb +10 -8
- data/spec/bookingsync/api/client/clients_spec.rb +55 -0
- data/spec/bookingsync/api/client/destinations_spec.rb +12 -0
- data/spec/bookingsync/api/client/inquiries_spec.rb +1 -1
- data/spec/bookingsync/api/client/payments_spec.rb +56 -0
- data/spec/bookingsync/api/client/periods_spec.rb +61 -0
- data/spec/bookingsync/api/client/photos_spec.rb +12 -0
- data/spec/bookingsync/api/client/rates_rules_spec.rb +13 -0
- data/spec/bookingsync/api/client/rates_spec.rb +12 -0
- data/spec/bookingsync/api/client/rates_tables_spec.rb +59 -0
- data/spec/bookingsync/api/client/rental_agreements_spec.rb +64 -0
- data/spec/bookingsync/api/client/rentals_spec.rb +56 -6
- data/spec/bookingsync/api/client/reviews_spec.rb +33 -0
- data/spec/bookingsync/api/client/seasons_spec.rb +61 -0
- data/spec/bookingsync/api/client/special_offers_spec.rb +63 -0
- data/spec/bookingsync/api/client_spec.rb +31 -10
- data/spec/bookingsync/api/relation_spec.rb +72 -0
- data/spec/bookingsync/api/resource_spec.rb +79 -0
- data/spec/bookingsync/api/response_spec.rb +66 -0
- data/spec/cassettes/BookingSync_API_Client_Amenities/_amenities/returns_amenities.yml +72 -0
- data/spec/cassettes/BookingSync_API_Client_BillingAddresses/_billing_addresses/returns_billing_addresses.yml +65 -0
- data/spec/cassettes/BookingSync_API_Client_Bookings/_bookings/pagination/with_a_block/yields_block_with_batch_of_bookings.yml +12 -12
- data/spec/cassettes/BookingSync_API_Client_Bookings/_bookings/pagination/with_auto_paginate_true/returns_all_bookings_joined_from_many_requests.yml +12 -12
- data/spec/cassettes/BookingSync_API_Client_Bookings/_bookings/pagination/with_per_page_setting/returns_limited_number_of_bookings.yml +3 -3
- data/spec/cassettes/BookingSync_API_Client_Bookings/_clients/returns_clients.yml +66 -0
- data/spec/cassettes/BookingSync_API_Client_Bookings/_create_booking/creates_a_booking.yml +1 -1
- data/spec/cassettes/BookingSync_API_Client_Bookings/_create_client/creates_a_new_client.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Bookings/_edit_booking/updates_given_booking_by_ID.yml +18 -14
- data/spec/cassettes/BookingSync_API_Client_Bookings/_edit_client/updates_given_client_by_ID.yml +62 -0
- data/spec/cassettes/BookingSync_API_Client_BookingsPayments/_bookings_payments/returns_bookings_payments.yml +65 -0
- data/spec/cassettes/BookingSync_API_Client_Destinations/_destinations/returns_destinations.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Inquiries/_create_inquiry/creates_a_new_inquiry.yml +1 -1
- data/spec/cassettes/BookingSync_API_Client_Inquiries/_inquiries/returns_inquiries.yml +1 -1
- data/spec/cassettes/BookingSync_API_Client_Payments/_cancel_payment/cancels_given_payment.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_Payments/_create_payment/creates_a_new_payment.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_Payments/_edit_payment/updates_given_payment_by_ID.yml +61 -0
- data/spec/cassettes/BookingSync_API_Client_Payments/_payments/returns_payments.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_create_period/creates_a_new_period.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_delete_period/deletes_given_period.yml +70 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_edit_period/updates_given_period_by_ID.yml +61 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_periods/returns_periods.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Photos/_photos/returns_photos.yml +72 -0
- data/spec/cassettes/BookingSync_API_Client_Rates/_rates/returns_rates.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_RatesRules/_rates_rules/returns_rates_rules.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_create_rates_table/creates_a_new_rates_table.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_delete_rates_table/deletes_given_rates_table.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_edit_rates_table/updates_given_rates_table_by_ID.yml +62 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_rates_tables/returns_rates_tables.yml +74 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_create_rental_agreement/creates_a_new_rental_agreement.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_create_rental_agreement_for_booking/creates_a_new_rental_agreement.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_create_rental_agreement_for_rental/creates_a_new_rental_agreement.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_rental_agreements/returns_rental_agreements.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_cancel_rental/cancels_given_rental.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_create_rental/creates_a_new_rental.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_edit_rental/updates_given_rental_by_ID.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rental/returns_a_single_rental.yml +67 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rentals/links/returns_associated_photos.yml +152 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rentals/links/returns_links_to_associated_resources.yml +91 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rentals/returns_rentals.yml +45 -20
- data/spec/cassettes/BookingSync_API_Client_Reviews/_create_review/creates_a_new_review.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Reviews/_reviews/returns_reviews.yml +83 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_create_season/creates_a_new_season.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_delete_season/deletes_given_season.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_edit_season/updates_given_season_by_ID.yml +62 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_seasons/returns_seasons.yml +74 -0
- data/spec/cassettes/BookingSync_API_Client_SpecialOffers/_create_special_offer/creates_a_new_special_offer.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_SpecialOffers/_delete_special_offer/deletes_given_special_offer.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_SpecialOffers/_edit_special_offer/updates_given_special_offer_by_ID.yml +61 -0
- data/spec/cassettes/{BookingSync_API_Client_Rentals/_rentals/with_specified_fields_in_options/returns_rentals_with_filtered_fields.yml → BookingSync_API_Client_SpecialOffers/_special_offers/returns_special_offers.yml} +17 -10
- data/spec/spec_helper.rb +1 -0
- metadata +143 -7
- data/lib/bookingsync/ext/resource.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2cb84342589240cfa192b7d61350efb89297de9
|
4
|
+
data.tar.gz: 17549658e975c21ff097e3bcbe7b92ce3aec0db8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00db8c9b72935df38730f0288252cddcd85c343e6847b9983e7fe9c410a900cbff84ff2c401e9a88d66245b2dd4686152a7820892fd1cb54f20538f3c0de7b06
|
7
|
+
data.tar.gz: ad647464027c54595e3703d813447366845487d7031397b4d27f39f8cba15486228edc7097e1b49962bfd0995ff83a2339e229e295a466241dfd797f29d68ae6
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
guard :rspec do
|
1
|
+
guard :rspec, cmd: "bundle exec rspec --format p" do
|
2
|
+
watch(%r{^spec/(.+)_spec\.rb$})
|
2
3
|
watch(%r{^lib/bookingsync/(.+)\.rb$}) { |m| "spec/bookingsync/#{m[1]}_spec.rb" }
|
3
4
|
watch(%r{^lib/bookingsync/api/client/(.+)\.rb$}) { |m| "spec/bookingsync/api/client/#{m[1]}_spec.rb" }
|
4
|
-
watch(%r{^lib/bookingsync/api/(.+)\.rb$}) { |m| "spec
|
5
|
+
watch(%r{^lib/bookingsync/api/(.+)\.rb$}) { |m| "spec" }
|
5
6
|
watch('spec/spec_helper.rb') { "spec" }
|
6
7
|
end
|
7
|
-
|
8
|
-
guard 'yard' do
|
9
|
-
watch(%r{lib/.+\.rb})
|
10
|
-
end
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ Or install it yourself as:
|
|
24
24
|
Gem assumes that you already have OAuth token for an account.
|
25
25
|
|
26
26
|
api = BookingSync::API.new("OAUTH_TOKEN")
|
27
|
-
rentals = api.rentals # => [
|
27
|
+
rentals = api.rentals # => [BookingSync::API::Resource, BookingSync::API::Resource]
|
28
28
|
rentals.first.name # => "Small apartment"
|
29
29
|
|
30
30
|
### Pagination
|
@@ -33,7 +33,7 @@ All endpoints returning a collection of resources can be paginated. There are th
|
|
33
33
|
|
34
34
|
Specify `:per_page` and `:page` params. It's useful when implementing pagination on your site.
|
35
35
|
|
36
|
-
api.bookings(per_page: 10, page: 1) => [
|
36
|
+
api.bookings(per_page: 10, page: 1) => [BookingSync::API::Resource, BookingSync::API::Resource, ...]
|
37
37
|
|
38
38
|
Use pagination with a block.
|
39
39
|
|
@@ -43,7 +43,7 @@ Use pagination with a block.
|
|
43
43
|
|
44
44
|
Fetch all resources (with multiple requests under the hood) and return one big array.
|
45
45
|
|
46
|
-
api.bookings(auto_paginate: true) => [
|
46
|
+
api.bookings(auto_paginate: true) => [BookingSync::API::Resource, BookingSync::API::Resource, ...]
|
47
47
|
|
48
48
|
## Gem documentation
|
49
49
|
|
@@ -61,6 +61,14 @@ OR
|
|
61
61
|
|
62
62
|
bundle exec guard
|
63
63
|
|
64
|
+
### Recording VCR cassettes
|
65
|
+
|
66
|
+
For developing bookingsync-api gem you need OAuth access token. In order to record a cassette,
|
67
|
+
you need to run spec with below environment variables.
|
68
|
+
|
69
|
+
ACCESS_TOKEN=abc bundle exec rspec
|
70
|
+
|
71
|
+
If you want to change a cassette, you need to delete it first.
|
64
72
|
|
65
73
|
## Contributing
|
66
74
|
|
data/bookingsync-api.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "faraday", "~> 0.9"
|
22
|
-
spec.add_dependency "
|
23
|
-
spec.add_dependency "
|
22
|
+
spec.add_dependency "addressable"
|
23
|
+
spec.add_dependency "hashie"
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.5"
|
25
25
|
spec.add_development_dependency "rake"
|
26
26
|
end
|
data/lib/bookingsync/api.rb
CHANGED
@@ -1,14 +1,48 @@
|
|
1
1
|
require "bookingsync/api/middleware/authentication"
|
2
|
+
require "bookingsync/api/client/amenities"
|
3
|
+
require "bookingsync/api/client/billing_addresses"
|
2
4
|
require "bookingsync/api/client/bookings"
|
5
|
+
require "bookingsync/api/client/bookings_payments"
|
6
|
+
require "bookingsync/api/client/clients"
|
7
|
+
require "bookingsync/api/client/destinations"
|
3
8
|
require "bookingsync/api/client/inquiries"
|
9
|
+
require "bookingsync/api/client/periods"
|
10
|
+
require "bookingsync/api/client/payments"
|
11
|
+
require "bookingsync/api/client/photos"
|
12
|
+
require "bookingsync/api/client/rates"
|
13
|
+
require "bookingsync/api/client/rates_rules"
|
14
|
+
require "bookingsync/api/client/rates_tables"
|
4
15
|
require "bookingsync/api/client/rentals"
|
16
|
+
require "bookingsync/api/client/rental_agreements"
|
17
|
+
require "bookingsync/api/client/reviews"
|
18
|
+
require "bookingsync/api/client/seasons"
|
19
|
+
require "bookingsync/api/client/special_offers"
|
5
20
|
require "bookingsync/api/error"
|
21
|
+
require "bookingsync/api/relation"
|
22
|
+
require "bookingsync/api/response"
|
23
|
+
require "bookingsync/api/resource"
|
24
|
+
require "bookingsync/api/serializer"
|
6
25
|
|
7
26
|
module BookingSync::API
|
8
27
|
class Client
|
28
|
+
include BookingSync::API::Client::Amenities
|
29
|
+
include BookingSync::API::Client::BillingAddresses
|
9
30
|
include BookingSync::API::Client::Bookings
|
31
|
+
include BookingSync::API::Client::BookingsPayments
|
32
|
+
include BookingSync::API::Client::Clients
|
33
|
+
include BookingSync::API::Client::Destinations
|
10
34
|
include BookingSync::API::Client::Inquiries
|
35
|
+
include BookingSync::API::Client::Periods
|
36
|
+
include BookingSync::API::Client::Payments
|
37
|
+
include BookingSync::API::Client::Photos
|
38
|
+
include BookingSync::API::Client::Rates
|
39
|
+
include BookingSync::API::Client::RatesRules
|
40
|
+
include BookingSync::API::Client::RatesTables
|
11
41
|
include BookingSync::API::Client::Rentals
|
42
|
+
include BookingSync::API::Client::RentalAgreements
|
43
|
+
include BookingSync::API::Client::Reviews
|
44
|
+
include BookingSync::API::Client::Seasons
|
45
|
+
include BookingSync::API::Client::SpecialOffers
|
12
46
|
|
13
47
|
MEDIA_TYPE = "application/vnd.api+json"
|
14
48
|
|
@@ -17,16 +51,25 @@ module BookingSync::API
|
|
17
51
|
# Initialize new Client
|
18
52
|
#
|
19
53
|
# @param token [String] OAuth token
|
54
|
+
# @param options [Hash]
|
55
|
+
# @option options [String] base_url: Base URL to BookingSync site
|
20
56
|
# @return [BookingSync::API::Client] New BookingSync API client
|
21
|
-
def initialize(token)
|
57
|
+
def initialize(token, options = {})
|
22
58
|
@token = token
|
59
|
+
@base_url = options[:base_url]
|
60
|
+
@serializer = Serializer.new
|
61
|
+
@conn = Faraday.new(faraday_options)
|
62
|
+
@conn.headers[:accept] = MEDIA_TYPE
|
63
|
+
@conn.headers[:content_type] = MEDIA_TYPE
|
64
|
+
@conn.url_prefix = api_endpoint
|
65
|
+
yield @conn if block_given?
|
23
66
|
end
|
24
67
|
|
25
68
|
# Make a HTTP GET request
|
26
69
|
#
|
27
70
|
# @param path [String] The path, relative to {#api_endpoint}
|
28
71
|
# @param options [Hash] Query params for the request
|
29
|
-
# @return [Array<
|
72
|
+
# @return [Array<BookingSync::API::Resource>] Array of resources.
|
30
73
|
def get(path, options = {})
|
31
74
|
request :get, path, query: options
|
32
75
|
end
|
@@ -35,7 +78,7 @@ module BookingSync::API
|
|
35
78
|
#
|
36
79
|
# @param path [String] The path, relative to {#api_endpoint}
|
37
80
|
# @param options [Hash] Body params for the request
|
38
|
-
# @return [Array<
|
81
|
+
# @return [Array<BookingSync::API::Resource>]
|
39
82
|
def post(path, options = {})
|
40
83
|
request :post, path, options
|
41
84
|
end
|
@@ -44,7 +87,7 @@ module BookingSync::API
|
|
44
87
|
#
|
45
88
|
# @param path [String] The path, relative to {#api_endpoint}
|
46
89
|
# @param options [Hash] Body params for the request
|
47
|
-
# @return [Array<
|
90
|
+
# @return [Array<BookingSync::API::Resource>]
|
48
91
|
def put(path, options = {})
|
49
92
|
request :put, path, options
|
50
93
|
end
|
@@ -53,7 +96,7 @@ module BookingSync::API
|
|
53
96
|
#
|
54
97
|
# @param path [String] The path, relative to {#api_endpoint}
|
55
98
|
# @param options [Hash] Body params for the request
|
56
|
-
# @return [Array<
|
99
|
+
# @return [Array<BookingSync::API::Resource>]
|
57
100
|
def delete(path, options = {})
|
58
101
|
request :delete, path, options
|
59
102
|
end
|
@@ -62,80 +105,110 @@ module BookingSync::API
|
|
62
105
|
#
|
63
106
|
# @return [String] URL to API endpoint
|
64
107
|
def api_endpoint
|
65
|
-
"
|
108
|
+
URI.join(base_url, "api/v3").to_s
|
66
109
|
end
|
67
110
|
|
68
|
-
|
111
|
+
# Encode an object to a string for the API request.
|
112
|
+
#
|
113
|
+
# @param data [Object] The Hash or Resource that is being sent.
|
114
|
+
# @return [String] Object encoded into JSON string
|
115
|
+
def encode_body(data)
|
116
|
+
@serializer.encode(data)
|
117
|
+
end
|
69
118
|
|
70
|
-
#
|
119
|
+
# Decode a String response body to a Resource.
|
120
|
+
#
|
121
|
+
# @param str [String] The String body from the response.
|
122
|
+
# @return [Object] Object resource
|
123
|
+
def decode_body(str)
|
124
|
+
@serializer.decode(str)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Make a HTTP request to a path and returns an Array of Resources
|
71
128
|
#
|
72
129
|
# @param method [Symbol] HTTP verb to use.
|
73
130
|
# @param path [String] The path, relative to {#api_endpoint}.
|
74
131
|
# @param data [Hash] Data to be send in the request's body
|
75
132
|
# it can include query: key with requests params for GET requests
|
76
133
|
# @param options [Hash] A customizable set of request options.
|
77
|
-
# @return [Array<
|
78
|
-
def request(method, path, data, options =
|
79
|
-
|
80
|
-
|
81
|
-
options[:query].keys.each do |key|
|
82
|
-
if options[:query][key].is_a?(Array)
|
83
|
-
options[:query][key] = options[:query][key].join(",")
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
@last_response = response = agent.call(method, path, data.to_json, options)
|
89
|
-
case response.status
|
90
|
-
when 204; [] # update/destroy response
|
91
|
-
when 200..299; json_api_to_array(response.data)
|
92
|
-
when 401; raise Unauthorized.new
|
93
|
-
when 422; raise UnprocessableEntity.new
|
94
|
-
end
|
134
|
+
# @return [Array<BookingSync::API::Resource>] Array of resources.
|
135
|
+
def request(method, path, data = nil, options = nil)
|
136
|
+
response = call(method, path, data, options)
|
137
|
+
response.respond_to?(:resources) ? response.resources : response
|
95
138
|
end
|
96
139
|
|
140
|
+
# Make a HTTP GET request to a path with pagination support.
|
141
|
+
#
|
142
|
+
# @param options [Hash]
|
143
|
+
# @option options [Integer] per_page: Number of resources per page
|
144
|
+
# @option options [Integer] page: Number of page to return
|
145
|
+
# @option options [Boolean] auto_paginate: If true, all resources will
|
146
|
+
# be returned. It makes multiple requestes underneath and joins the results.
|
147
|
+
#
|
148
|
+
# @yieldreturn [Array<BookingSync::API::Resource>] Batch of resources
|
149
|
+
# @return [Array<BookingSync::API::Resource>] Batch of resources
|
97
150
|
def paginate(path, options = {}, &block)
|
98
151
|
auto_paginate = options.delete(:auto_paginate)
|
152
|
+
response = call(:get, path, query: options)
|
153
|
+
data = response.resources.dup
|
99
154
|
|
100
|
-
|
101
|
-
|
102
|
-
if (block_given? or auto_paginate) && @last_response.rels[:next]
|
155
|
+
if (block_given? or auto_paginate) && response.rels[:next]
|
103
156
|
first_request = true
|
104
157
|
loop do
|
105
158
|
if block_given?
|
106
|
-
yield(
|
159
|
+
yield(response.resources)
|
107
160
|
elsif auto_paginate
|
108
|
-
data.concat(
|
161
|
+
data.concat(response.resources) unless first_request
|
109
162
|
first_request = false
|
110
163
|
end
|
111
|
-
break unless
|
112
|
-
|
164
|
+
break unless response.rels[:next]
|
165
|
+
response = response.rels[:next].get
|
113
166
|
end
|
114
167
|
end
|
115
168
|
|
116
169
|
data
|
117
170
|
end
|
118
171
|
|
119
|
-
|
120
|
-
|
121
|
-
# Return collection of resources
|
172
|
+
# Make a HTTP request to given path and returns Response object.
|
122
173
|
#
|
123
|
-
#
|
124
|
-
#
|
125
|
-
# @param data [
|
126
|
-
#
|
127
|
-
#
|
128
|
-
|
129
|
-
|
130
|
-
|
174
|
+
# @param method [Symbol] HTTP verb to use.
|
175
|
+
# @param path [String] The path, relative to {#api_endpoint}.
|
176
|
+
# @param data [Hash] Data to be send in the request's body
|
177
|
+
# it can include query: key with requests params for GET requests
|
178
|
+
# @param options [Hash] A customizable set of request options.
|
179
|
+
# @return [BookingSync::API::Response] A Response object.
|
180
|
+
def call(method, path, data = nil, options = nil)
|
181
|
+
if [:get, :head].include?(method)
|
182
|
+
options = data
|
183
|
+
data = nil
|
184
|
+
end
|
185
|
+
options ||= {}
|
131
186
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
187
|
+
if options.has_key?(:query)
|
188
|
+
options[:query].keys.each do |key|
|
189
|
+
if options[:query][key].is_a?(Array)
|
190
|
+
options[:query][key] = options[:query][key].join(",")
|
191
|
+
end
|
192
|
+
end
|
136
193
|
end
|
194
|
+
|
195
|
+
url = expand_url(path, options[:uri])
|
196
|
+
res = @conn.send(method, url) do |req|
|
197
|
+
if data
|
198
|
+
req.body = data.is_a?(String) ? data : encode_body(data)
|
199
|
+
end
|
200
|
+
if params = options[:query]
|
201
|
+
req.params.update params
|
202
|
+
end
|
203
|
+
if headers = options[:headers]
|
204
|
+
req.headers.update headers
|
205
|
+
end
|
206
|
+
end
|
207
|
+
handle_response(res)
|
137
208
|
end
|
138
209
|
|
210
|
+
private
|
211
|
+
|
139
212
|
def middleware
|
140
213
|
Faraday::RackBuilder.new do |builder|
|
141
214
|
builder.use :authentication, token
|
@@ -143,21 +216,18 @@ module BookingSync::API
|
|
143
216
|
end
|
144
217
|
end
|
145
218
|
|
146
|
-
def sawyer_options
|
147
|
-
{faraday: Faraday.new(faraday_options)}
|
148
|
-
end
|
149
|
-
|
150
219
|
def faraday_options
|
151
220
|
{builder: middleware, ssl: {verify: verify_ssl?}}
|
152
221
|
end
|
153
222
|
|
154
223
|
# Return BookingSync base URL. Default is https://www.bookingsync.com
|
155
224
|
# it can be altered via ENV variable BOOKINGSYNC_URL which
|
156
|
-
# is useful in specs when recording vcr cassettes
|
225
|
+
# is useful in specs when recording vcr cassettes. In also can be passed
|
226
|
+
# as :base_url option when initializing the Client object
|
157
227
|
#
|
158
228
|
# @return [String] Base URL to BookingSync
|
159
229
|
def base_url
|
160
|
-
ENV.fetch
|
230
|
+
@base_url || ENV.fetch("BOOKINGSYNC_URL", "https://www.bookingsync.com")
|
161
231
|
end
|
162
232
|
|
163
233
|
# Return true if SSL cert should be verified
|
@@ -169,5 +239,32 @@ module BookingSync::API
|
|
169
239
|
def verify_ssl?
|
170
240
|
ENV["BOOKINGSYNC_VERIFY_SSL"] == "false" ? false : true
|
171
241
|
end
|
242
|
+
|
243
|
+
# Expand an URL template into a full URL
|
244
|
+
#
|
245
|
+
# @param url [String|Addressable::Template] - An URL to be expanded
|
246
|
+
# @param options [Hash] - Variables which will be used to expand
|
247
|
+
# @return [String] - Expanded URL
|
248
|
+
def expand_url(url, options = nil)
|
249
|
+
tpl = url.respond_to?(:expand) ? url : Addressable::Template.new(url.to_s)
|
250
|
+
tpl.expand(options || {}).to_s
|
251
|
+
end
|
252
|
+
|
253
|
+
# Process faraday response.
|
254
|
+
#
|
255
|
+
# @param faraday_response [Faraday::Response] - A response to process
|
256
|
+
# @raise [BookingSync::API::Unauthorized] - On unauthorized user
|
257
|
+
# @raise [BookingSync::API::UnprocessableEntity] - On validations error
|
258
|
+
# @return [BookingSync::API::Response|NilClass]
|
259
|
+
def handle_response(faraday_response)
|
260
|
+
response = Response.new(self, faraday_response)
|
261
|
+
case response.status
|
262
|
+
when 204; nil # destroy/cancel
|
263
|
+
when 200..299; response
|
264
|
+
when 401; raise Unauthorized.new
|
265
|
+
when 422; raise UnprocessableEntity.new
|
266
|
+
else nil
|
267
|
+
end
|
268
|
+
end
|
172
269
|
end
|
173
270
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module BookingSync::API
|
2
|
+
class Client
|
3
|
+
module Amenities
|
4
|
+
# List amenities
|
5
|
+
#
|
6
|
+
# Returns amenities for the account user is authenticated with.
|
7
|
+
# @param options [Hash] A customizable set of options.
|
8
|
+
# @option options [Array] fields: List of fields to be fetched.
|
9
|
+
# @return [Array<BookingSync::API::Resource>] Array of amenities.
|
10
|
+
#
|
11
|
+
# @example Get the list of amenities for the current account
|
12
|
+
# amenities = @api.amenities
|
13
|
+
# amenities.first.title # => "Internet"
|
14
|
+
# @example Get the list of amenities only with title and rental_id for smaller response
|
15
|
+
# @api.amenities(fields: [:title, :rental_id])
|
16
|
+
# @see http://docs.api.bookingsync.com/reference/endpoints/amenities/#list-amenities
|
17
|
+
def amenities(options = {}, &block)
|
18
|
+
paginate :amenities, options, &block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module BookingSync::API
|
2
|
+
class Client
|
3
|
+
module BillingAddresses
|
4
|
+
# List billing addresses
|
5
|
+
#
|
6
|
+
# Returns billing addresses for the account user is authenticated with.
|
7
|
+
# @param options [Hash] A customizable set of options.
|
8
|
+
# @option options [Array] fields: List of fields to be fetched.
|
9
|
+
# @return [Array<BookingSync::API::Resource>] Array of billing addresses.
|
10
|
+
#
|
11
|
+
# @example Get the list of billing addresses for the current account
|
12
|
+
# billing_addresses = @api.billing_addresses
|
13
|
+
# billing_addresses.first.city # => "Paris"
|
14
|
+
# @example Get the list of billing addresses only with city and address1 for smaller response
|
15
|
+
# @api.billing_addresses(fields: [:city, :address1])
|
16
|
+
# @see http://docs.api.bookingsync.com/reference/endpoints/billing addresss/#list-billing-addresses
|
17
|
+
def billing_addresses(options = {}, &block)
|
18
|
+
paginate :billing_addresses, options, &block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|