duodealer_api 1.0.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 +7 -0
- data/.document +5 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +8 -0
- data/.travis.yml +23 -0
- data/Gemfile +5 -0
- data/Gemfile_ar41 +5 -0
- data/Gemfile_ar50 +5 -0
- data/Gemfile_ar51 +5 -0
- data/Gemfile_ar_master +5 -0
- data/RELEASING +13 -0
- data/Rakefile +44 -0
- data/docker-compose.yml +13 -0
- data/docs/graphql.md +191 -0
- data/duodealer_api.gemspec +38 -0
- data/lib/active_resource/connection_ext.rb +10 -0
- data/lib/active_resource/detailed_log_subscriber.rb +52 -0
- data/lib/active_resource/json_errors.rb +31 -0
- data/lib/duodealer_api.rb +33 -0
- data/lib/duodealer_api/api_version.rb +205 -0
- data/lib/duodealer_api/connection.rb +35 -0
- data/lib/duodealer_api/countable.rb +14 -0
- data/lib/duodealer_api/disable_prefix_check.rb +31 -0
- data/lib/duodealer_api/events.rb +7 -0
- data/lib/duodealer_api/graphql.rb +79 -0
- data/lib/duodealer_api/graphql/http_client.rb +22 -0
- data/lib/duodealer_api/graphql/railtie.rb +17 -0
- data/lib/duodealer_api/graphql/task.rake +97 -0
- data/lib/duodealer_api/limits.rb +76 -0
- data/lib/duodealer_api/message_enricher.rb +23 -0
- data/lib/duodealer_api/meta.rb +15 -0
- data/lib/duodealer_api/metafields.rb +20 -0
- data/lib/duodealer_api/paginated_collection.rb +69 -0
- data/lib/duodealer_api/pagination_link_headers.rb +33 -0
- data/lib/duodealer_api/resources.rb +3 -0
- data/lib/duodealer_api/resources/abandoned_checkout.rb +7 -0
- data/lib/duodealer_api/resources/access_scope.rb +10 -0
- data/lib/duodealer_api/resources/access_token.rb +8 -0
- data/lib/duodealer_api/resources/address.rb +4 -0
- data/lib/duodealer_api/resources/announcement.rb +4 -0
- data/lib/duodealer_api/resources/api_permission.rb +9 -0
- data/lib/duodealer_api/resources/application_charge.rb +15 -0
- data/lib/duodealer_api/resources/application_credit.rb +4 -0
- data/lib/duodealer_api/resources/array_base.rb +13 -0
- data/lib/duodealer_api/resources/article.rb +21 -0
- data/lib/duodealer_api/resources/asset.rb +100 -0
- data/lib/duodealer_api/resources/assigned_fulfillment_order.rb +16 -0
- data/lib/duodealer_api/resources/base.rb +162 -0
- data/lib/duodealer_api/resources/billing_address.rb +4 -0
- data/lib/duodealer_api/resources/blog.rb +10 -0
- data/lib/duodealer_api/resources/carrier_service.rb +4 -0
- data/lib/duodealer_api/resources/cart.rb +4 -0
- data/lib/duodealer_api/resources/checkout.rb +30 -0
- data/lib/duodealer_api/resources/collect.rb +6 -0
- data/lib/duodealer_api/resources/collection.rb +14 -0
- data/lib/duodealer_api/resources/collection_listing.rb +18 -0
- data/lib/duodealer_api/resources/collection_publication.rb +10 -0
- data/lib/duodealer_api/resources/comment.rb +9 -0
- data/lib/duodealer_api/resources/country.rb +4 -0
- data/lib/duodealer_api/resources/currency.rb +6 -0
- data/lib/duodealer_api/resources/custom_collection.rb +19 -0
- data/lib/duodealer_api/resources/customer.rb +29 -0
- data/lib/duodealer_api/resources/customer_group.rb +5 -0
- data/lib/duodealer_api/resources/customer_invite.rb +4 -0
- data/lib/duodealer_api/resources/customer_saved_search.rb +11 -0
- data/lib/duodealer_api/resources/discount_code.rb +9 -0
- data/lib/duodealer_api/resources/draft_order.rb +14 -0
- data/lib/duodealer_api/resources/draft_order_invoice.rb +4 -0
- data/lib/duodealer_api/resources/event.rb +8 -0
- data/lib/duodealer_api/resources/fulfillment.rb +47 -0
- data/lib/duodealer_api/resources/fulfillment_event.rb +15 -0
- data/lib/duodealer_api/resources/fulfillment_order.rb +137 -0
- data/lib/duodealer_api/resources/fulfillment_order_locations_for_move.rb +4 -0
- data/lib/duodealer_api/resources/fulfillment_request.rb +15 -0
- data/lib/duodealer_api/resources/fulfillment_service.rb +4 -0
- data/lib/duodealer_api/resources/fulfillment_v2.rb +20 -0
- data/lib/duodealer_api/resources/gift_card.rb +7 -0
- data/lib/duodealer_api/resources/image.rb +16 -0
- data/lib/duodealer_api/resources/inventory_item.rb +6 -0
- data/lib/duodealer_api/resources/inventory_level.rb +55 -0
- data/lib/duodealer_api/resources/line_item.rb +14 -0
- data/lib/duodealer_api/resources/location.rb +8 -0
- data/lib/duodealer_api/resources/marketing_event.rb +10 -0
- data/lib/duodealer_api/resources/metafield.rb +13 -0
- data/lib/duodealer_api/resources/note_attribute.rb +4 -0
- data/lib/duodealer_api/resources/option.rb +4 -0
- data/lib/duodealer_api/resources/order.rb +43 -0
- data/lib/duodealer_api/resources/order_risk.rb +8 -0
- data/lib/duodealer_api/resources/page.rb +6 -0
- data/lib/duodealer_api/resources/payment.rb +7 -0
- data/lib/duodealer_api/resources/payment_details.rb +4 -0
- data/lib/duodealer_api/resources/ping.rb +3 -0
- data/lib/duodealer_api/resources/policy.rb +7 -0
- data/lib/duodealer_api/resources/price_rule.rb +8 -0
- data/lib/duodealer_api/resources/product.rb +35 -0
- data/lib/duodealer_api/resources/product_listing.rb +16 -0
- data/lib/duodealer_api/resources/product_publication.rb +10 -0
- data/lib/duodealer_api/resources/province.rb +5 -0
- data/lib/duodealer_api/resources/publication.rb +5 -0
- data/lib/duodealer_api/resources/receipt.rb +4 -0
- data/lib/duodealer_api/resources/recurring_application_charge.rb +31 -0
- data/lib/duodealer_api/resources/redirect.rb +4 -0
- data/lib/duodealer_api/resources/refund.rb +14 -0
- data/lib/duodealer_api/resources/report.rb +4 -0
- data/lib/duodealer_api/resources/resource_feedback.rb +19 -0
- data/lib/duodealer_api/resources/rule.rb +4 -0
- data/lib/duodealer_api/resources/script_tag.rb +4 -0
- data/lib/duodealer_api/resources/shipping_address.rb +4 -0
- data/lib/duodealer_api/resources/shipping_line.rb +4 -0
- data/lib/duodealer_api/resources/shipping_rate.rb +7 -0
- data/lib/duodealer_api/resources/shipping_zone.rb +4 -0
- data/lib/duodealer_api/resources/shop.rb +25 -0
- data/lib/duodealer_api/resources/smart_collection.rb +19 -0
- data/lib/duodealer_api/resources/storefront_access_token.rb +4 -0
- data/lib/duodealer_api/resources/tax_line.rb +4 -0
- data/lib/duodealer_api/resources/tax_service.rb +4 -0
- data/lib/duodealer_api/resources/tender_transaction.rb +6 -0
- data/lib/duodealer_api/resources/theme.rb +4 -0
- data/lib/duodealer_api/resources/transaction.rb +5 -0
- data/lib/duodealer_api/resources/usage_charge.rb +5 -0
- data/lib/duodealer_api/resources/user.rb +4 -0
- data/lib/duodealer_api/resources/variant.rb +8 -0
- data/lib/duodealer_api/resources/webhook.rb +4 -0
- data/lib/duodealer_api/session.rb +171 -0
- data/lib/duodealer_api/version.rb +3 -0
- data/shipit.rubygems.yml +1 -0
- data/test/abandoned_checkouts_test.rb +29 -0
- data/test/access_scope_test.rb +23 -0
- data/test/access_token_test.rb +19 -0
- data/test/active_resource/json_errors_test.rb +19 -0
- data/test/api_permission_test.rb +9 -0
- data/test/api_version_test.rb +157 -0
- data/test/application_charge_test.rb +79 -0
- data/test/application_credit_test.rb +35 -0
- data/test/article_test.rb +73 -0
- data/test/asset_test.rb +18 -0
- data/test/assigned_fulfillment_order_test.rb +77 -0
- data/test/base_test.rb +198 -0
- data/test/blog_test.rb +8 -0
- data/test/carrier_service_test.rb +17 -0
- data/test/cart_test.rb +13 -0
- data/test/checkouts_test.rb +77 -0
- data/test/collect_test.rb +9 -0
- data/test/collection_listing_test.rb +79 -0
- data/test/collection_publication_test.rb +40 -0
- data/test/collection_test.rb +49 -0
- data/test/countable_test.rb +13 -0
- data/test/currency_test.rb +21 -0
- data/test/custom_collection_test.rb +9 -0
- data/test/customer_saved_search_test.rb +27 -0
- data/test/customer_test.rb +50 -0
- data/test/detailed_log_subscriber_test.rb +139 -0
- data/test/discount_code_test.rb +53 -0
- data/test/draft_order_test.rb +151 -0
- data/test/fixtures/abandoned_checkout.json +184 -0
- data/test/fixtures/abandoned_checkouts.json +186 -0
- data/test/fixtures/access_scopes.json +10 -0
- data/test/fixtures/access_token_delegate.json +4 -0
- data/test/fixtures/api_versions.json +38 -0
- data/test/fixtures/apis.json +42 -0
- data/test/fixtures/application_charge.json +16 -0
- data/test/fixtures/application_charges.json +57 -0
- data/test/fixtures/application_credit.json +12 -0
- data/test/fixtures/application_credits.json +24 -0
- data/test/fixtures/article.json +15 -0
- data/test/fixtures/articles.json +39 -0
- data/test/fixtures/asset.json +9 -0
- data/test/fixtures/assets.json +136 -0
- data/test/fixtures/assigned_fulfillment_orders.json +78 -0
- data/test/fixtures/authors.json +1 -0
- data/test/fixtures/blog.json +13 -0
- data/test/fixtures/blogs.json +13 -0
- data/test/fixtures/carrier_service.json +9 -0
- data/test/fixtures/carts.json +43 -0
- data/test/fixtures/checkout.json +160 -0
- data/test/fixtures/checkouts.json +162 -0
- data/test/fixtures/collect.json +12 -0
- data/test/fixtures/collection.json +17 -0
- data/test/fixtures/collection_listing.json +11 -0
- data/test/fixtures/collection_listing_product_ids.json +1 -0
- data/test/fixtures/collection_listing_product_ids2.json +1 -0
- data/test/fixtures/collection_listings.json +13 -0
- data/test/fixtures/collection_products.json +47 -0
- data/test/fixtures/collection_publication.json +11 -0
- data/test/fixtures/collection_publications.json +13 -0
- data/test/fixtures/currencies.json +25 -0
- data/test/fixtures/custom_collection.json +17 -0
- data/test/fixtures/customer_invite.json +9 -0
- data/test/fixtures/customer_saved_search.json +9 -0
- data/test/fixtures/customer_saved_search_customers.json +60 -0
- data/test/fixtures/customers.json +59 -0
- data/test/fixtures/customers_account_activation_url.json +3 -0
- data/test/fixtures/customers_search.json +60 -0
- data/test/fixtures/discount_code.json +10 -0
- data/test/fixtures/discount_codes.json +12 -0
- data/test/fixtures/draft_order.json +159 -0
- data/test/fixtures/draft_order_completed.json +159 -0
- data/test/fixtures/draft_order_invoice.json +9 -0
- data/test/fixtures/draft_orders.json +161 -0
- data/test/fixtures/engagement.json +15 -0
- data/test/fixtures/events.json +31 -0
- data/test/fixtures/fulfillment.json +49 -0
- data/test/fixtures/fulfillment_event.json +12 -0
- data/test/fixtures/fulfillment_order.json +38 -0
- data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
- data/test/fixtures/fulfillment_orders.json +78 -0
- data/test/fixtures/fulfillment_request.json +28 -0
- data/test/fixtures/fulfillment_service.json +10 -0
- data/test/fixtures/fulfillments.json +53 -0
- data/test/fixtures/gift_card.json +20 -0
- data/test/fixtures/gift_card_disabled.json +20 -0
- data/test/fixtures/graphql/2019-10.json +1083 -0
- data/test/fixtures/graphql/dummy_schema.rb +16 -0
- data/test/fixtures/graphql/unstable.json +1083 -0
- data/test/fixtures/image.json +10 -0
- data/test/fixtures/images.json +20 -0
- data/test/fixtures/inventory_level.json +7 -0
- data/test/fixtures/inventory_levels.json +24 -0
- data/test/fixtures/marketing_event.json +28 -0
- data/test/fixtures/marketing_events.json +54 -0
- data/test/fixtures/metafield.json +12 -0
- data/test/fixtures/metafields.json +34 -0
- data/test/fixtures/order.json +297 -0
- data/test/fixtures/order_risk.json +14 -0
- data/test/fixtures/order_risks.json +28 -0
- data/test/fixtures/order_with_properties.json +373 -0
- data/test/fixtures/orders.json +299 -0
- data/test/fixtures/payment.json +7 -0
- data/test/fixtures/payments.json +9 -0
- data/test/fixtures/ping/conversation.json +1 -0
- data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
- data/test/fixtures/ping/message.json +1 -0
- data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
- data/test/fixtures/policies.json +8 -0
- data/test/fixtures/price_rule.json +27 -0
- data/test/fixtures/price_rules.json +28 -0
- data/test/fixtures/product.json +116 -0
- data/test/fixtures/product_listing.json +86 -0
- data/test/fixtures/product_listing_product_ids.json +1 -0
- data/test/fixtures/product_listing_product_ids2.json +1 -0
- data/test/fixtures/product_listings.json +174 -0
- data/test/fixtures/product_publication.json +11 -0
- data/test/fixtures/product_publications.json +13 -0
- data/test/fixtures/publications.json +9 -0
- data/test/fixtures/recurring_application_charge.json +22 -0
- data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
- data/test/fixtures/recurring_application_charges.json +106 -0
- data/test/fixtures/redirect.json +7 -0
- data/test/fixtures/refund.json +112 -0
- data/test/fixtures/report.json +9 -0
- data/test/fixtures/reports.json +11 -0
- data/test/fixtures/script_tag.json +10 -0
- data/test/fixtures/script_tags.json +18 -0
- data/test/fixtures/shipping_rates.json +12 -0
- data/test/fixtures/shipping_zones.json +315 -0
- data/test/fixtures/shop.json +26 -0
- data/test/fixtures/smart_collection.json +21 -0
- data/test/fixtures/smart_collection_products.json +155 -0
- data/test/fixtures/storefront_access_token.json +9 -0
- data/test/fixtures/storefront_access_tokens.json +18 -0
- data/test/fixtures/tags.json +1 -0
- data/test/fixtures/tax_service.json +9 -0
- data/test/fixtures/tender_transactions.json +52 -0
- data/test/fixtures/transaction.json +29 -0
- data/test/fixtures/usage_charge.json +11 -0
- data/test/fixtures/usage_charges.json +23 -0
- data/test/fixtures/user.json +21 -0
- data/test/fixtures/users.json +42 -0
- data/test/fixtures/variant.json +23 -0
- data/test/fixtures/variants.json +88 -0
- data/test/fixtures/webhook.json +10 -0
- data/test/fixtures/webhooks.json +18 -0
- data/test/fulfillment_event_test.rb +69 -0
- data/test/fulfillment_order_test.rb +462 -0
- data/test/fulfillment_order_test_helper.rb +7 -0
- data/test/fulfillment_request_test.rb +33 -0
- data/test/fulfillment_service_test.rb +17 -0
- data/test/fulfillment_test.rb +224 -0
- data/test/fulfillment_v2_test.rb +62 -0
- data/test/gift_card_test.rb +22 -0
- data/test/graphql/http_client_test.rb +26 -0
- data/test/graphql_test.rb +147 -0
- data/test/image_test.rb +39 -0
- data/test/inventory_level_test.rb +59 -0
- data/test/lib/webmock_extensions/last_request.rb +16 -0
- data/test/limits_test.rb +38 -0
- data/test/location_test.rb +14 -0
- data/test/marketing_event_test.rb +68 -0
- data/test/message_enricher_test.rb +45 -0
- data/test/meta_test.rb +49 -0
- data/test/metafield_test.rb +46 -0
- data/test/order_risk_test.rb +46 -0
- data/test/order_test.rb +125 -0
- data/test/pagination_test.rb +257 -0
- data/test/payment_test.rb +19 -0
- data/test/policy_test.rb +19 -0
- data/test/price_rule_test.rb +65 -0
- data/test/product_listing_test.rb +97 -0
- data/test/product_publication_test.rb +40 -0
- data/test/product_test.rb +60 -0
- data/test/publication_test.rb +12 -0
- data/test/recurring_application_charge_test.rb +142 -0
- data/test/redirect_test.rb +9 -0
- data/test/refund_test.rb +32 -0
- data/test/report_test.rb +35 -0
- data/test/resource_feedback_test.rb +42 -0
- data/test/script_tag_test.rb +30 -0
- data/test/session_test.rb +366 -0
- data/test/shipping_rate_test.rb +17 -0
- data/test/shipping_zone_test.rb +10 -0
- data/test/shop_test.rb +68 -0
- data/test/smart_collection_test.rb +35 -0
- data/test/storefront_access_token_test.rb +32 -0
- data/test/tax_service_test.rb +9 -0
- data/test/tender_transaction_test.rb +18 -0
- data/test/test_helper.rb +124 -0
- data/test/transaction_test.rb +17 -0
- data/test/usage_charge_test.rb +21 -0
- data/test/user_test.rb +17 -0
- data/test/variant_test.rb +46 -0
- data/test/webhook_test.rb +21 -0
- metadata +541 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module DuodealerAPI
|
|
2
|
+
class Article < Base
|
|
3
|
+
include Events
|
|
4
|
+
include Metafields
|
|
5
|
+
include DisablePrefixCheck
|
|
6
|
+
|
|
7
|
+
conditional_prefix :blog
|
|
8
|
+
|
|
9
|
+
def comments
|
|
10
|
+
Comment.find(:all, :params => { :article_id => id })
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.authors(options = {})
|
|
14
|
+
get(:authors, options)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.tags(options={})
|
|
18
|
+
get(:tags, options)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module DuodealerAPI
|
|
2
|
+
# Assets represent the files that comprise your theme.
|
|
3
|
+
# There are different buckets which hold different kinds
|
|
4
|
+
# of assets, each corresponding to one of the folders
|
|
5
|
+
# within a theme's zip file: "layout", "templates",
|
|
6
|
+
# "snippets", "assets", and "config". The full key of an
|
|
7
|
+
# asset always starts with the bucket name, and the path
|
|
8
|
+
# separator is a forward slash, like layout/theme.liquid
|
|
9
|
+
# or assets/bg-body.gif.
|
|
10
|
+
#
|
|
11
|
+
# Initialize with a key:
|
|
12
|
+
# asset = DuodealerAPI::Asset.new(:key => 'assets/special.css', :theme_id => 12345)
|
|
13
|
+
#
|
|
14
|
+
# Find by key:
|
|
15
|
+
# asset = DuodealerAPI::Asset.find('assets/image.png', :params => {:theme_id => 12345})
|
|
16
|
+
#
|
|
17
|
+
# Get the text or binary value:
|
|
18
|
+
# asset.value # decodes from attachment attribute if necessary
|
|
19
|
+
#
|
|
20
|
+
# You can provide new data for assets in a few different ways:
|
|
21
|
+
#
|
|
22
|
+
# * assign text data for the value directly:
|
|
23
|
+
# asset.value = "div.special {color:red;}"
|
|
24
|
+
#
|
|
25
|
+
# * provide binary data for the value:
|
|
26
|
+
# asset.attach(File.read('image.png'))
|
|
27
|
+
#
|
|
28
|
+
# * set a URL from which Duo Dealer will fetch the value:
|
|
29
|
+
# asset.src = "http://mysite.com/image.png"
|
|
30
|
+
#
|
|
31
|
+
# * set a source key of another of your assets from which
|
|
32
|
+
# the value will be copied:
|
|
33
|
+
# asset.source_key = "assets/another_image.png"
|
|
34
|
+
class Asset < Base
|
|
35
|
+
include DisablePrefixCheck
|
|
36
|
+
|
|
37
|
+
self.primary_key = 'key'
|
|
38
|
+
|
|
39
|
+
conditional_prefix :theme
|
|
40
|
+
|
|
41
|
+
def self.element_path(id, prefix_options = {}, query_options = nil) #:nodoc:
|
|
42
|
+
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
|
|
43
|
+
"#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# find an asset by key:
|
|
47
|
+
# DuodealerAPI::Asset.find('layout/theme.liquid', :params => { theme_id: 99 })
|
|
48
|
+
def self.find(*args)
|
|
49
|
+
if args[0].is_a?(Symbol)
|
|
50
|
+
super
|
|
51
|
+
else
|
|
52
|
+
params = { asset: { key: args[0] } }
|
|
53
|
+
params = params.merge(args[1][:params]) if args[1] && args[1][:params]
|
|
54
|
+
path_prefix = params[:theme_id] ? "themes/#{params[:theme_id]}/" : ""
|
|
55
|
+
resource = find(
|
|
56
|
+
:one,
|
|
57
|
+
from: api_version.construct_api_path("#{path_prefix}assets.#{format.extension}"),
|
|
58
|
+
params: params
|
|
59
|
+
)
|
|
60
|
+
resource.prefix_options[:theme_id] = params[:theme_id] if resource && params[:theme_id]
|
|
61
|
+
resource
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# For text assets, Duo Dealer returns the data in the 'value' attribute.
|
|
66
|
+
# For binary assets, the data is base-64-encoded and returned in the
|
|
67
|
+
# 'attachment' attribute. This accessor returns the data in both cases.
|
|
68
|
+
def value
|
|
69
|
+
attributes['value'] ||
|
|
70
|
+
(attributes['attachment'] ? Base64.decode64(attributes['attachment']) : nil)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def attach(data)
|
|
74
|
+
self.attachment = Base64.encode64(data)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def destroy
|
|
78
|
+
connection.delete(element_path(prefix_options.merge(:asset => {:key => key})), self.class.headers)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def new?
|
|
82
|
+
false
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def method_missing(method_symbol, *arguments) #:nodoc:
|
|
86
|
+
if %w{value= attachment= src= source_key=}.include?(method_symbol)
|
|
87
|
+
wipe_value_attributes
|
|
88
|
+
end
|
|
89
|
+
super
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
def wipe_value_attributes
|
|
95
|
+
%w{value attachment src source_key}.each do |attr|
|
|
96
|
+
attributes.delete(attr)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module DuodealerAPI
|
|
2
|
+
class AssignedFulfillmentOrder < Base
|
|
3
|
+
|
|
4
|
+
def initialize(attributes = {}, persisted = false)
|
|
5
|
+
DuodealerAPI::Base.version_validation!(FulfillmentOrder::MINIMUM_VERSION)
|
|
6
|
+
super(attributes, persisted)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.find(scope, *args)
|
|
10
|
+
DuodealerAPI::Base.version_validation!(FulfillmentOrder::MINIMUM_VERSION)
|
|
11
|
+
|
|
12
|
+
assigned_fulfillment_orders = super(scope, *args)
|
|
13
|
+
assigned_fulfillment_orders.map { |afo| FulfillmentOrder.new(afo.attributes) }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require 'duodealer_api/version'
|
|
2
|
+
|
|
3
|
+
module DuodealerAPI
|
|
4
|
+
class Base < ActiveResource::Base
|
|
5
|
+
class InvalidSessionError < StandardError; end
|
|
6
|
+
extend Countable
|
|
7
|
+
|
|
8
|
+
self.timeout = 90
|
|
9
|
+
self.include_root_in_json = false
|
|
10
|
+
self.headers['User-Agent'] = ["DuodealerAPI/#{DuodealerAPI::VERSION}",
|
|
11
|
+
"ActiveResource/#{ActiveResource::VERSION::STRING}",
|
|
12
|
+
"Ruby/#{RUBY_VERSION}"].join(' ')
|
|
13
|
+
|
|
14
|
+
self.collection_parser = DuodealerAPI::PaginatedCollection
|
|
15
|
+
|
|
16
|
+
def encode(options = {})
|
|
17
|
+
same = dup
|
|
18
|
+
same.attributes = {self.class.element_name => same.attributes} if self.class.format.extension == 'json'
|
|
19
|
+
|
|
20
|
+
same.send("to_#{self.class.format.extension}", options)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def as_json(options = nil)
|
|
24
|
+
root = options[:root] if options.try(:key?, :root)
|
|
25
|
+
if include_root_in_json
|
|
26
|
+
root = self.class.model_name.element if root == true
|
|
27
|
+
{ root => serializable_hash(options) }
|
|
28
|
+
else
|
|
29
|
+
serializable_hash(options)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class << self
|
|
34
|
+
threadsafe_attribute(:_api_version)
|
|
35
|
+
def headers
|
|
36
|
+
if _headers_defined?
|
|
37
|
+
_headers
|
|
38
|
+
elsif superclass != Object && superclass.headers
|
|
39
|
+
superclass.headers
|
|
40
|
+
else
|
|
41
|
+
_headers ||= {}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def activate_session(session)
|
|
46
|
+
raise InvalidSessionError.new("Session cannot be nil") if session.nil?
|
|
47
|
+
self.site = session.site
|
|
48
|
+
self.headers.merge!('X-DuoDealer-Access-Token' => session.token)
|
|
49
|
+
self.api_version = session.api_version
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def clear_session
|
|
53
|
+
self.site = nil
|
|
54
|
+
self.password = nil
|
|
55
|
+
self.user = nil
|
|
56
|
+
self.api_version = nil
|
|
57
|
+
self.headers.delete('X-DuoDealer-Access-Token')
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def api_version
|
|
61
|
+
if _api_version_defined?
|
|
62
|
+
_api_version
|
|
63
|
+
elsif superclass != Object && superclass.site
|
|
64
|
+
superclass.api_version.dup.freeze
|
|
65
|
+
else
|
|
66
|
+
ApiVersion::NullVersion
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def api_version=(version)
|
|
71
|
+
self._api_version = ApiVersion::NullVersion.matches?(version) ? ApiVersion::NullVersion : ApiVersion.find_version(version)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def prefix(options = {})
|
|
75
|
+
api_version.construct_api_path(resource_prefix(options))
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def prefix_source
|
|
79
|
+
''
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def resource_prefix(_options = {})
|
|
83
|
+
''
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Sets the \prefix for a resource's nested URL (e.g., <tt>prefix/collectionname/1.json</tt>).
|
|
87
|
+
# Default value is <tt>site.path</tt>.
|
|
88
|
+
def resource_prefix=(value)
|
|
89
|
+
@prefix_parameters = nil
|
|
90
|
+
|
|
91
|
+
resource_prefix_call = value.gsub(/:\w+/) { |key| "\#{URI.parser.escape options[#{key}].to_s}" }
|
|
92
|
+
|
|
93
|
+
silence_warnings do
|
|
94
|
+
# Redefine the new methods.
|
|
95
|
+
instance_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
|
96
|
+
def prefix_source() "#{value}" end
|
|
97
|
+
def resource_prefix(options={}) "#{resource_prefix_call}" end
|
|
98
|
+
RUBY_EVAL
|
|
99
|
+
end
|
|
100
|
+
rescue => e
|
|
101
|
+
logger&.error("Couldn't set prefix: #{e}\n #{code}")
|
|
102
|
+
raise
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def prefix=(value)
|
|
106
|
+
if value.start_with?('/admin')
|
|
107
|
+
raise ArgumentError, "'#{value}' can no longer start /admin/. Change to using resource_prefix="
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
warn(
|
|
111
|
+
'[DEPRECATED] DuodealerAPI::Base#prefix= is deprecated and will be removed in a future version. ' \
|
|
112
|
+
'Use `self.resource_prefix=` instead.'
|
|
113
|
+
)
|
|
114
|
+
self.resource_prefix = value
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
alias_method :set_prefix, :prefix=
|
|
118
|
+
|
|
119
|
+
def init_prefix(resource)
|
|
120
|
+
init_prefix_explicit(resource.to_s.pluralize, "#{resource}_id")
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def init_prefix_explicit(resource_type, resource_id)
|
|
124
|
+
self.resource_prefix = "#{resource_type}/:#{resource_id}/"
|
|
125
|
+
|
|
126
|
+
define_method resource_id.to_sym do
|
|
127
|
+
@prefix_options[resource_id]
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def early_july_pagination?
|
|
132
|
+
!!early_july_pagination
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def version_validation!(minimum_version)
|
|
136
|
+
available_in_version = DuodealerAPI::ApiVersion.find_version(minimum_version)
|
|
137
|
+
|
|
138
|
+
unless DuodealerAPI::Base.api_version >= available_in_version
|
|
139
|
+
raise NotImplementedError, "The minimum supported version is #{minimum_version}."
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
private
|
|
144
|
+
|
|
145
|
+
attr_accessor :early_july_pagination
|
|
146
|
+
|
|
147
|
+
def early_july_pagination_release!
|
|
148
|
+
self.early_july_pagination = true
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def persisted?
|
|
153
|
+
!id.nil?
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
private
|
|
157
|
+
|
|
158
|
+
def only_id
|
|
159
|
+
encode(:only => :id, :include => [], :methods => [])
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DuodealerAPI
|
|
4
|
+
class Checkout < Base
|
|
5
|
+
self.primary_key = :token
|
|
6
|
+
|
|
7
|
+
def self.headers
|
|
8
|
+
super.merge('X-DuoDealer-Checkout-Version' => '2016-09-06')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def complete
|
|
12
|
+
post(:complete)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def ready?
|
|
16
|
+
return false unless persisted?
|
|
17
|
+
|
|
18
|
+
reload
|
|
19
|
+
[200, 201].include?(DuodealerAPI::Base.connection.response.code.to_i)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def payments
|
|
23
|
+
Payment.find(:all, params: { checkout_id: id })
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def shipping_rates
|
|
27
|
+
ShippingRate.find(:all, params: { checkout_id: id })
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DuodealerAPI
|
|
4
|
+
class Collection < Base
|
|
5
|
+
include Events
|
|
6
|
+
include Metafields
|
|
7
|
+
|
|
8
|
+
def products(options = {})
|
|
9
|
+
available_in_version = DuodealerAPI::ApiVersion.find_version('2020-01')
|
|
10
|
+
raise NotImplementedError unless DuodealerAPI::Base.api_version >= available_in_version
|
|
11
|
+
Product.find(:all, from: "#{self.class.prefix}collections/#{id}/products.json", params: options)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module DuodealerAPI
|
|
2
|
+
class CollectionListing < Base
|
|
3
|
+
self.primary_key = :collection_id
|
|
4
|
+
|
|
5
|
+
early_july_pagination_release!
|
|
6
|
+
|
|
7
|
+
def product_ids
|
|
8
|
+
ProductId.all(params: { collection_id: collection_id })
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class ProductId < ArrayBase
|
|
12
|
+
self.resource_prefix = 'collection_listings/:collection_id/'
|
|
13
|
+
|
|
14
|
+
early_july_pagination_release!
|
|
15
|
+
end
|
|
16
|
+
private_constant :ProductId
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module DuodealerAPI
|
|
2
|
+
class Comment < Base
|
|
3
|
+
def remove; load_attributes_from_response(post(:remove, {}, only_id)); end
|
|
4
|
+
def spam; load_attributes_from_response(post(:spam, {}, only_id)); end
|
|
5
|
+
def approve; load_attributes_from_response(post(:approve, {}, only_id)); end
|
|
6
|
+
def restore; load_attributes_from_response(post(:restore, {}, only_id)); end
|
|
7
|
+
def not_spam; load_attributes_from_response(post(:not_spam, {}, only_id)); end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module DuodealerAPI
|
|
2
|
+
class CustomCollection < Base
|
|
3
|
+
include Events
|
|
4
|
+
include Metafields
|
|
5
|
+
|
|
6
|
+
def products
|
|
7
|
+
Product.find(:all, :params => {:collection_id => self.id})
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def add_product(product)
|
|
11
|
+
Collect.create(:collection_id => self.id, :product_id => product.id)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def remove_product(product)
|
|
15
|
+
collect = Collect.find(:first, :params => {:collection_id => self.id, :product_id => product.id})
|
|
16
|
+
collect.destroy if collect
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|