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.
Files changed (322) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +8 -0
  5. data/.travis.yml +23 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile_ar41 +5 -0
  8. data/Gemfile_ar50 +5 -0
  9. data/Gemfile_ar51 +5 -0
  10. data/Gemfile_ar_master +5 -0
  11. data/RELEASING +13 -0
  12. data/Rakefile +44 -0
  13. data/docker-compose.yml +13 -0
  14. data/docs/graphql.md +191 -0
  15. data/duodealer_api.gemspec +38 -0
  16. data/lib/active_resource/connection_ext.rb +10 -0
  17. data/lib/active_resource/detailed_log_subscriber.rb +52 -0
  18. data/lib/active_resource/json_errors.rb +31 -0
  19. data/lib/duodealer_api.rb +33 -0
  20. data/lib/duodealer_api/api_version.rb +205 -0
  21. data/lib/duodealer_api/connection.rb +35 -0
  22. data/lib/duodealer_api/countable.rb +14 -0
  23. data/lib/duodealer_api/disable_prefix_check.rb +31 -0
  24. data/lib/duodealer_api/events.rb +7 -0
  25. data/lib/duodealer_api/graphql.rb +79 -0
  26. data/lib/duodealer_api/graphql/http_client.rb +22 -0
  27. data/lib/duodealer_api/graphql/railtie.rb +17 -0
  28. data/lib/duodealer_api/graphql/task.rake +97 -0
  29. data/lib/duodealer_api/limits.rb +76 -0
  30. data/lib/duodealer_api/message_enricher.rb +23 -0
  31. data/lib/duodealer_api/meta.rb +15 -0
  32. data/lib/duodealer_api/metafields.rb +20 -0
  33. data/lib/duodealer_api/paginated_collection.rb +69 -0
  34. data/lib/duodealer_api/pagination_link_headers.rb +33 -0
  35. data/lib/duodealer_api/resources.rb +3 -0
  36. data/lib/duodealer_api/resources/abandoned_checkout.rb +7 -0
  37. data/lib/duodealer_api/resources/access_scope.rb +10 -0
  38. data/lib/duodealer_api/resources/access_token.rb +8 -0
  39. data/lib/duodealer_api/resources/address.rb +4 -0
  40. data/lib/duodealer_api/resources/announcement.rb +4 -0
  41. data/lib/duodealer_api/resources/api_permission.rb +9 -0
  42. data/lib/duodealer_api/resources/application_charge.rb +15 -0
  43. data/lib/duodealer_api/resources/application_credit.rb +4 -0
  44. data/lib/duodealer_api/resources/array_base.rb +13 -0
  45. data/lib/duodealer_api/resources/article.rb +21 -0
  46. data/lib/duodealer_api/resources/asset.rb +100 -0
  47. data/lib/duodealer_api/resources/assigned_fulfillment_order.rb +16 -0
  48. data/lib/duodealer_api/resources/base.rb +162 -0
  49. data/lib/duodealer_api/resources/billing_address.rb +4 -0
  50. data/lib/duodealer_api/resources/blog.rb +10 -0
  51. data/lib/duodealer_api/resources/carrier_service.rb +4 -0
  52. data/lib/duodealer_api/resources/cart.rb +4 -0
  53. data/lib/duodealer_api/resources/checkout.rb +30 -0
  54. data/lib/duodealer_api/resources/collect.rb +6 -0
  55. data/lib/duodealer_api/resources/collection.rb +14 -0
  56. data/lib/duodealer_api/resources/collection_listing.rb +18 -0
  57. data/lib/duodealer_api/resources/collection_publication.rb +10 -0
  58. data/lib/duodealer_api/resources/comment.rb +9 -0
  59. data/lib/duodealer_api/resources/country.rb +4 -0
  60. data/lib/duodealer_api/resources/currency.rb +6 -0
  61. data/lib/duodealer_api/resources/custom_collection.rb +19 -0
  62. data/lib/duodealer_api/resources/customer.rb +29 -0
  63. data/lib/duodealer_api/resources/customer_group.rb +5 -0
  64. data/lib/duodealer_api/resources/customer_invite.rb +4 -0
  65. data/lib/duodealer_api/resources/customer_saved_search.rb +11 -0
  66. data/lib/duodealer_api/resources/discount_code.rb +9 -0
  67. data/lib/duodealer_api/resources/draft_order.rb +14 -0
  68. data/lib/duodealer_api/resources/draft_order_invoice.rb +4 -0
  69. data/lib/duodealer_api/resources/event.rb +8 -0
  70. data/lib/duodealer_api/resources/fulfillment.rb +47 -0
  71. data/lib/duodealer_api/resources/fulfillment_event.rb +15 -0
  72. data/lib/duodealer_api/resources/fulfillment_order.rb +137 -0
  73. data/lib/duodealer_api/resources/fulfillment_order_locations_for_move.rb +4 -0
  74. data/lib/duodealer_api/resources/fulfillment_request.rb +15 -0
  75. data/lib/duodealer_api/resources/fulfillment_service.rb +4 -0
  76. data/lib/duodealer_api/resources/fulfillment_v2.rb +20 -0
  77. data/lib/duodealer_api/resources/gift_card.rb +7 -0
  78. data/lib/duodealer_api/resources/image.rb +16 -0
  79. data/lib/duodealer_api/resources/inventory_item.rb +6 -0
  80. data/lib/duodealer_api/resources/inventory_level.rb +55 -0
  81. data/lib/duodealer_api/resources/line_item.rb +14 -0
  82. data/lib/duodealer_api/resources/location.rb +8 -0
  83. data/lib/duodealer_api/resources/marketing_event.rb +10 -0
  84. data/lib/duodealer_api/resources/metafield.rb +13 -0
  85. data/lib/duodealer_api/resources/note_attribute.rb +4 -0
  86. data/lib/duodealer_api/resources/option.rb +4 -0
  87. data/lib/duodealer_api/resources/order.rb +43 -0
  88. data/lib/duodealer_api/resources/order_risk.rb +8 -0
  89. data/lib/duodealer_api/resources/page.rb +6 -0
  90. data/lib/duodealer_api/resources/payment.rb +7 -0
  91. data/lib/duodealer_api/resources/payment_details.rb +4 -0
  92. data/lib/duodealer_api/resources/ping.rb +3 -0
  93. data/lib/duodealer_api/resources/policy.rb +7 -0
  94. data/lib/duodealer_api/resources/price_rule.rb +8 -0
  95. data/lib/duodealer_api/resources/product.rb +35 -0
  96. data/lib/duodealer_api/resources/product_listing.rb +16 -0
  97. data/lib/duodealer_api/resources/product_publication.rb +10 -0
  98. data/lib/duodealer_api/resources/province.rb +5 -0
  99. data/lib/duodealer_api/resources/publication.rb +5 -0
  100. data/lib/duodealer_api/resources/receipt.rb +4 -0
  101. data/lib/duodealer_api/resources/recurring_application_charge.rb +31 -0
  102. data/lib/duodealer_api/resources/redirect.rb +4 -0
  103. data/lib/duodealer_api/resources/refund.rb +14 -0
  104. data/lib/duodealer_api/resources/report.rb +4 -0
  105. data/lib/duodealer_api/resources/resource_feedback.rb +19 -0
  106. data/lib/duodealer_api/resources/rule.rb +4 -0
  107. data/lib/duodealer_api/resources/script_tag.rb +4 -0
  108. data/lib/duodealer_api/resources/shipping_address.rb +4 -0
  109. data/lib/duodealer_api/resources/shipping_line.rb +4 -0
  110. data/lib/duodealer_api/resources/shipping_rate.rb +7 -0
  111. data/lib/duodealer_api/resources/shipping_zone.rb +4 -0
  112. data/lib/duodealer_api/resources/shop.rb +25 -0
  113. data/lib/duodealer_api/resources/smart_collection.rb +19 -0
  114. data/lib/duodealer_api/resources/storefront_access_token.rb +4 -0
  115. data/lib/duodealer_api/resources/tax_line.rb +4 -0
  116. data/lib/duodealer_api/resources/tax_service.rb +4 -0
  117. data/lib/duodealer_api/resources/tender_transaction.rb +6 -0
  118. data/lib/duodealer_api/resources/theme.rb +4 -0
  119. data/lib/duodealer_api/resources/transaction.rb +5 -0
  120. data/lib/duodealer_api/resources/usage_charge.rb +5 -0
  121. data/lib/duodealer_api/resources/user.rb +4 -0
  122. data/lib/duodealer_api/resources/variant.rb +8 -0
  123. data/lib/duodealer_api/resources/webhook.rb +4 -0
  124. data/lib/duodealer_api/session.rb +171 -0
  125. data/lib/duodealer_api/version.rb +3 -0
  126. data/shipit.rubygems.yml +1 -0
  127. data/test/abandoned_checkouts_test.rb +29 -0
  128. data/test/access_scope_test.rb +23 -0
  129. data/test/access_token_test.rb +19 -0
  130. data/test/active_resource/json_errors_test.rb +19 -0
  131. data/test/api_permission_test.rb +9 -0
  132. data/test/api_version_test.rb +157 -0
  133. data/test/application_charge_test.rb +79 -0
  134. data/test/application_credit_test.rb +35 -0
  135. data/test/article_test.rb +73 -0
  136. data/test/asset_test.rb +18 -0
  137. data/test/assigned_fulfillment_order_test.rb +77 -0
  138. data/test/base_test.rb +198 -0
  139. data/test/blog_test.rb +8 -0
  140. data/test/carrier_service_test.rb +17 -0
  141. data/test/cart_test.rb +13 -0
  142. data/test/checkouts_test.rb +77 -0
  143. data/test/collect_test.rb +9 -0
  144. data/test/collection_listing_test.rb +79 -0
  145. data/test/collection_publication_test.rb +40 -0
  146. data/test/collection_test.rb +49 -0
  147. data/test/countable_test.rb +13 -0
  148. data/test/currency_test.rb +21 -0
  149. data/test/custom_collection_test.rb +9 -0
  150. data/test/customer_saved_search_test.rb +27 -0
  151. data/test/customer_test.rb +50 -0
  152. data/test/detailed_log_subscriber_test.rb +139 -0
  153. data/test/discount_code_test.rb +53 -0
  154. data/test/draft_order_test.rb +151 -0
  155. data/test/fixtures/abandoned_checkout.json +184 -0
  156. data/test/fixtures/abandoned_checkouts.json +186 -0
  157. data/test/fixtures/access_scopes.json +10 -0
  158. data/test/fixtures/access_token_delegate.json +4 -0
  159. data/test/fixtures/api_versions.json +38 -0
  160. data/test/fixtures/apis.json +42 -0
  161. data/test/fixtures/application_charge.json +16 -0
  162. data/test/fixtures/application_charges.json +57 -0
  163. data/test/fixtures/application_credit.json +12 -0
  164. data/test/fixtures/application_credits.json +24 -0
  165. data/test/fixtures/article.json +15 -0
  166. data/test/fixtures/articles.json +39 -0
  167. data/test/fixtures/asset.json +9 -0
  168. data/test/fixtures/assets.json +136 -0
  169. data/test/fixtures/assigned_fulfillment_orders.json +78 -0
  170. data/test/fixtures/authors.json +1 -0
  171. data/test/fixtures/blog.json +13 -0
  172. data/test/fixtures/blogs.json +13 -0
  173. data/test/fixtures/carrier_service.json +9 -0
  174. data/test/fixtures/carts.json +43 -0
  175. data/test/fixtures/checkout.json +160 -0
  176. data/test/fixtures/checkouts.json +162 -0
  177. data/test/fixtures/collect.json +12 -0
  178. data/test/fixtures/collection.json +17 -0
  179. data/test/fixtures/collection_listing.json +11 -0
  180. data/test/fixtures/collection_listing_product_ids.json +1 -0
  181. data/test/fixtures/collection_listing_product_ids2.json +1 -0
  182. data/test/fixtures/collection_listings.json +13 -0
  183. data/test/fixtures/collection_products.json +47 -0
  184. data/test/fixtures/collection_publication.json +11 -0
  185. data/test/fixtures/collection_publications.json +13 -0
  186. data/test/fixtures/currencies.json +25 -0
  187. data/test/fixtures/custom_collection.json +17 -0
  188. data/test/fixtures/customer_invite.json +9 -0
  189. data/test/fixtures/customer_saved_search.json +9 -0
  190. data/test/fixtures/customer_saved_search_customers.json +60 -0
  191. data/test/fixtures/customers.json +59 -0
  192. data/test/fixtures/customers_account_activation_url.json +3 -0
  193. data/test/fixtures/customers_search.json +60 -0
  194. data/test/fixtures/discount_code.json +10 -0
  195. data/test/fixtures/discount_codes.json +12 -0
  196. data/test/fixtures/draft_order.json +159 -0
  197. data/test/fixtures/draft_order_completed.json +159 -0
  198. data/test/fixtures/draft_order_invoice.json +9 -0
  199. data/test/fixtures/draft_orders.json +161 -0
  200. data/test/fixtures/engagement.json +15 -0
  201. data/test/fixtures/events.json +31 -0
  202. data/test/fixtures/fulfillment.json +49 -0
  203. data/test/fixtures/fulfillment_event.json +12 -0
  204. data/test/fixtures/fulfillment_order.json +38 -0
  205. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  206. data/test/fixtures/fulfillment_orders.json +78 -0
  207. data/test/fixtures/fulfillment_request.json +28 -0
  208. data/test/fixtures/fulfillment_service.json +10 -0
  209. data/test/fixtures/fulfillments.json +53 -0
  210. data/test/fixtures/gift_card.json +20 -0
  211. data/test/fixtures/gift_card_disabled.json +20 -0
  212. data/test/fixtures/graphql/2019-10.json +1083 -0
  213. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  214. data/test/fixtures/graphql/unstable.json +1083 -0
  215. data/test/fixtures/image.json +10 -0
  216. data/test/fixtures/images.json +20 -0
  217. data/test/fixtures/inventory_level.json +7 -0
  218. data/test/fixtures/inventory_levels.json +24 -0
  219. data/test/fixtures/marketing_event.json +28 -0
  220. data/test/fixtures/marketing_events.json +54 -0
  221. data/test/fixtures/metafield.json +12 -0
  222. data/test/fixtures/metafields.json +34 -0
  223. data/test/fixtures/order.json +297 -0
  224. data/test/fixtures/order_risk.json +14 -0
  225. data/test/fixtures/order_risks.json +28 -0
  226. data/test/fixtures/order_with_properties.json +373 -0
  227. data/test/fixtures/orders.json +299 -0
  228. data/test/fixtures/payment.json +7 -0
  229. data/test/fixtures/payments.json +9 -0
  230. data/test/fixtures/ping/conversation.json +1 -0
  231. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  232. data/test/fixtures/ping/message.json +1 -0
  233. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  234. data/test/fixtures/policies.json +8 -0
  235. data/test/fixtures/price_rule.json +27 -0
  236. data/test/fixtures/price_rules.json +28 -0
  237. data/test/fixtures/product.json +116 -0
  238. data/test/fixtures/product_listing.json +86 -0
  239. data/test/fixtures/product_listing_product_ids.json +1 -0
  240. data/test/fixtures/product_listing_product_ids2.json +1 -0
  241. data/test/fixtures/product_listings.json +174 -0
  242. data/test/fixtures/product_publication.json +11 -0
  243. data/test/fixtures/product_publications.json +13 -0
  244. data/test/fixtures/publications.json +9 -0
  245. data/test/fixtures/recurring_application_charge.json +22 -0
  246. data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
  247. data/test/fixtures/recurring_application_charges.json +106 -0
  248. data/test/fixtures/redirect.json +7 -0
  249. data/test/fixtures/refund.json +112 -0
  250. data/test/fixtures/report.json +9 -0
  251. data/test/fixtures/reports.json +11 -0
  252. data/test/fixtures/script_tag.json +10 -0
  253. data/test/fixtures/script_tags.json +18 -0
  254. data/test/fixtures/shipping_rates.json +12 -0
  255. data/test/fixtures/shipping_zones.json +315 -0
  256. data/test/fixtures/shop.json +26 -0
  257. data/test/fixtures/smart_collection.json +21 -0
  258. data/test/fixtures/smart_collection_products.json +155 -0
  259. data/test/fixtures/storefront_access_token.json +9 -0
  260. data/test/fixtures/storefront_access_tokens.json +18 -0
  261. data/test/fixtures/tags.json +1 -0
  262. data/test/fixtures/tax_service.json +9 -0
  263. data/test/fixtures/tender_transactions.json +52 -0
  264. data/test/fixtures/transaction.json +29 -0
  265. data/test/fixtures/usage_charge.json +11 -0
  266. data/test/fixtures/usage_charges.json +23 -0
  267. data/test/fixtures/user.json +21 -0
  268. data/test/fixtures/users.json +42 -0
  269. data/test/fixtures/variant.json +23 -0
  270. data/test/fixtures/variants.json +88 -0
  271. data/test/fixtures/webhook.json +10 -0
  272. data/test/fixtures/webhooks.json +18 -0
  273. data/test/fulfillment_event_test.rb +69 -0
  274. data/test/fulfillment_order_test.rb +462 -0
  275. data/test/fulfillment_order_test_helper.rb +7 -0
  276. data/test/fulfillment_request_test.rb +33 -0
  277. data/test/fulfillment_service_test.rb +17 -0
  278. data/test/fulfillment_test.rb +224 -0
  279. data/test/fulfillment_v2_test.rb +62 -0
  280. data/test/gift_card_test.rb +22 -0
  281. data/test/graphql/http_client_test.rb +26 -0
  282. data/test/graphql_test.rb +147 -0
  283. data/test/image_test.rb +39 -0
  284. data/test/inventory_level_test.rb +59 -0
  285. data/test/lib/webmock_extensions/last_request.rb +16 -0
  286. data/test/limits_test.rb +38 -0
  287. data/test/location_test.rb +14 -0
  288. data/test/marketing_event_test.rb +68 -0
  289. data/test/message_enricher_test.rb +45 -0
  290. data/test/meta_test.rb +49 -0
  291. data/test/metafield_test.rb +46 -0
  292. data/test/order_risk_test.rb +46 -0
  293. data/test/order_test.rb +125 -0
  294. data/test/pagination_test.rb +257 -0
  295. data/test/payment_test.rb +19 -0
  296. data/test/policy_test.rb +19 -0
  297. data/test/price_rule_test.rb +65 -0
  298. data/test/product_listing_test.rb +97 -0
  299. data/test/product_publication_test.rb +40 -0
  300. data/test/product_test.rb +60 -0
  301. data/test/publication_test.rb +12 -0
  302. data/test/recurring_application_charge_test.rb +142 -0
  303. data/test/redirect_test.rb +9 -0
  304. data/test/refund_test.rb +32 -0
  305. data/test/report_test.rb +35 -0
  306. data/test/resource_feedback_test.rb +42 -0
  307. data/test/script_tag_test.rb +30 -0
  308. data/test/session_test.rb +366 -0
  309. data/test/shipping_rate_test.rb +17 -0
  310. data/test/shipping_zone_test.rb +10 -0
  311. data/test/shop_test.rb +68 -0
  312. data/test/smart_collection_test.rb +35 -0
  313. data/test/storefront_access_token_test.rb +32 -0
  314. data/test/tax_service_test.rb +9 -0
  315. data/test/tender_transaction_test.rb +18 -0
  316. data/test/test_helper.rb +124 -0
  317. data/test/transaction_test.rb +17 -0
  318. data/test/usage_charge_test.rb +21 -0
  319. data/test/user_test.rb +17 -0
  320. data/test/variant_test.rb +46 -0
  321. data/test/webhook_test.rb +21 -0
  322. 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,4 @@
1
+ module DuodealerAPI
2
+ class BillingAddress < Base
3
+ end
4
+ end
@@ -0,0 +1,10 @@
1
+ module DuodealerAPI
2
+ class Blog < Base
3
+ include Events
4
+ include Metafields
5
+
6
+ def articles
7
+ Article.find(:all, :params => { :blog_id => id })
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module DuodealerAPI
2
+ class CarrierService < Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module DuodealerAPI
2
+ class Cart < Base
3
+ end
4
+ 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,6 @@
1
+ module DuodealerAPI
2
+ # For adding/removing products from custom collections
3
+ class Collect < Base
4
+ early_july_pagination_release!
5
+ end
6
+ 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,10 @@
1
+ # frozen_string_literal: true
2
+ module DuodealerAPI
3
+ class CollectionPublication < Base
4
+ init_prefix :publication
5
+
6
+ def publication_id
7
+ @prefix_options[:publication_id]
8
+ end
9
+ end
10
+ 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,4 @@
1
+ module DuodealerAPI
2
+ class Country < Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuodealerAPI
4
+ class Currency < Base
5
+ end
6
+ 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