bigcommerce 0.10.0 → 1.0.0.beta
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/.gitignore +17 -0
- data/.rspec +2 -0
- data/.rubocop.yml +620 -0
- data/.travis.yml +15 -0
- data/CHANGELOG.md +11 -0
- data/CONTRIBUTING.md +119 -0
- data/DEPENDENCIES.md +7 -0
- data/Gemfile +15 -0
- data/Guardfile +22 -0
- data/LICENSE +15 -15
- data/README.md +61 -70
- data/RELEASING.md +64 -0
- data/Rakefile +8 -6
- data/bigcommerce.gemspec +22 -53
- data/examples/README.md +148 -0
- data/examples/configuration/legacy_auth.rb +12 -0
- data/examples/configuration/oauth.rb +9 -0
- data/examples/content/blog_post.rb +39 -0
- data/examples/content/blog_tag.rb +10 -0
- data/examples/content/redirect.rb +43 -0
- data/examples/customers/customer.rb +36 -0
- data/examples/customers/customer_address.rb +50 -0
- data/examples/customers/customer_group.rb +35 -0
- data/examples/exception_handling.rb +50 -0
- data/examples/geography/country.rb +16 -0
- data/examples/geography/state.rb +19 -0
- data/examples/marketing/coupon.rb +44 -0
- data/examples/orders/order.rb +53 -0
- data/examples/orders/order_coupon.rb +17 -0
- data/examples/orders/order_message.rb +17 -0
- data/examples/orders/order_product.rb +23 -0
- data/examples/orders/order_shipping_address.rb +23 -0
- data/examples/orders/order_status.rb +15 -0
- data/examples/orders/order_tax.rb +17 -0
- data/examples/orders/shipment.rb +57 -0
- data/examples/payments/payment_method.rb +10 -0
- data/examples/products/brand.rb +36 -0
- data/examples/products/bulk_pricing_rule.rb +47 -0
- data/examples/products/category.rb +37 -0
- data/examples/products/configurable_field.rb +29 -0
- data/examples/products/custom_field.rb +44 -0
- data/examples/products/google_product_search_mapping.rb +12 -0
- data/examples/products/option.rb +37 -0
- data/examples/products/option_set.rb +35 -0
- data/examples/products/option_set_option.rb +50 -0
- data/examples/products/option_value.rb +43 -0
- data/examples/products/product.rb +44 -0
- data/examples/products/product_image.rb +42 -0
- data/examples/products/product_option.rb +17 -0
- data/examples/products/product_review.rb +12 -0
- data/examples/products/product_rule.rb +54 -0
- data/examples/products/product_video.rb +45 -0
- data/examples/products/sku.rb +48 -0
- data/examples/shipping/shipping_method.rb +13 -0
- data/examples/store/store_info.rb +10 -0
- data/examples/system/time.rb +10 -0
- data/examples/tax/tax_class.rb +13 -0
- data/examples/webhooks/webhook.rb +29 -0
- data/lib/bigcommerce.rb +50 -8
- data/lib/bigcommerce/exception.rb +51 -0
- data/lib/bigcommerce/middleware/auth.rb +16 -0
- data/lib/bigcommerce/middleware/http_exception.rb +14 -0
- data/lib/bigcommerce/request.rb +89 -0
- data/lib/bigcommerce/resource_actions.rb +51 -0
- data/lib/bigcommerce/resources/content/blog_post.rb +31 -0
- data/lib/bigcommerce/resources/content/blog_tag.rb +17 -0
- data/lib/bigcommerce/resources/content/redirect.rb +21 -0
- data/lib/bigcommerce/resources/customers/customer.rb +30 -0
- data/lib/bigcommerce/resources/customers/customer_address.rb +34 -0
- data/lib/bigcommerce/resources/customers/customer_group.rb +21 -0
- data/lib/bigcommerce/resources/geography/country.rb +22 -0
- data/lib/bigcommerce/resources/geography/state.rb +25 -0
- data/lib/bigcommerce/resources/marketing/coupon.rb +30 -0
- data/lib/bigcommerce/resources/orders/order.rb +73 -0
- data/lib/bigcommerce/resources/orders/order_coupon.rb +20 -0
- data/lib/bigcommerce/resources/orders/order_message.rb +23 -0
- data/lib/bigcommerce/resources/orders/order_product.rb +64 -0
- data/lib/bigcommerce/resources/orders/order_shipping_address.rb +50 -0
- data/lib/bigcommerce/resources/orders/order_status.rb +16 -0
- data/lib/bigcommerce/resources/orders/order_tax.rb +23 -0
- data/lib/bigcommerce/resources/orders/shipment.rb +30 -0
- data/lib/bigcommerce/resources/payments/payment_method.rb +17 -0
- data/lib/bigcommerce/resources/products/brand.rb +23 -0
- data/lib/bigcommerce/resources/products/bulk_pricing_rule.rb +26 -0
- data/lib/bigcommerce/resources/products/category.rb +29 -0
- data/lib/bigcommerce/resources/products/configurable_field.rb +30 -0
- data/lib/bigcommerce/resources/products/custom_field.rb +24 -0
- data/lib/bigcommerce/resources/products/google_product_search_mapping.rb +26 -0
- data/lib/bigcommerce/resources/products/option.rb +20 -0
- data/lib/bigcommerce/resources/products/option_set.rb +18 -0
- data/lib/bigcommerce/resources/products/option_set_option.rb +19 -0
- data/lib/bigcommerce/resources/products/option_value.rb +15 -0
- data/lib/bigcommerce/resources/products/product.rb +97 -0
- data/lib/bigcommerce/resources/products/product_image.rb +31 -0
- data/lib/bigcommerce/resources/products/product_option.rb +17 -0
- data/lib/bigcommerce/resources/products/product_review.rb +22 -0
- data/lib/bigcommerce/resources/products/product_rule.rb +31 -0
- data/lib/bigcommerce/resources/products/product_video.rb +24 -0
- data/lib/bigcommerce/resources/products/sku.rb +29 -0
- data/lib/bigcommerce/resources/resource.rb +10 -0
- data/lib/bigcommerce/resources/shipping/shipping_method.rb +15 -0
- data/lib/bigcommerce/resources/store/store_information.rb +37 -0
- data/lib/bigcommerce/resources/system/time.rb +15 -0
- data/lib/bigcommerce/resources/tax/tax_class.rb +15 -0
- data/lib/bigcommerce/resources/webhooks/webhook.rb +22 -0
- data/lib/bigcommerce/subresource_actions.rb +43 -0
- data/lib/bigcommerce/version.rb +1 -4
- data/spec/bigcommerce/bigcommerce_spec.rb +76 -0
- data/spec/bigcommerce/unit/actions_spec.rb +151 -0
- data/spec/bigcommerce/unit/exception_spec.rb +53 -0
- data/spec/bigcommerce/unit/middleware/auth_spec.rb +18 -0
- data/spec/bigcommerce/unit/middleware/http_exception_spec.rb +40 -0
- data/spec/bigcommerce/unit/request_spec.rb +180 -0
- data/spec/bigcommerce/unit/resources/content/blog_post_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/content/blog_tag_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/content/redirect_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/customers/customer_address_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/customers/customer_group_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/customers/customer_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/geography/country_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/geography/state_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/marketing/coupon_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/orders/order_product_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/orders/order_shipping_address_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/orders/order_spec.rb +13 -0
- data/spec/bigcommerce/unit/resources/orders/shipment_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/payments/payment_method_spec.rb +23 -0
- data/spec/bigcommerce/unit/resources/products/brand_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/products/bulk_pricing_rule_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/products/category_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/products/configurable_field_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/products/custom_field_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/products/google_product_search_mapping_spec.rb +14 -0
- data/spec/bigcommerce/unit/resources/products/option_set_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/products/option_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/products/product_image_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/products/product_review_spec.rb +14 -0
- data/spec/bigcommerce/unit/resources/products/product_rule_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/products/product_spec.rb +13 -0
- data/spec/bigcommerce/unit/resources/products/product_video_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/products/sku_spec.rb +21 -0
- data/spec/bigcommerce/unit/resources/resource_spec.rb +4 -0
- data/spec/bigcommerce/unit/resources/store_info/store_information_spec.rb +12 -0
- data/spec/bigcommerce/unit/resources/system/time_spec.rb +12 -0
- data/spec/bigcommerce/unit/version_spec.rb +7 -0
- data/spec/spec_helper.rb +9 -25
- metadata +203 -127
- data/lib/big_commerce.rb +0 -1
- data/lib/bigcommerce/api.rb +0 -473
- data/lib/bigcommerce/connection.rb +0 -171
- data/lib/bigcommerce/product.rb +0 -13
- data/lib/bigcommerce/resource.rb +0 -50
- data/spec/big_commerce_spec.rb +0 -9
- data/spec/integration/orders_spec.rb +0 -18
- data/spec/support/integration_context.rb +0 -13
- data/spec/support/mock_api_context.rb +0 -10
- data/spec/unit/api_request_spec.rb +0 -34
- data/spec/unit/api_spec.rb +0 -49
- data/spec/unit/connection_spec.rb +0 -23
- data/spec/unit/date_time_spec.rb +0 -31
- data/spec/unit/version_spec.rb +0 -13
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
|
|
3
|
+
Bigcommerce.configure do |config|
|
|
4
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
5
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
6
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
@product = Bigcommerce::Product.all[0]
|
|
10
|
+
|
|
11
|
+
# List product reviews
|
|
12
|
+
puts Bigcommerce::ProductReview.all(@product.id)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
|
|
3
|
+
Bigcommerce.configure do |config|
|
|
4
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
5
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
6
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
@product = Bigcommerce::Product.all[0]
|
|
10
|
+
|
|
11
|
+
# List product rules
|
|
12
|
+
@product_rules = Bigcommerce::ProductRule.all(@product.id)
|
|
13
|
+
puts @product_rules
|
|
14
|
+
|
|
15
|
+
# Get a count of product rules
|
|
16
|
+
puts Bigcommerce::ProductRule.count(@product.id)
|
|
17
|
+
|
|
18
|
+
# Get a count of all product rules for all products
|
|
19
|
+
puts Bigcommerce::ProductRule.count_all
|
|
20
|
+
|
|
21
|
+
# Create a product rule
|
|
22
|
+
@product_rule = Bigcommerce::ProductRule.create(
|
|
23
|
+
@product.id,
|
|
24
|
+
conditions: [
|
|
25
|
+
{
|
|
26
|
+
product_option_id: 95,
|
|
27
|
+
option_value_id: 13,
|
|
28
|
+
sku_id: nil
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
)
|
|
32
|
+
puts @product_rule
|
|
33
|
+
|
|
34
|
+
# Get a product rule
|
|
35
|
+
puts Bigcommerce::ProductRule.find(@product.id, @product_rule.id)
|
|
36
|
+
|
|
37
|
+
# Update a product rule
|
|
38
|
+
puts Bigcommerce::ProductRule.update(
|
|
39
|
+
@product.id,
|
|
40
|
+
@product_rule.id,
|
|
41
|
+
conditions: [
|
|
42
|
+
{
|
|
43
|
+
product_option_id: 95,
|
|
44
|
+
option_value_id: 12,
|
|
45
|
+
sku_id: nil
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# Delete a product rule
|
|
51
|
+
puts Bigcommerce::ProductRule.destroy(@product.id, @product_rule.id)
|
|
52
|
+
|
|
53
|
+
# Delete all product rules
|
|
54
|
+
# puts Bigcommerce::ProductRule.destroy_all(@product.id)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
|
|
3
|
+
Bigcommerce.configure do |config|
|
|
4
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
5
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
6
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
@product = Bigcommerce::Product.all[0]
|
|
10
|
+
|
|
11
|
+
# Create a product video
|
|
12
|
+
@product_video = Bigcommerce::ProductVideo.create(
|
|
13
|
+
@product.id,
|
|
14
|
+
url: 'https://www.youtube.com/watch?v=T9RFb8xXZlk'
|
|
15
|
+
)
|
|
16
|
+
puts @product_video
|
|
17
|
+
|
|
18
|
+
# List product videos
|
|
19
|
+
@product_videos = Bigcommerce::ProductVideo.all(@product.id)
|
|
20
|
+
puts @product_videos
|
|
21
|
+
|
|
22
|
+
# Get a count of product videos
|
|
23
|
+
puts Bigcommerce::ProductVideo.count(@product.id)
|
|
24
|
+
|
|
25
|
+
# Get a count of all product videos for all products
|
|
26
|
+
puts Bigcommerce::ProductVideo.count_all
|
|
27
|
+
|
|
28
|
+
# Get a product video
|
|
29
|
+
puts Bigcommerce::ProductVideo.find(@product.id, @product_video.id)
|
|
30
|
+
|
|
31
|
+
# Update a product video
|
|
32
|
+
# TODO
|
|
33
|
+
# puts Bigcommerce::ProductVideo.update(
|
|
34
|
+
# @product.id,
|
|
35
|
+
# @product_video.id,
|
|
36
|
+
# url: 'https://www.youtube.com/watch?v=LXgTp40Y3zo'
|
|
37
|
+
# )
|
|
38
|
+
|
|
39
|
+
# Delete a product video
|
|
40
|
+
# TODO
|
|
41
|
+
# puts Bigcommerce::ProductVideo.destroy(@product.id, product_video.id)
|
|
42
|
+
|
|
43
|
+
# Delete all product videos
|
|
44
|
+
# TODO
|
|
45
|
+
# puts Bigcommerce::ProductVideo.destroy_all(@product.id)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
require 'securerandom'
|
|
3
|
+
|
|
4
|
+
Bigcommerce.configure do |config|
|
|
5
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
6
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
7
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
@product = Bigcommerce::Product.all[0]
|
|
11
|
+
|
|
12
|
+
# Create a product sku
|
|
13
|
+
@sku = Bigcommerce::Sku.create(
|
|
14
|
+
@product.id,
|
|
15
|
+
sku: SecureRandom.hex,
|
|
16
|
+
options: [
|
|
17
|
+
product_option_id: 95,
|
|
18
|
+
option_value_id: 10
|
|
19
|
+
]
|
|
20
|
+
)
|
|
21
|
+
puts @sku
|
|
22
|
+
|
|
23
|
+
# List product skus
|
|
24
|
+
@skus = Bigcommerce::Sku.all(@product.id)
|
|
25
|
+
puts @skus
|
|
26
|
+
|
|
27
|
+
# Get a count of product skus
|
|
28
|
+
puts Bigcommerce::Sku.count
|
|
29
|
+
|
|
30
|
+
# Get a product sku
|
|
31
|
+
puts Bigcommerce::Sku.find(@product.id, @sku.id)
|
|
32
|
+
|
|
33
|
+
# Update a product sku
|
|
34
|
+
puts Bigcommerce::Sku.update(
|
|
35
|
+
@product.id,
|
|
36
|
+
@sku.id,
|
|
37
|
+
sku: SecureRandom.hex,
|
|
38
|
+
options: [
|
|
39
|
+
product_option_id: 95,
|
|
40
|
+
option_value_id: 7
|
|
41
|
+
]
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Delete a product image
|
|
45
|
+
puts Bigcommerce::Sku.destroy(@product.id, @sku.id)
|
|
46
|
+
|
|
47
|
+
# Delete all product skus
|
|
48
|
+
# puts Bigcommerce::Sku.destroy_all(@product.id)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
|
|
3
|
+
Bigcommerce.configure do |config|
|
|
4
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
5
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
6
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# List shipping methods
|
|
10
|
+
puts Bigcommerce::ShippingMethod.all
|
|
11
|
+
|
|
12
|
+
# Get a shipping method
|
|
13
|
+
puts Bigcommerce::ShippingMethod.find(1)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
|
|
3
|
+
Bigcommerce.configure do |config|
|
|
4
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
5
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
6
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# List tax classes
|
|
10
|
+
puts Bigcommerce::TaxClass.all
|
|
11
|
+
|
|
12
|
+
# Get a tax classes
|
|
13
|
+
puts Bigcommerce::TaxClass.find(1)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'bigcommerce'
|
|
2
|
+
|
|
3
|
+
Bigcommerce.configure do |config|
|
|
4
|
+
config.store_hash = ENV['BC_STORE_HASH']
|
|
5
|
+
config.client_id = ENV['BC_CLIENT_ID']
|
|
6
|
+
config.access_token = ENV['BC_ACCESS_TOKEN']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# List all webhooks
|
|
10
|
+
puts Bigcommerce::Webhook.all
|
|
11
|
+
|
|
12
|
+
# Get a webhook
|
|
13
|
+
puts Bigcommerce::Webhook.find(1)
|
|
14
|
+
|
|
15
|
+
# Create a webhook
|
|
16
|
+
@webhook = Bigcommerce::Webhook.create(
|
|
17
|
+
scope: 'store/order/*',
|
|
18
|
+
destination: 'https://app.example.com/orders'
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Update a webhook
|
|
22
|
+
puts Bigcommerce::Webhook.update(
|
|
23
|
+
@webhook.id,
|
|
24
|
+
scope: 'store/order/*',
|
|
25
|
+
destination: 'https://app.example.com/products'
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
# Delete a webhook
|
|
29
|
+
puts Bigcommerce::Webhook.destroy(@webhook.id)
|
data/lib/bigcommerce.rb
CHANGED
|
@@ -1,9 +1,51 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
3
|
-
require 'rest-client'
|
|
4
|
-
require "uri"
|
|
5
|
-
require 'bigcommerce/api'
|
|
6
|
-
require 'bigcommerce/connection'
|
|
1
|
+
require 'hashie'
|
|
2
|
+
require 'faraday_middleware'
|
|
7
3
|
require 'bigcommerce/version'
|
|
8
|
-
require 'bigcommerce/
|
|
9
|
-
require 'bigcommerce/
|
|
4
|
+
require 'bigcommerce/middleware/auth'
|
|
5
|
+
require 'bigcommerce/middleware/http_exception'
|
|
6
|
+
require 'bigcommerce/resources/resource'
|
|
7
|
+
|
|
8
|
+
module Bigcommerce
|
|
9
|
+
resources = File.join(File.dirname(__FILE__), 'bigcommerce', 'resources', '**', '*.rb')
|
|
10
|
+
Dir.glob(resources, &method(:require))
|
|
11
|
+
|
|
12
|
+
DEFAULTS = {
|
|
13
|
+
base_url: 'https://api.bigcommerce.com'
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
HEADERS = {
|
|
17
|
+
'accept' => 'application/json',
|
|
18
|
+
'content-type' => 'application/json',
|
|
19
|
+
'user-agent' => 'bigcommerce-api-ruby'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
attr_reader :api
|
|
24
|
+
attr_accessor :api_limit
|
|
25
|
+
|
|
26
|
+
def configure
|
|
27
|
+
config = Hashie::Mash.new
|
|
28
|
+
yield(config)
|
|
29
|
+
ssl_options = config.ssl if config.auth == 'legacy'
|
|
30
|
+
|
|
31
|
+
@api = Faraday.new(url: build_url(config), ssl: ssl_options) do |conn|
|
|
32
|
+
conn.request :json
|
|
33
|
+
conn.headers = HEADERS
|
|
34
|
+
if config.auth == 'legacy'
|
|
35
|
+
conn.use Faraday::Request::BasicAuthentication, config.username, config.api_key
|
|
36
|
+
else
|
|
37
|
+
conn.use Bigcommerce::Middleware::Auth, config
|
|
38
|
+
end
|
|
39
|
+
conn.use Bigcommerce::Middleware::HttpException
|
|
40
|
+
conn.adapter Faraday.default_adapter
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def build_url(config)
|
|
45
|
+
return config.url if config.auth == 'legacy'
|
|
46
|
+
|
|
47
|
+
base = ENV['BC_API_ENDPOINT'].nil? ? DEFAULTS[:base_url] : ENV['BC_API_ENDPOINT']
|
|
48
|
+
"#{base}/stores/#{config.store_hash}/v2"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Bigcommerce
|
|
2
|
+
class HttpError < StandardError
|
|
3
|
+
attr_accessor :response_headers
|
|
4
|
+
def initialize(headers)
|
|
5
|
+
@response_headers = headers
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class BadRequest < HttpError; end
|
|
10
|
+
class Unauthorized < HttpError; end
|
|
11
|
+
class Forbidden < HttpError; end
|
|
12
|
+
class NotFound < HttpError; end
|
|
13
|
+
class MethodNotAllowed < HttpError; end
|
|
14
|
+
class NotAccepted < HttpError; end
|
|
15
|
+
class TimeOut < HttpError; end
|
|
16
|
+
class ResourceConflict < HttpError; end
|
|
17
|
+
class TooManyRequests < HttpError; end
|
|
18
|
+
class InternalServerError < HttpError; end
|
|
19
|
+
class BadGateway < HttpError; end
|
|
20
|
+
class ServiceUnavailable < HttpError; end
|
|
21
|
+
class GatewayTimeout < HttpError; end
|
|
22
|
+
class BandwidthLimitExceeded < HttpError; end
|
|
23
|
+
|
|
24
|
+
module HttpErrors
|
|
25
|
+
ERRORS = {
|
|
26
|
+
400 => Bigcommerce::BadRequest,
|
|
27
|
+
401 => Bigcommerce::Unauthorized,
|
|
28
|
+
403 => Bigcommerce::Forbidden,
|
|
29
|
+
404 => Bigcommerce::NotFound,
|
|
30
|
+
405 => Bigcommerce::MethodNotAllowed,
|
|
31
|
+
406 => Bigcommerce::NotAccepted,
|
|
32
|
+
408 => Bigcommerce::TimeOut,
|
|
33
|
+
409 => Bigcommerce::ResourceConflict,
|
|
34
|
+
429 => Bigcommerce::TooManyRequests,
|
|
35
|
+
500 => Bigcommerce::InternalServerError,
|
|
36
|
+
502 => Bigcommerce::BadGateway,
|
|
37
|
+
503 => Bigcommerce::ServiceUnavailable,
|
|
38
|
+
504 => Bigcommerce::GatewayTimeout,
|
|
39
|
+
509 => Bigcommerce::BandwidthLimitExceeded
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
def throw_http_exception!(code, env)
|
|
43
|
+
return unless ERRORS.keys.include? code
|
|
44
|
+
error_hash = env.body.empty? ? {} : JSON.parse(env.body, symbolize_names: true)
|
|
45
|
+
unless env[:response_headers]['X-Retry-After'].nil?
|
|
46
|
+
error_hash[:retry_after] = env[:response_headers]['X-Retry-After'].to_i
|
|
47
|
+
end
|
|
48
|
+
fail ERRORS[code].new(error_hash), env.body
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Bigcommerce
|
|
2
|
+
module Middleware
|
|
3
|
+
class Auth < Faraday::Middleware
|
|
4
|
+
def initialize(app, options = {})
|
|
5
|
+
@app = app
|
|
6
|
+
@options = options
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
env[:request_headers]['X-Auth-Client'] = @options[:client_id]
|
|
11
|
+
env[:request_headers]['X-Auth-Token'] = @options[:access_token]
|
|
12
|
+
@app.call env
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'bigcommerce/exception'
|
|
2
|
+
|
|
3
|
+
module Bigcommerce
|
|
4
|
+
module Middleware
|
|
5
|
+
class HttpException < Faraday::Response::Middleware
|
|
6
|
+
include Bigcommerce::HttpErrors
|
|
7
|
+
|
|
8
|
+
def on_complete(env)
|
|
9
|
+
throw_http_exception! env[:status].to_i, env
|
|
10
|
+
env
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
module Bigcommerce
|
|
4
|
+
class PathBuilder
|
|
5
|
+
attr_reader :uri
|
|
6
|
+
|
|
7
|
+
def initialize(uri)
|
|
8
|
+
@uri = uri
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# This takes the @uri and inserts the keys to form a path.
|
|
12
|
+
# To start we make sure that for nil/numeric values, we wrap those into an
|
|
13
|
+
# array. We then scan the string for %d and %s to find the number of times
|
|
14
|
+
# we possibly need to insert keys into the URI. Next, we check the size of
|
|
15
|
+
# the keys array, if the keys size is less than the number of possible keys
|
|
16
|
+
# in the URI, we will remove the trailing %d or %s, then remove the
|
|
17
|
+
# trailing /. We then pass the keys into the uri to form the path.
|
|
18
|
+
# ex. foo/%d/bar/%d => foo/1/bar/2
|
|
19
|
+
def build(keys = [])
|
|
20
|
+
keys = [] if keys.nil?
|
|
21
|
+
keys = [keys] if keys.is_a? Numeric
|
|
22
|
+
ids = uri.scan('%d').count + uri.scan('%s').count
|
|
23
|
+
str = ids > keys.size ? uri.chomp('%d').chomp('%s').chomp('/') : uri
|
|
24
|
+
(str % keys).chomp('/')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def to_s
|
|
28
|
+
@uri
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class Request < Module
|
|
33
|
+
def initialize(uri)
|
|
34
|
+
@uri = uri
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def included(base)
|
|
38
|
+
base.extend ClassMethods
|
|
39
|
+
path_builder = PathBuilder.new @uri
|
|
40
|
+
base.define_singleton_method :path do
|
|
41
|
+
path_builder
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
module ClassMethods
|
|
46
|
+
def get(path, params = nil)
|
|
47
|
+
response = raw_request(:get, path, params)
|
|
48
|
+
build_response_object response
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def delete(path)
|
|
52
|
+
response = raw_request(:delete, path)
|
|
53
|
+
response.body
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def post(path, params)
|
|
57
|
+
response = raw_request(:post, path, params)
|
|
58
|
+
build_response_object response
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def put(path, params)
|
|
62
|
+
response = raw_request(:put, path, params)
|
|
63
|
+
build_response_object response
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def raw_request(method, path, params = nil)
|
|
67
|
+
response = Bigcommerce.api.send(method, path.to_s, params)
|
|
68
|
+
Bigcommerce.api_limit = response.headers['X-BC-ApiLimit-Remaining']
|
|
69
|
+
response
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def build_response_object(response)
|
|
75
|
+
json = parse response.body
|
|
76
|
+
if json.is_a? Array
|
|
77
|
+
json.map { |obj| new obj }
|
|
78
|
+
else
|
|
79
|
+
new json
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def parse(json)
|
|
84
|
+
return [] if json.empty?
|
|
85
|
+
JSON.parse(json, symbolize_names: true)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|