e_plat 0.3.0 → 0.4.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +630 -131
  3. data/lib/active_resource/connection_error.rb +29 -0
  4. data/lib/active_resource/formats.rb +27 -0
  5. data/lib/current.rb +1 -1
  6. data/lib/e_plat/client/default_request_args.rb +27 -3
  7. data/lib/e_plat/client.rb +114 -87
  8. data/lib/e_plat/connection.rb +4 -0
  9. data/lib/e_plat/mapping/base.rb +119 -12
  10. data/lib/e_plat/mapping/bigcommerce/v_3/metafield.rb +62 -0
  11. data/lib/e_plat/mapping/bigcommerce/v_3/order/billing_address.rb +14 -0
  12. data/lib/e_plat/mapping/bigcommerce/v_3/order/line_item.rb +85 -0
  13. data/lib/e_plat/mapping/bigcommerce/v_3/order/shipping_address.rb +73 -0
  14. data/lib/e_plat/mapping/bigcommerce/v_3/order.rb +160 -0
  15. data/lib/e_plat/mapping/bigcommerce/v_3/product/image.rb +12 -12
  16. data/lib/e_plat/mapping/bigcommerce/v_3/product/variant.rb +1 -1
  17. data/lib/e_plat/mapping/bigcommerce/v_3/script_tag.rb +78 -0
  18. data/lib/e_plat/mapping/bigcommerce/v_3/shop.rb +11 -6
  19. data/lib/e_plat/mapping/bigcommerce/v_3/webhook.rb +54 -0
  20. data/lib/e_plat/mapping/request_body_root.rb +38 -0
  21. data/lib/e_plat/mapping/shopify/v_2024_01/metafield.rb +26 -0
  22. data/lib/e_plat/mapping/shopify/v_2024_01/order/billing_address.rb +14 -0
  23. data/lib/e_plat/mapping/shopify/v_2024_01/order/shipping_address.rb +30 -0
  24. data/lib/e_plat/mapping/shopify/{v_2022_07/product.rb → v_2024_01/order.rb} +3 -3
  25. data/lib/e_plat/mapping/shopify/{v_2022_07 → v_2024_01}/product/image.rb +1 -1
  26. data/lib/e_plat/mapping/shopify/{v_2022_07 → v_2024_01}/product/variant.rb +2 -1
  27. data/lib/e_plat/mapping/shopify/v_2024_01/product.rb +26 -0
  28. data/lib/e_plat/mapping/shopify/v_2024_01/script_tag.rb +26 -0
  29. data/lib/e_plat/mapping/shopify/{v_2022_07 → v_2024_01}/shop.rb +1 -1
  30. data/lib/e_plat/mapping/shopify/v_2024_01/webhook.rb +29 -0
  31. data/lib/e_plat/mapping/virtual_collection/base.rb +14 -0
  32. data/lib/e_plat/mapping/virtual_collection/bigcommerce/order_line_items.rb +297 -0
  33. data/lib/e_plat/mapping.rb +3 -3
  34. data/lib/e_plat/resource/attribute_interface.rb +28 -28
  35. data/lib/e_plat/resource/base.rb +107 -66
  36. data/lib/e_plat/resource/collection.rb +92 -0
  37. data/lib/e_plat/resource/concerns/aliases.rb +102 -18
  38. data/lib/e_plat/resource/concerns/dirty.rb +54 -0
  39. data/lib/e_plat/resource/concerns/metafieldable.rb +43 -0
  40. data/lib/e_plat/resource/concerns/overwrite_instance_methods.rb +108 -6
  41. data/lib/e_plat/resource/concerns/overwrite_request_methods.rb +73 -37
  42. data/lib/e_plat/resource/countable.rb +43 -0
  43. data/lib/e_plat/resource/metafield.rb +70 -0
  44. data/lib/e_plat/resource/order/Consignment.rb +8 -0
  45. data/lib/e_plat/resource/order/billing_address.rb +6 -0
  46. data/lib/e_plat/resource/order/fulfillment.rb +1 -0
  47. data/lib/e_plat/resource/order/line_item.rb +1 -0
  48. data/lib/e_plat/resource/order/shipping_address.rb +44 -0
  49. data/lib/e_plat/resource/order/shipping_line.rb +15 -14
  50. data/lib/e_plat/resource/order.rb +32 -0
  51. data/lib/e_plat/resource/paginated/link_headers.rb +42 -0
  52. data/lib/e_plat/resource/paginated/link_params.rb +26 -0
  53. data/lib/e_plat/resource/product/image.rb +6 -0
  54. data/lib/e_plat/resource/product/option.rb +1 -0
  55. data/lib/e_plat/resource/product/variant.rb +8 -12
  56. data/lib/e_plat/resource/product.rb +8 -2
  57. data/lib/e_plat/resource/script_tag.rb +56 -0
  58. data/lib/e_plat/resource/shop.rb +17 -13
  59. data/lib/e_plat/resource/shopify_only/recurring_application_charge/usage_charge.rb +32 -0
  60. data/lib/e_plat/resource/shopify_only/recurring_application_charge.rb +47 -0
  61. data/lib/e_plat/resource/webhook.rb +50 -0
  62. data/lib/e_plat/session.rb +10 -7
  63. data/lib/e_plat/type_coercer.rb +15 -17
  64. data/lib/e_plat/version.rb +1 -1
  65. data/lib/e_plat.rb +4 -3
  66. metadata +55 -9
  67. data/lib/e_plat/resource/order/customer.rb +0 -37
data/README.md CHANGED
@@ -23,6 +23,7 @@ Goals are:
23
23
  <img src="mascot.png" width="350" title="hover text" alt="EPlat Platypus">
24
24
  </p>
25
25
 
26
+ <br>
26
27
 
27
28
  ## Installation
28
29
 
@@ -34,19 +35,21 @@ To your gemfile and then run
34
35
 
35
36
  $ bundle
36
37
 
38
+ <br>
37
39
 
38
40
  ## Config
39
41
  You can configure which platform APIs are used by updating the EPlat config: <br/>
40
42
  ```ruby
41
43
  #initializers/e_plat.rb
42
- EPlat.config.shopify_api_version = "2022-10"
44
+ EPlat.config.shopify_api_version = "2024-01"
43
45
  EPlat.config.bigcommerce_api_version = "v3"
44
46
  EPlat.config.woocommerce_api_version = "v3"
45
47
  ```
48
+ <br>
46
49
 
47
50
  ## Relasing new version
48
51
  https://dev.to/doctolib/release-a-new-gem-version-je0
49
-
52
+ <br>
50
53
 
51
54
  ## Usage
52
55
 
@@ -56,7 +59,7 @@ EPlat::Session.new(
56
59
  platform: :shopify,
57
60
  store_url: "test-store.myshopify.com",
58
61
  api_token: "123",
59
- # store_hash: BigCommerce_specific
62
+ # store_hash: optional BigCommerce store hash
60
63
  )
61
64
  ```
62
65
 
@@ -70,6 +73,25 @@ EPlat::Product.find(id: 123)
70
73
  EPlat::Product
71
74
  ```
72
75
 
76
+ EPlat is designed to let you mostly use it's universal interface, but then easily interact with non supported platform attributes when needed.
77
+ ```ruby
78
+ tag = EPlat::ScriptTag.new(
79
+ display_scope: :online_store,
80
+ event: :onload,
81
+ src: "https://preproduct.io/mini-script.js"
82
+ )
83
+ tag.name = "mini script" if Current.e_plat_session.bigcommerce?
84
+ tag.save
85
+
86
+ # ...when session is a Shopify store
87
+ # POST https://preproduct-test.myshopify.com/admin/api/2024-01/script_tags.json
88
+ # body: '{"script_tag":{"display_scope":"online_store","event":"onload","src":"https://preproduct.io/mini-script.js"}}'
89
+ #
90
+ # ...when session is a BigCommerce store
91
+ # POST https://api.bigcommerce.com/stores/d0kmq3bory/v3/content/scripts
92
+ # body: {"location":"head","auto_uninstall":true,"kind":"src","load_method":"async","name":"mini script","enabled":true,"visibility":"storefront","event":"onload","src":"https://preproduct.io/mini-script.js"}
93
+ ```
94
+ <br>
73
95
 
74
96
  ## Under The Hood
75
97
 
@@ -89,12 +111,12 @@ EPlat::Product
89
111
  </li>
90
112
  <li>
91
113
  The EPlat alias interface is just a set of dynamically created getter/setter/predicate methods with types that control the native attributes of the resource.
92
- You can check if an attribute has been mapped by calling `@resource.mapped? "attribute_name"`
114
+ You can check if an attribute has been mapped by calling `resource.mapped? "attribute_name"`
93
115
  </li>
94
116
  </ul>
95
117
  </ol>
96
118
 
97
-
119
+ <br>
98
120
 
99
121
 
100
122
  ## EPlat Alias Interface
@@ -102,16 +124,16 @@ EPlat::Product
102
124
  <details>
103
125
  <summary>Shop</summary>
104
126
 
105
- ### Mapped Aliases
127
+ ### EPlat::Shop
106
128
 
107
- | Alas | Type | Shopify | BigCommerce | WooCommerce |
129
+ | Alias | Type | Shopify | BigCommerce| Etc |
108
130
  | ------------------------------------ | --------- | ------- | -----------| ------------|
109
- | id | integer | * | * | nil |
110
- | name | string | * | * | nil |
111
- | email | string | * | * | nil |
112
- | domain | string | * | * | nil |
113
- | province | string | * | * | nil |
114
- | country | string | * | * | nil |
131
+ | id | integer | * | nil | nil |
132
+ | name | string | * | name | nil |
133
+ | email | string | * | admin_email| nil |
134
+ | domain | string | * | domain | nil |
135
+ | province | string | * | nil | nil |
136
+ | country | string | * | country | nil |
115
137
  | address1 | string | * | nil | nil |
116
138
  | zip | string | * | nil | nil |
117
139
  | city | string | * | nil | nil |
@@ -123,30 +145,30 @@ EPlat::Product
123
145
  | address2 | string | * | nil | nil |
124
146
  | created_at | datetime | * | nil | nil |
125
147
  | updated_at | datetime | * | nil | nil |
126
- | country_code | string | * | * | nil |
148
+ | country_code | string | * | country_code | nil |
127
149
  | country_name | string | * | nil | nil |
128
- | currency | string | * | * | nil |
150
+ | currency | string | * | currency_symbol | nil |
129
151
  | customer_email | string | * | nil | nil |
130
152
  | timezone | string | * | nil | nil |
131
153
  | iana_timezone | string | * | nil | nil |
132
154
  | shop_owner | string | * | nil | nil |
133
155
  | money_format | string | * | nil | nil |
134
156
  | money_with_currency_format | string | * | nil | nil |
135
- | weight_unit | string | * | * | nil |
157
+ | weight_unit | string | * | weight_unit| nil |
136
158
  | province_code | string | * | nil | nil |
137
159
  | taxes_included | boolean | * | nil | nil |
138
160
  | auto_configure_tax_inclusivity | boolean | * | nil | nil |
139
161
  | tax_shipping | boolean | * | nil | nil |
140
162
  | county_taxes | boolean | * | nil | nil |
141
163
  | plan_display_name | string | * | nil | nil |
142
- | plan_name | string | * | * | nil |
164
+ | plan_name | string | * | plan_name | nil |
143
165
  | has_discounts | boolean | * | nil | nil |
144
166
  | has_gift_cards | boolean | * | nil | nil |
145
- | myshopify_domain | string | * | nil | nil |
167
+ | myshopify_domain | string | * | control_panel_base_url | nil |
146
168
  | google_apps_domain | string | * | nil | nil |
147
169
  | google_apps_login_enabled | boolean | * | nil | nil |
148
170
  | money_in_emails_format | string | * | nil | nil |
149
- | money_with_currency_in_emails_format| string | * | nil | nil |
171
+ | money_with_currency_in_emails_format | string | * | nil | nil |
150
172
  | eligible_for_payments | boolean | * | nil | nil |
151
173
  | requires_extra_payments_agreement | boolean | * | nil | nil |
152
174
  | password_enabled | boolean | * | nil | nil |
@@ -162,81 +184,80 @@ EPlat::Product
162
184
  | pre_launch_enabled | boolean | * | nil | nil |
163
185
  | enabled_presentment_currencies | array | * | nil | nil |
164
186
  | transactional_sms_disabled | boolean | * | nil | nil |
165
- | marketing_sms_consent_enabled_at_checkout | boolean | * | nil | nil |
187
+ | marketing_sms_consent_enabled_at_checkout | boolean | * | nil | nil |
188
+
189
+ ```ruby
190
+ # Bigcommerce translation. myshopify_domain is a permanent
191
+ shop.myshopify_domain #"store-#{ store_hash }.mybigcommerce.com"
192
+ shop.domain # custom_domain.com
193
+ ```
166
194
 
167
195
  </details>
168
- </br>
196
+
169
197
  <details>
170
198
  <summary>Product</summary>
171
199
 
172
- ### Mapped Aliases
200
+ ### EPlat::Product
173
201
 
174
- | Alas | Type | Shopify | BigCommerce | WooCommerce |
175
- | ------------------------| -------- | ------- | -----------| ------------|
176
- | body_html | string | * | * | nil |
177
- | created_at | datetime | * | * | nil |
178
- | handle | string | * | * | nil |
179
- | id | integer | * | * | nil |
180
- | images | array | * | * | nil |
181
- | options | array | * | [] | nil |
182
- | product_type | string | * | * | nil |
183
- | published_at | datetime | * | nil | nil |
184
- | published_scope | string | * | nil | nil |
185
- | status | string | * | nil | nil |
186
- | tags | string | * | nil | nil |
187
- | admin_graphql_api_id | string | * | nil | nil |
188
- | template_suffix | string | * | nil | nil |
189
- | title | string | * | * | nil |
190
- | updated_at | datetime | * | * | nil |
191
- | variants | array | * | * | nil |
192
- | vendor | string | * | nil | nil |
202
+ | Alias | Type | Shopify | BigCommerce | Etc |
203
+ | ------------------------ | -------- | ------- | -------------| ------------|
204
+ | body_html | string | * | description | nil |
205
+ | created_at | datetime | * | date_created | nil |
206
+ | handle | string | * | name | nil |
207
+ | id | integer | * | id | nil |
208
+ | images | array | * | * | nil |
209
+ | options | array | * | * | nil |
210
+ | product_type | string | * | type | nil |
211
+ | published_at | datetime | * | nil | nil |
212
+ | published_scope | string | * | nil | nil |
213
+ | status | string | * | availability | nil |
214
+ | tags | string | * | nil | nil |
215
+ | admin_graphql_api_id | string | * | nil | nil |
216
+ | template_suffix | string | * | nil | nil |
217
+ | title | string | * | name | nil |
218
+ | updated_at | datetime | * | date_modified| nil |
219
+ | variants | array | * | * | nil |
220
+ | vendor | string | * | nil | nil |
193
221
 
194
- </details>
195
- </br>
196
- <details>
197
- <summary>Product Variant</summary>
198
222
 
199
- ### Mapped Aliases
223
+ ### EPlat::Product::Variant
224
+
200
225
 
201
- | Alas | Type | Shopify | BigCommerce | WooCommerce |
202
- | --------------------- | -------- | ------- | -----------| ------------|
203
- | id | integer | * | * | nil |
204
- | product_id | integer | * | * | nil |
205
- | title | string | * | nil | nil |
206
- | price | string | * | * | nil |
207
- | sku | string | * | * | nil |
208
- | position | integer | * | nil | nil |
209
- | inventory_policy | string | * | nil | nil |
210
- | compare_at_price | string | * | nil | nil |
211
- | fulfillment_service | string | * | nil | nil |
212
- | inventory_management | string | * | nil | nil |
213
- | option1 | string | * | * | nil |
214
- | option2 | string | * | nil | nil |
215
- | option3 | string | * | nil | nil |
216
- | created_at | datetime | * | * | nil |
217
- | updated_at | datetime | * | * | nil |
218
- | taxable | boolean | * | nil | nil |
219
- | barcode | string | * | nil | nil |
220
- | grams | integer | * | nil | nil |
221
- | image_id | integer | * | nil | nil |
222
- | weight | float | * | * | nil |
223
- | weight_unit | string | * | nil | nil |
224
- | inventory_item_id | integer | * | nil | nil |
225
- | inventory_quantity | integer | * | * | nil |
226
- | old_inventory_quantity| integer | * | nil | nil |
227
- | presentment_prices | array | * | nil | nil |
228
- | tax_code | string | * | nil | nil |
229
- | requires_shipping | boolean | * | nil | nil |
230
- | admin_graphql_api_id | string | * | nil | nil |
226
+ | Alias | Type | Shopify | BigCommerce | Etc |
227
+ | --------------------- | -------- | ------- | ----------------------| ------------|
228
+ | id | integer | * | id | nil |
229
+ | product_id | integer | * | product_id | nil |
230
+ | title | string | * | nil | nil |
231
+ | price | string | * | price | nil |
232
+ | sku | string | * | sku | nil |
233
+ | position | integer | * | nil | nil |
234
+ | inventory_policy | string | * | nil | nil |
235
+ | compare_at_price | string | * | nil | nil |
236
+ | fulfillment_service | string | * | nil | nil |
237
+ | inventory_management | string | * | nil | nil |
238
+ | option1 | string | * | option_values[0].label| nil |
239
+ | option2 | string | * | nil | nil |
240
+ | option3 | string | * | nil | nil |
241
+ | created_at | datetime | * | nil | nil |
242
+ | updated_at | datetime | * | nil | nil |
243
+ | taxable | boolean | * | nil | nil |
244
+ | barcode | string | * | nil | nil |
245
+ | grams | integer | * | nil | nil |
246
+ | image_id | integer | * | nil | nil |
247
+ | weight | float | * | weight | nil |
248
+ | weight_unit | string | * | nil | nil |
249
+ | inventory_item_id | integer | * | nil | nil |
250
+ | inventory_quantity | integer | * | inventory_level | nil |
251
+ | old_inventory_quantity| integer | * | nil | nil |
252
+ | presentment_prices | array | * | nil | nil |
253
+ | tax_code | string | * | nil | nil |
254
+ | requires_shipping | boolean | * | nil | nil |
255
+ | admin_graphql_api_id | string | * | nil | nil |
231
256
 
232
- </details>
233
- </br>
234
- <details>
235
- <summary>Product Option</summary>
236
-
237
- ### Mapped Aliases
238
257
 
239
- | Alas | Type | Shopify | BigCommerce | WooCommerce |
258
+ ### EPlat::Product::Option
259
+
260
+ | Alias | Type | Shopify | BigCommerce| Etc |
240
261
  | --------- | -------- | ------- | -----------| ------------|
241
262
  | id | integer | * | nil | nil |
242
263
  | product_id| integer | * | nil | nil |
@@ -244,51 +265,513 @@ EPlat::Product
244
265
  | position | integer | * | nil | nil |
245
266
  | values | array | * | nil | nil |
246
267
 
268
+
269
+ ### EPlat::Product::Image
270
+
271
+ | Alias | Type | Shopify | BigCommerce | Etc |
272
+ | -------------------- | -------- | ------- | ----------- | ------------|
273
+ | id | integer | * | id | nil |
274
+ | product_id | integer | * | product_id | nil |
275
+ | position | integer | * | nil | nil |
276
+ | created_at | datetime | * | date_created | nil |
277
+ | updated_at | datetime | * | date_modified| nil |
278
+ | alt | string | * | nil | nil |
279
+ | width | integer | * | nil | nil |
280
+ | height | integer | * | nil | nil |
281
+ | src | string | * | url_standard | nil |
282
+ | variant_ids | array | * | nil | nil |
283
+ | admin_graphql_api_id | string | * | nil | nil |
284
+
247
285
  </details>
248
- </br>
286
+
249
287
  <details>
250
- <summary>Product Image</summary>
288
+ <summary>Order</summary>
289
+
290
+ ### EPlat::Order
291
+
292
+ | attribute_name | type | Shopify | BigCommerce | Etc |
293
+ |--------------------------------------|----------|---------|-------------|-------------|
294
+ | id | integer | * | id | nil |
295
+ | app_id | integer | * | nil | nil |
296
+ | billing_address_address1 | string | * | nil | nil |
297
+ | billing_address_address2 | string | * | nil | nil |
298
+ | billing_address_city | string | * | nil | nil |
299
+ | billing_address_company | string | * | nil | nil |
300
+ | billing_address_country | string | * | nil | nil |
301
+ | billing_address_first_name | string | * | nil | nil |
302
+ | billing_address_last_name | string | * | nil | nil |
303
+ | billing_address_phone | string | * | nil | nil |
304
+ | billing_address_province | string | * | nil | nil |
305
+ | billing_address_zip | string | * | nil | nil |
306
+ | billing_address_name | string | * | nil | nil |
307
+ | billing_address_province_code | string | * | nil | nil |
308
+ | billing_address_country_code | string | * | nil | nil |
309
+ | billing_address_latitude | string | * | nil | nil |
310
+ | billing_address_longitude | string | * | nil | nil |
311
+ | browser_ip | string | * | nil | nil |
312
+ | buyer_accepts_marketing | boolean | * | nil | nil |
313
+ | cancel_reason | string | * | nil | nil |
314
+ | cancelled_at | datetime | * | nil | nil |
315
+ | cart_token | string | * | nil | nil |
316
+ | checkout_token | string | * | nil | nil |
317
+ | client_details | hash | * | nil | nil |
318
+ | closed_at | datetime | * | nil | nil |
319
+ | created_at | datetime | * | date_created | nil |
320
+ | currency | string | * | currency_code | nil |
321
+ | current_total_discounts | string | * | discount_amount | nil |
322
+ | current_total_discounts_set | hash | * | nil | nil |
323
+ | current_total_duties_set | hash | * | nil | nil |
324
+ | current_total_price | string | * | nil | nil |
325
+ | current_total_price_set | hash | * | nil | nil |
326
+ | current_subtotal_price | string | * | nil | nil |
327
+ | current_subtotal_price_set | hash | * | nil | nil |
328
+ | current_total_tax | string | * | nil | nil |
329
+ | current_total_tax_set | hash | * | nil | nil |
330
+ | customer_locale | string | * | customer_locale | nil |
331
+ | device_id | integer | * | nil | nil |
332
+ | discount_codes | array | * | nil | nil |
333
+ | email | string | * | billing_address[email]| nil |
334
+ | estimated_taxes | boolean | * | nil | nil |
335
+ | financial_status | string | * | status_id | nil |
336
+ | fulfillment_status | string | * | nil | nil |
337
+ | gateway | string | * | nil | nil |
338
+ | landing_site | string | * | nil | nil |
339
+ | landing_site_ref | string | * | nil | nil |
340
+ | location_id | integer | * | nil | nil |
341
+ | merchant_of_record_app_id | integer | * | nil | nil |
342
+ | name | string | * | nil | nil |
343
+ | note | string | * | staff_notes | nil |
344
+ | note_attributes | array | * | nil | nil |
345
+ | number | integer | * | nil | nil |
346
+ | order_number | integer | * | nil | nil |
347
+ | order_status_url | string | * | nil | nil |
348
+ | original_total_duties_set | hash | * | nil | nil |
349
+ | payment_gateway_names | array | * | nil | nil |
350
+ | phone | string | * | nil | nil |
351
+ | presentment_currency | string | * | nil | nil |
352
+ | processed_at | string | * | nil | nil |
353
+ | processing_method | string | * | nil | nil |
354
+ | reference | string | * | nil | nil |
355
+ | referring_site | string | * | nil | nil |
356
+ | source_identifier | string | * | nil | nil |
357
+ | source_name | string | * | nil | nil |
358
+ | source_url | string | * | nil | nil |
359
+ | subtotal_price | string | * | subtotal_ex_tax | nil |
360
+ | subtotal_price_set | hash | * | nil | nil |
361
+ | tags | string | * | nil | nil |
362
+ | tax_lines | array | * | nil | nil |
363
+ | taxes_included | boolean | * | nil | nil |
364
+ | test | boolean | * | nil | nil |
365
+ | token | string | * | nil | nil |
366
+ | total_discounts | string | * | nil | nil |
367
+ | total_discounts_set | hash | * | nil | nil |
368
+ | total_line_items_price | string | * | nil | nil |
369
+ | total_line_items_price_set | hash | * | nil | nil |
370
+ | total_outstanding | string | * | nil | nil |
371
+ | total_price | string | * | total_inc_tax | nil |
372
+ | total_price_set | hash | * | nil | nil |
373
+ | total_shipping_price_set | hash | * | nil | nil |
374
+ | total_tax | string | * | total_tax | nil |
375
+ | total_tax_set | hash | * | nil | nil |
376
+ | total_tip_received | string | * | nil | nil |
377
+ | total_weight | integer | * | nil | nil |
378
+ | updated_at | datetime | * | date_modified | nil |
379
+ | billing_address | hash | * | billing_address | nil |
380
+ | customer | hash | * | nil | nil |
381
+ | discount_applications | array | * | nil | nil |
382
+ | fulfillments | array | * | nil | nil |
383
+ | line_items | array | * | nil | nil |
384
+ | payment_details | hash | * | nil | nil |
385
+ | payment_terms | hash | * | nil | nil |
386
+ | refunds | array | * | nil | nil |
387
+ | shipping_address | hash | * | nil | nil |
388
+ | shipping_lines | array | * | nil | nil |
389
+
390
+ ### EPlat::Order::ShippingAddress
391
+
392
+ | Alias | Type | Shopify | BigCommerce | Etc |
393
+ |---------------|---------|---------|-------------|-------------|
394
+ | address1 | string | * | street_1 | nil |
395
+ | address2 | string | * | street_2 | nil |
396
+ | city | string | * | city | nil |
397
+ | company | string | * | company | nil |
398
+ | country | string | * | country | nil |
399
+ | first_name | string | * | first_name | nil |
400
+ | last_name | string | * | last_name | nil |
401
+ | phone | string | * | phone | nil |
402
+ | province | string | * | state | nil |
403
+ | zip | string | * | zip | nil |
404
+ | country_code | string | * | country_iso2| nil |
405
+ | province_code | string | * | nil | nil |
406
+ | latitude | float | * | nil | nil |
407
+ | longitude | float | * | nil | nil |
408
+
409
+
410
+ ### EPlat::Order::LineItem
411
+
412
+ | Attribute | Type | Shopify | BigCommerce | Etc |
413
+ |-------------------------------|---------|---------|-------------|------|
414
+ | id | integer | * | order[consignments][0][shipping][0][line_items][#{i}][id] | nil |
415
+ | admin_graphql_api_id | string | * | nil | nil |
416
+ | fulfillable_quantity | integer | * | nil | nil |
417
+ | fulfillment_service | string | * | nil | nil |
418
+ | fulfillment_status | string | * | nil | nil |
419
+ | gift_card | boolean | * | nil | nil |
420
+ | grams | integer | * | nil | nil |
421
+ | name | string | * | order[consignments][0][shipping][0][line_items][#{i}][name] | nil |
422
+ | price | string | * | order[consignments][0][shipping][0][line_items][#{i}][price] | nil |
423
+ | price_set | hash | * | nil | nil |
424
+ | product_exists | boolean | * | nil | nil |
425
+ | product_id | integer | * | order[consignments][0][shipping][0][line_items][#{i}][product_id] | nil |
426
+ | properties | array | * | nil | nil |
427
+ | quantity | integer | * | order[consignments][0][shipping][0][line_items][#{i}][quantity] | nil |
428
+ | requires_shipping | boolean | * | nil | nil |
429
+ | sku | string | * | order[consignments][0][shipping][0][line_items][#{i}][sku] | nil |
430
+ | taxable | boolean | * | nil | nil |
431
+ | title | string | * | nil | nil |
432
+ | total_discount | string | * | nil | nil |
433
+ | total_discount_set | hash | * | nil | nil |
434
+ | variant_id | integer | * | order[consignments][0][shipping][0][line_items][#{i}][variant_id] | nil |
435
+ | variant_inventory_management | string | * | nil | nil |
436
+ | variant_title | string | * | nil | nil |
437
+ | vendor | string | * | nil | nil |
438
+ | tax_lines | array | * | nil | nil |
439
+ | duties | array | * | nil | nil |
440
+ | discount_allocations | array | * | nil | nil |
441
+
442
+ *line_item uses a virtual collection for BigCommerce, this allows us to present with the correct nesting position, whilst updating the native much deeper nested set below
443
+
444
+ </details>
251
445
 
252
- ### Mapped Aliases
253
446
 
254
- | Alas | Type | Shopify | BigCommerce | WooCommerce |
255
- | -------------------- | -------- | ------- | -----------| ------------|
256
- | id | integer | * | * | nil |
257
- | product_id | integer | * | * | nil |
258
- | position | integer | * | nil | nil |
259
- | created_at | datetime | * | * | nil |
260
- | updated_at | datetime | * | * | nil |
261
- | alt | string | * | nil | nil |
262
- | width | integer | * | nil | nil |
263
- | height | integer | * | nil | nil |
264
- | src | string | * | * | nil |
265
- | variant_ids | array | * | nil | nil |
266
- | admin_graphql_api_id | string | * | nil | nil |
447
+ </details>
448
+
449
+ <details>
450
+ <summary> Metafield </summary>
267
451
 
452
+ ### EPlat::Metafield
453
+
454
+ | Alias | Type | Shopify | BigCommerce | Etc |
455
+ |-----------------|----------|----------------|----------------|-----|
456
+ | created_at | datetime | * | date_created | nil |
457
+ | description | string | * | description | nil |
458
+ | id | integer | * | id | nil |
459
+ | key | string | * | key | nil |
460
+ | namespace | string | * | namespace | nil |
461
+ | owner_id | integer | * | resource_id | nil |
462
+ | owner_resource | string | * | resource_type | nil |
463
+ | updated_at | datetime | * | date_modified | nil |
464
+ | value | string | * | value | nil |
465
+ | type | string | * | nil | nil |
466
+
467
+ *Note: Bigcommerce always assumes a type of String and a native attribute permission_set of "read_and_sf_access"
468
+
268
469
  </details>
269
470
 
471
+ <details>
472
+ <summary> ScriptTag </summary>
473
+
474
+ ### EPlat::ScriptTag
475
+
476
+ | Alias | Type | Shopify | BigCommerce | Etc |
477
+ |---------------|----------------|---------------|--------------------|-------------------|
478
+ | id | integer/string | id | uuid | |
479
+ | src | string | src | src | |
480
+ | created_at | datetime | created_at | date_created | |
481
+ | updated_at | datetime | updated_at | date_modified | |
482
+ | display_scope | string | display_scope | visibility | |
483
+ | event | string | event | nil | |
484
+ | cache | boolean | cache | nil | |
485
+
486
+ *display_scope available options: `online_store`, `order_status`, `all`
487
+
488
+ **Bigcommerce has some native attribute defaults set, which can be overwritten if needed:
489
+ `location: "head"`, `auto_uninstall: true`, `kind: "src"`, `load_method: "async"`, `name: "app-script"`, `enabled: true`
490
+
491
+
492
+ </details>
493
+
494
+ <details>
495
+ <summary> Webhook </summary>
496
+
497
+ ### EPlat::Webhook
498
+
499
+ | Alias | Type | Shopify | BigCommerce | Etc |
500
+ |-------------------------------|--------------|------------------------------|----------------------|-----|
501
+ | address | string | address | destination | |
502
+ | api_version | string | api_version | nil | |
503
+ | created_at | datetime/Int | created_at | created_at | |
504
+ | fields | array | fields | nil | |
505
+ | format | string | format | nil | |
506
+ | id | integer | id | id | |
507
+ | metafield_namespaces | array | metafield_namespaces | nil | |
508
+ | private_metafield_namespaces | array | private_metafield_namespaces | nil | |
509
+ | topic | string | topic | scope | |
510
+ | updated_at | datetime/Int | updated_at | updated_at | |
511
+
512
+ *EPlat doesn't make any attemps to alias the varias topic/scope values between platforms.
513
+ **Notice that BigCommerce uses updated_at and created_at for this resource.
514
+ Unfortunately it's in a Time Integer format. Haven't yet got dynamic conversion so just tread carefully.
515
+
516
+ </details>
517
+
518
+
519
+ <br>
520
+ <hr>
270
521
  <br>
271
522
 
272
- ## Todos
523
+ ## API Coverage
524
+
525
+ <details>
526
+ <summary> Base / Config</summary>
527
+
528
+ | Method | ShopifyAPI Gem equivalent | Shopify - tested | BigCom - tested
529
+ | -------------------------------------------- | ------------------------- | ----------------- | ------------------ |
530
+ | EPlat::Session.new() | ::Session.new | * | * |
531
+ | EPlat::Session.new() | ::Base.activate_session | * | * |
532
+ | EPlat::Session.new() | ::Session.setup() | * | * |
533
+ | EPlat.config.values[:shopify_api_version] | ::Baseapi_version | * | |
534
+ | EPlat.config.values[:bigcommerce_api_version] | ::Baseapi_version | | * |
535
+
536
+ </details>
537
+
538
+
539
+ <details>
540
+ <summary> Shop</summary>
541
+
542
+ | Method | Shopify - tested | BigCom - tested | Etc |
543
+ | ----------------------------- | ----------------- | ----------------- | ------ |
544
+ | ::Shop.current | * | * | |
545
+ | shop.attribute | * | * | |
546
+
547
+ </details>
548
+
549
+
550
+ <details>
551
+ <summary> Product</summary>
552
+
553
+ | Method | Shopify - tested | BigCom - tested | Etc |
554
+ | ----------------------------- | ----------------- | ----------------- | ------ |
555
+ | ::Product.last | * | * | |
556
+ | ::Product.all | * | * | |
557
+ | ::Product.attribute | * | * | |
558
+ | ::Product.find(id) | * | * | |
559
+ | ::Product.where(attr: '') | * | * | |
560
+ | ::Product.find_by(attr: '') | * | * | |
561
+ | ::Product.create(attr:) | * | * | |
562
+ | ::Product.save | * | * | |
563
+ | .save saves nested resources | * | | |
564
+ | ::Product.delete(id) | * | * | |
565
+ | ::Product.count | * | * | |
566
+ | product.dup | * | * | |
567
+ | product.variants | * | * | |
568
+ | product.find_variant(id) | * | * | |
569
+ | product.images | * | * | |
570
+ | products.next_page? | * | * | |
571
+ | products.previous_page? | * | * | |
572
+ | products.fetch_next_page | * | * | |
573
+ | products.fetch_previous_page | * | * | |
574
+ | products.previous_page_info | * | * | |
575
+ | products.next_page_info | * | * | |
576
+
577
+ ```ruby
578
+ # How you might safely handle pagination via user input
579
+ # <%= link_to "previous products", "/", page_info: products.previous_page_info %>
580
+ # <%= link_to "Next products", "/", page_info: products.next_page_info %>
581
+
582
+ EPlat::Product.find(:all, params: {limit: 2, Current.e_plat_session.pagination_param => params['page_info'] })
583
+ ```
584
+
585
+
586
+ ### Product::Variant
587
+
588
+ | Method | Shopify - tested | BigCom - tested | Etc |
589
+ | ----------------------------- | ----------------- | ----------------- | ------ |
590
+ | product.variants | * | * | |
591
+ | product.find_variant | * | * | |
592
+ | variants.attribute | * | * | |
593
+ | variant.attributes.delete | * | * | |
594
+ | variant.save | * | * | |
595
+
596
+ * Nested resources currently need to be saved on their own instance. product.variants.first.save, as opposed to product.save
597
+ * Also bear in mind that for platforms like BigCommerce, product and variant IDs are only unique within that store's context
598
+ * so if storing these IDs locally, remember to query via the shop i.e. shop.listings.where(platform_product_id: 123)
599
+
600
+ </details>
601
+
602
+
603
+ <details>
604
+ <summary> Order</summary>
605
+
606
+ | Method | Shopify - tested | BigCom - tested | Etc |
607
+ | ----------------------------- | ----------------- | ----------------- | ------ |
608
+ | ::Order.last | * | * | |
609
+ | ::Order.all | * | * | |
610
+ | ::Order.attribute | * | * | |
611
+ | ::Order.find(id) | * | * | |
612
+ | ::Order.where(title: '') | * | * | |
613
+ | ::Order.find_by(title: '') | * | * | |
614
+ | ::Order.create(attr: '', ) | * | * | |
615
+ | ::Order.new(attr: '', ) | * | * | |
616
+ | ::Order.save | * | * | |
617
+ | ::Order.count | * | * | |
618
+ | order.cancel | * | * | |
619
+ | orders.next_page? | * | nil | |
620
+ | orders.previous_page? | * | nil | |
621
+ | orders.fetch_next_page | * | nil | |
622
+ | orders.fetch_previous_page | * | nil | |
623
+
624
+ *included nested resources: can update non-resource nested hashes like shipping_address, but not proper resources like customer
625
+
626
+ </details>
627
+
628
+ <details>
629
+ <summary> Metafield </summary>
630
+
631
+ | Method | Shopify - tested | BigCom - tested | Etc |
632
+ | ----------------------------- | ----------------- | ----------------- | ------ |
633
+ | product.metafields | * | * | |
634
+ | order.metafields | * | * | |
635
+ | product.find_metafield(id) | * | * | |
636
+ | order.find_metafield(id) | * | * | |
637
+ | order.find_metafield(id) | * | * | |
638
+ | product.add_metafield(EPlat::Metafield.new {}) |* | * | |
639
+ | order.add_metafield(EPlat::Metafield.new {}) |* | * | |
640
+ | .attribute | * | * | |
641
+ | .save | * | * | |
642
+ | .destroy | * | * | |
643
+ | ::Metafield.create(attr: '') | * | * | |
644
+ | ::Metafield.new(attr: '') | * | * | |
645
+
646
+
647
+ </details>
648
+
649
+
650
+
651
+
652
+
653
+
654
+ <details>
655
+ <summary> ScriptTag</summary>
656
+
657
+ | Method | Shopify - tested | BigCom - tested | Etc |
658
+ | -------------------------------- | ----------------- | ----------------- | ------ |
659
+ | ::ScriptTag.new({}) | * | * | |
660
+ | ::ScriptTag.create({}) | * | * | |
661
+ | ::ScriptTag.last | * | * | |
662
+ | ::ScriptTag.all | * | * | |
663
+ | ::ScriptTag.find | * | * | |
664
+ | .attribute | * | * | |
665
+ | .save | * | * | |
666
+ | .destroy | * | * | |
667
+
668
+ *note that Bigcommerce uses UUID instead of ID for script tags. This should mostly be handled by EPlat, apart from when passing the value to .find
669
+
670
+ </details>
671
+
672
+ <details>
673
+ <summary> Webhook</summary>
674
+
675
+
676
+ | Method | Shopify - tested | BigCom - tested | Etc |
677
+ | -------------------------------- | ----------------- | ----------------- | ------ |
678
+ | ::Webhook.new({}) | * | * | |
679
+ | ::Webhook.create({}) | * | * | |
680
+ | ::Webhook.last | * | * | |
681
+ | ::Webhook.all | * | * | |
682
+ | ::Webhook.find | * | * | |
683
+ | .attribute | * | * | |
684
+ | .save | * | * | |
685
+ | .destroy | * | * | |
686
+
687
+ </details>
688
+
689
+
690
+ <details>
691
+ <summary>Shopify only</summary>
692
+
693
+ These areas of the API will just support Shopify.
694
+
695
+ ### RecurringApplicationCharge
696
+
697
+ | Method | Shopify - tested |
698
+ | -------------------------------------- | ----------------- |
699
+ | ::RecurringApplicationCharge.current | * |
700
+ | ::RecurringApplicationCharge.new({}) | * |
701
+ | ::RecurringApplicationCharge.create({})| * |
702
+ | ::RecurringApplicationCharge.last | * |
703
+ | ::RecurringApplicationCharge.all | * |
704
+ | ::RecurringApplicationCharge.find | * |
705
+ | .attribute | * |
706
+ | .save | * |
707
+ | .cancel | * |
708
+ | .destroy | * |
709
+ | .usage_charges | * |
710
+
711
+ *The .current charge is the active charge for the app with the session's store. Only one charge can be active at any time.
712
+
713
+ <br>
714
+
715
+ ### RecurringApplicationCharge::UsageCharge
716
+
717
+ | Method | Shopify - tested |
718
+ | --------------------------------------------------------------------- | ----------------- |
719
+ | ::UsageCharge.last(params: {recurring_application_charge: r.id}) | * |
720
+ | ::UsageCharge.all(params: {recurring_application_charge: r.id}) | * |
721
+ | ::UsageCharge.find(id, params: {recurring_application_charge: r.id}) | * |
722
+ | ::UsageCharge.new({recurring_application_charge_id: r.id, ...}) | * |
723
+ | ::UsageCharge.create({recurring_application_charge_id: r.id, ...}) | * |
724
+ | .save | * |
725
+ | .attribute | * |
726
+
727
+ *Note no :update or :delete options supported.
728
+ ** the recurring_application_charge_id has to be passed to any requests called on the class.
729
+
730
+ <br>
731
+ </details>
732
+
733
+
734
+ <details>
735
+ <summary> Outside of the scope of EPlat </summary>
736
+
737
+ <ul>
738
+ <li>
739
+ <strong>ShopifyAPI::Asset</strong> is depricated.
740
+ (check_for_store_two_pont_o in main app code.)
741
+ </li>
742
+ <li>
743
+ <strong>ShopifyAPI::AccessScope</strong> doesn't have other platform API equivilents.
744
+ (although should be kept track of locally)
745
+ </li>
746
+ <li>
747
+ <strong>GraphQL</strong>. EPlat just handles REST
748
+ <ul>
749
+ </details>
750
+
751
+ <br>
752
+
753
+
754
+
755
+ <hr>
756
+ <br>
273
757
 
274
- <ul>
275
- <li>
276
- Get BigCommerce request of shop working
277
- </li>
278
- <li>
279
- find_by and where don't seem to work for big commerce
280
- </li>
281
- </ul>
282
758
 
283
759
 
284
760
  ## Request Syntax
285
761
 
286
762
  ```ruby
763
+ ### activate session
764
+ EPlat::Session.new(
765
+ platform: :shopify,
766
+ store_url: "hi.myshopify.com",
767
+ api_token: 11223344
768
+ )
769
+
287
770
  ### create new record
288
- product = EPlat::Product.new(:title => 't-shirt')
771
+ product = EPlat::Product.new(title: 't-shirt')
289
772
  product.save
290
773
  # or...
291
- EPlat::Product.create(:title => 't-shirt')
774
+ EPlat::Product.create(title: 't-shirt')
292
775
  new_product = product.dup #duplicates entry without saving
293
776
 
294
777
  ### delete record
@@ -297,41 +780,57 @@ EPlat::Product.delete(params[:id])
297
780
  EPlat::Product.find(my_id).destroy
298
781
 
299
782
  ### save record
300
- product = EPlat::Product.new(:title => 't-shirt')
783
+ product = EPlat::Product.new(title: 't-shirt')
301
784
  product.save
302
785
 
786
+ product.full_response # <Net::HTTPOK>
787
+ product.headers # { "date"=>"Fri, 17 Nov 2023 14:25:53 GMT", ...}
788
+ JSON.parse(product.full_response.body) # "{...}"
789
+
303
790
  ### get records
304
- EPlat::Product.find(1) # => GET /product/1.json (or EPlat::Product.first(args)) (or EPlat::Product.last(args))
305
- EPlat::Product.find(:all) # => GET /people.json
306
- EPlat::Product.find(:all, :params => { :title => "tshirt" }) # => GET /product.json?title=tshirt
307
- EPlat::Product.find(:one, :from => :leader) # => GET /product/leader.json
308
- EPlat::Product.find(:one, :from => "/product/1/specific_url.json") # => GET /product/1/specific_url.json
791
+ EPlat::Product.find(101) # GET EPlat::Product.first(args)) (or EPlat::Product.last(args))
792
+ EPlat::Product.all
793
+ EPlat::Product.last
794
+ EPlat::Product.where(title: "tshirt") # GET ?title=tshirt
795
+ EPlat::Product.find_by(title: "tshirt") # GET ?title=tshirt &.first
796
+ EPlat::Product.find(:all, params: {title: "tshirt"}) # ?title=tshirt
797
+
798
+ EPlat::Product.find(99, from: :leader) # GET /platforms_resource_path/leader.json
799
+ EPlat::Product.find(99, from: "/product/1/specific_url.json") #GET /product/1/specific_url.json
800
+
801
+ ### count records
802
+ EPlat::Product.count # 2
803
+
804
+ # Nested resources - pass in the parent resource's ID to the params hash
805
+ EPlat::Product::Variant.find(variant_id, params: {product: product.id}) # /admin/api/2024-01/products/{{ product.id }}/variants/{{ variant_id }}.json
806
+ EPlat::Product::Variant.collection_path(product: 5) # /admin/api/2024-01/products/5/variants.json
309
807
 
310
808
 
311
- #### options
312
- #prefix_options for nested URLs
313
- EPlat::Product::Variant.collection_path(:variant_id => 5) # => /products/5/variants.json
314
- #returns a EPlat::Product::Variant instance
315
809
 
316
- # query_options to add to params ?x=y
317
- EPlat::Product.find(:all, query_options: {test: "is it?"})
318
810
  ```
811
+ <br>
319
812
 
320
813
 
321
- ## Resource Syntax
814
+ ## Attribute info
322
815
 
323
816
  ```ruby
324
- #get clients shop
325
- shop = EPlat::Shop.current
326
817
 
327
- #to return all native platform attributes
328
- EPlat::Product.new({}).attributes
818
+ # Attributes
819
+ product.attributes #return all native platform attributes
820
+ product.mapped_attributes.entries #return all mapped e_plat attributes for a resource
821
+
822
+ # Attribute keys
823
+ product.native_keys #An array of the native attribute keys
824
+ product.mapped_attributes. #An array of the e_plat attribute keys
329
825
 
330
- #see all of the successfully mapped aliases for a resource
331
- EPlat::Product.new({}).mapped_attributes.entries
826
+ # look up mapping
827
+ product.mapping.aliases # a hash of the mapped aliases. {native_attribute => e_plat_attribute, ...}
828
+ product.mapped? "body_html" #check if a platforms resource is mapped to a specific EPlat alias
332
829
 
333
- #check if a platforms resource is mapped to a specific EPlat alias
334
- EPlat::Product.new({}).mapped? "body_html"
830
+ # In the context of a Bigcommerce product that has aliases:
831
+ product.changed_attributes # {}
832
+ product.name = oi
833
+ product.changed_attributes # {"name"=>"hey", "title"=>"hey"}
335
834
 
336
835
  ```
337
836