e_plat 0.6.0 → 0.7.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +84 -54
  3. data/lib/e_plat/client/default_request_args.rb +1 -1
  4. data/lib/e_plat/client.rb +34 -8
  5. data/lib/e_plat/mapping/bigcommerce/v_3/product/option.rb +58 -0
  6. data/lib/e_plat/mapping/bigcommerce/v_3/product/variant/option_value.rb +42 -0
  7. data/lib/e_plat/mapping/shopify/v_2024_07/metafield.rb +26 -0
  8. data/lib/e_plat/mapping/shopify/v_2024_07/order/billing_address.rb +14 -0
  9. data/lib/e_plat/mapping/shopify/v_2024_07/order/shipping_address.rb +30 -0
  10. data/lib/e_plat/mapping/shopify/v_2024_07/order.rb +26 -0
  11. data/lib/e_plat/mapping/shopify/v_2024_07/product/image.rb +52 -0
  12. data/lib/e_plat/mapping/shopify/v_2024_07/product/option.rb +45 -0
  13. data/lib/e_plat/mapping/shopify/v_2024_07/product/variant/option_value.rb +58 -0
  14. data/lib/e_plat/mapping/shopify/v_2024_07/product/variant.rb +180 -0
  15. data/lib/e_plat/mapping/shopify/v_2024_07/product.rb +100 -0
  16. data/lib/e_plat/mapping/shopify/v_2024_07/script_tag.rb +26 -0
  17. data/lib/e_plat/mapping/shopify/v_2024_07/shop.rb +26 -0
  18. data/lib/e_plat/mapping/shopify/v_2024_07/webhook.rb +29 -0
  19. data/lib/e_plat/mapping/virtual_collection/shopify/product/variant/option_value.rb +272 -0
  20. data/lib/e_plat/resource/base.rb +24 -2
  21. data/lib/e_plat/resource/collection.rb +45 -16
  22. data/lib/e_plat/resource/concerns/aliases.rb +39 -19
  23. data/lib/e_plat/resource/concerns/dirty.rb +12 -8
  24. data/lib/e_plat/resource/concerns/graph_q_lable.rb +253 -0
  25. data/lib/e_plat/resource/concerns/overwrite_instance_methods.rb +4 -4
  26. data/lib/e_plat/resource/concerns/overwrite_request_methods.rb +1 -1
  27. data/lib/e_plat/resource/countable.rb +37 -10
  28. data/lib/e_plat/resource/platform_specific/bigcommerce/product/variant/option_value.rb +2 -0
  29. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/input/product/variant.rb +47 -0
  30. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/input/product/variants_bulk.rb +47 -0
  31. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/input/product.rb +23 -0
  32. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/input.rb +98 -0
  33. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/mutation/product/variant.rb +78 -0
  34. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/mutation/product.rb +55 -0
  35. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/mutation.rb +5 -0
  36. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/query/product/variant.rb +44 -0
  37. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/query/product.rb +58 -0
  38. data/lib/e_plat/resource/platform_specific/shopify/graph_q_l/v_2024_07/query.rb +5 -0
  39. data/lib/e_plat/resource/platform_specific/shopify/product/image.rb +13 -1
  40. data/lib/e_plat/resource/platform_specific/shopify/product/option.rb +13 -1
  41. data/lib/e_plat/resource/platform_specific/shopify/product/variant/option_value.rb +14 -0
  42. data/lib/e_plat/resource/platform_specific/shopify/product/variant.rb +65 -1
  43. data/lib/e_plat/resource/platform_specific/shopify/product.rb +77 -2
  44. data/lib/e_plat/resource/product/image.rb +8 -5
  45. data/lib/e_plat/resource/product/option.rb +2 -3
  46. data/lib/e_plat/resource/product/variant/option_value.rb +17 -0
  47. data/lib/e_plat/resource/product/variant.rb +4 -10
  48. data/lib/e_plat/resource/product.rb +23 -11
  49. data/lib/e_plat/session.rb +3 -2
  50. data/lib/e_plat/type_coercer.rb +3 -1
  51. data/lib/e_plat/version.rb +1 -1
  52. data/lib/e_plat.rb +12 -3
  53. data/lib/hash.rb +39 -0
  54. metadata +130 -27
@@ -0,0 +1,180 @@
1
+
2
+
3
+ module EPlat
4
+ class Mapping
5
+ module Shopify
6
+ module V202407
7
+ class Product
8
+ class Variant < EPlat::Mapping::Base
9
+ include_root_in_request_body true
10
+ virtual_collection :option_values, class: EPlat::Mapping::VirtualCollection::Shopify::Product::Variant::OptionValue, map_from: "selected_options"
11
+
12
+ def native_top_key
13
+ :itself
14
+ end
15
+
16
+ def native_attributes
17
+ super
18
+ end
19
+
20
+ def native_attribute_aliases
21
+ super.concat([
22
+ {
23
+ existing_entry: {native_key: "id", e_plat_key: "id",
24
+ custom_e_plat_getter: '-> { (_1.is_a? Integer) ? _1 : _1&.split("/")&.last }',
25
+ custom_native_setter: '-> { (_1.is_a? String) ? _1 : "gid://shopify/ProductVariant/#{_1}" }'
26
+ }
27
+ },
28
+ {
29
+ existing_entry: {native_key: "title", e_plat_key: "title"}
30
+ },
31
+ {
32
+ existing_entry: {native_key: "price", e_plat_key: "price"}
33
+ },
34
+ {
35
+ existing_entry: {native_key: "sku", e_plat_key: "sku",
36
+ custom_e_plat_getter: '-> { _1 }',
37
+ custom_native_setter: '-> do
38
+ inventory_item.sku = _1;
39
+ inventory_item.attribute_will_change!("sku");
40
+ _1
41
+ end'
42
+ }
43
+ },
44
+ {
45
+ existing_entry: {native_key: "position", e_plat_key: "position"}
46
+ },
47
+ {
48
+ existing_entry: {native_key: "inventory_policy", e_plat_key: "inventory_policy",
49
+ custom_e_plat_getter: '-> { _1&.downcase }',
50
+ custom_native_setter: '-> { _1&.upcase }'
51
+ }
52
+ },
53
+ {
54
+ existing_entry: {native_key: "compare_at_price", e_plat_key: "compare_at_price"}
55
+ },
56
+ {
57
+ alias_attribute: {native_key: "inventory_item[tracked]", e_plat_key: "inventory_management"}
58
+ },
59
+ {
60
+
61
+ existing_entry: {native_key: "created_at", e_plat_key: "created_at"}
62
+ },
63
+ {
64
+ existing_entry: {native_key: "updated_at", e_plat_key: "updated_at"}
65
+ },
66
+ {
67
+ existing_entry: {native_key: "taxable", e_plat_key: "taxable"}
68
+ },
69
+ {
70
+ existing_entry: {native_key: "barcode", e_plat_key: "barcode"}
71
+ },
72
+ {
73
+ alias_attribute: {native_key: "inventory_item[measurement][weight][unit]", e_plat_key: "weight_unit",
74
+ custom_native_setter: '-> { warn("Setting weight_unit directly is not supported on ProductVariant via GraphQL."); _1 }'
75
+ }
76
+ },
77
+ {
78
+ alias_attribute: {native_key: "inventory_item[measurement][weight][value]", e_plat_key: "weight",
79
+ custom_native_setter: '-> { warn("Setting weight directly is not supported on ProductVariant via GraphQL."); _1 }'
80
+ }
81
+ },
82
+ {
83
+ alias_attribute: {native_key: "inventory_item[id]", e_plat_key: "inventory_item_id",
84
+ custom_e_plat_getter: '-> { _1&.split("/")&.last }',
85
+ custom_native_setter: '-> { "gid://shopify/InventoryItem/#{_1}" }'
86
+ }
87
+ },
88
+ {
89
+ existing_entry: {native_key: "inventory_quantity", e_plat_key: "inventory_quantity",
90
+ custom_native_setter: '-> { warn("Setting inventory_quantity directly is not supported on ProductVariant via GraphQL."); _1 }'
91
+ }
92
+ },
93
+ {
94
+ existing_entry: {native_key: "tax_code", e_plat_key: "tax_code"}
95
+ },
96
+ {
97
+ alias_attribute: {native_key: "inventory_item[requires_shipping]", e_plat_key: "requires_shipping",
98
+ custom_native_setter: '-> { warn("Setting requires_shipping directly is not supported on ProductVariant via GraphQL."); _1 }'
99
+ }
100
+ },
101
+ {
102
+ existing_entry: {native_key: "fulfillment_service", e_plat_key: "fulfillment_service"}
103
+ },
104
+ {
105
+ existing_entry: {native_key: "grams", e_plat_key: "grams", # doesnt exist on any current API but we create it
106
+ custom_e_plat_getter: '-> {
107
+ _1
108
+ case weight_unit
109
+ when "GRAMS", "grams", "g"
110
+ weight
111
+ when "KILOGRAMS", "kilograms", "kg"
112
+ weight * 1000
113
+ when "OUNCES", "ounces", "oz"
114
+ weight * 28.3495
115
+ when "POUNDS", "pounds", "lb"
116
+ weight * 453.592
117
+ else
118
+ weight
119
+ end
120
+ }',
121
+ custom_native_setter: '-> {
122
+ warn("Setting grams directly is not supported on ProductVariant via GraphQL. Mutate the inventoryItem.measurement.weight object `value` field instead")
123
+ case weight_unit
124
+ when "GRAMS", "grams", "g"
125
+ _1
126
+ when "KILOGRAMS", "kilograms", "kg"
127
+ _1 / 1000
128
+ when "OUNCES", "ounces", "oz"
129
+ _1 / 28.3495
130
+ when "POUNDS", "pounds", "lb"
131
+ _1 / 453.592
132
+ else
133
+ _1
134
+ end
135
+ }'
136
+ }
137
+ }
138
+
139
+ ])
140
+ end
141
+
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ # RESOURCE
150
+ # integer :id
151
+ # integer :product_id
152
+ # string :title
153
+ # string :price
154
+ # string :sku
155
+ # integer :position
156
+ # string :inventory_policy
157
+ # string :compare_at_price
158
+ # string :fulfillment_service
159
+ # string :inventory_management
160
+ # datetime :created_at
161
+ # datetime :updated_at
162
+ # boolean :taxable
163
+ # string :barcode
164
+ # integer :grams
165
+ # integer :image_id
166
+ # float :weight
167
+ # string :weight_unit
168
+ # integer :inventory_item_id
169
+ # integer :inventory_quantity
170
+ # string :tax_code
171
+ # boolean :requires_shipping
172
+ # string :admin_graphql_api_id
173
+
174
+
175
+ # fields without setter support
176
+ # | grams | integer | getter only: converted node.inventoryItem[measurement][weight][value] | nil | nil |
177
+ # | weight | float | getter only: node.inventoryItem[measurement][weight][value] | weight |
178
+ # | weight_unit | string | getter only: node.inventoryItem[measurement][weight][unit] | nil |
179
+ # | inventory_item_id | integer | getter only: node.inventoryItem[id]| nil | nil |
180
+ # | inventory_quantity | integer | getter only: node.inventoryQuantity | inventory_level
@@ -0,0 +1,100 @@
1
+ module EPlat
2
+ class Mapping
3
+ module Shopify
4
+ module V202407 #< :module
5
+ class Product < EPlat::Mapping::Base
6
+
7
+ def native_top_key
8
+ "product"
9
+ end
10
+
11
+ def native_attributes
12
+ super.concat([
13
+ "id",
14
+ "descriptionHtml",
15
+ "createdAt",
16
+ "updatedAt",
17
+ "handle",
18
+ "productType",
19
+ "publishedAt",
20
+ "publishedScope",
21
+ "status",
22
+ "tags",
23
+ "templateSuffix",
24
+ "title",
25
+ "vendor"
26
+ ])
27
+ end
28
+
29
+ def native_attribute_aliases
30
+ super.concat([
31
+ {
32
+ alias_attribute: {native_key: "description_html", e_plat_key: "body_html"}
33
+ },
34
+ {
35
+ existing_entry: {native_key: "created_at", e_plat_key: "created_at"}
36
+ },
37
+ {
38
+ existing_entry: {native_key: "updated_at", e_plat_key: "updated_at"}
39
+ },
40
+ {
41
+ existing_entry: {native_key: "handle", e_plat_key: "handle"}
42
+ },
43
+ {
44
+ existing_entry: {native_key: "product_type", e_plat_key: "product_type"}
45
+ },
46
+ {
47
+ existing_entry: {native_key: "published_at", e_plat_key: "published_at"}
48
+ },
49
+ {
50
+ existing_entry: {native_key: "status", e_plat_key: "status",
51
+ custom_e_plat_getter: '-> { _1&.downcase }',
52
+ custom_native_setter: '-> { _1&.upcase }'
53
+ }
54
+ },
55
+ {
56
+ existing_entry: {native_key: "tags", e_plat_key: "tags",
57
+ custom_e_plat_getter: "-> { _1&.join(',') }",
58
+ custom_native_setter: "-> { _1&.split(',') }"
59
+ }
60
+ },
61
+ {
62
+ existing_entry: {native_key: "id", e_plat_key: "id",
63
+ custom_e_plat_getter: '-> { (_1.is_a? Integer) ? _1 : _1&.split("/")&.last }',
64
+ custom_native_setter: '-> { (_1.is_a? String) ? _1 : "gid://shopify/Product/#{_1}" }'
65
+ }
66
+ },
67
+ {
68
+ existing_entry: {native_key: "template_suffix", e_plat_key: "template_suffix"}
69
+ },
70
+ {
71
+ existing_entry: {native_key: "title", e_plat_key: "title"}
72
+ },
73
+ {
74
+ existing_entry: {native_key: "vendor", e_plat_key: "vendor"}
75
+ }
76
+ ])
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+
85
+ # string :body_html
86
+ # datetime :created_at
87
+ # string :handle
88
+ # integer :id
89
+ # array :images
90
+ # array :options
91
+ # string :product_type
92
+ # datetime :published_at
93
+ # string :status
94
+ # string :tags
95
+ # string :admin_graphql_api_id
96
+ # string :template_suffix
97
+ # string :title
98
+ # datetime :updated_at
99
+ # array :variants
100
+ # string :vendor
@@ -0,0 +1,26 @@
1
+ module EPlat
2
+ class Mapping
3
+ module Shopify
4
+ module V202407 #< :module
5
+ class ScriptTag < EPlat::Mapping::Base
6
+
7
+ def native_top_key
8
+ "script_tag"
9
+ end
10
+
11
+ def native_attributes
12
+ super.concat([
13
+ ])
14
+ end
15
+
16
+ def native_attribute_aliases
17
+ super.concat([
18
+ ])
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,26 @@
1
+ module EPlat
2
+ class Mapping
3
+ module Shopify
4
+ module V202407 #< :module
5
+ class Shop < EPlat::Mapping::Base
6
+
7
+ def native_top_key
8
+ "shop"
9
+ end
10
+
11
+ def native_attributes
12
+ super.concat([
13
+ ])
14
+ end
15
+
16
+ def native_attribute_aliases
17
+ super.concat([
18
+ ])
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,29 @@
1
+ module EPlat
2
+ class Mapping
3
+ module Shopify
4
+ module V202407 #< :module
5
+ class Webhook < EPlat::Mapping::Base
6
+ DEFAULT_VALUES = {
7
+ format: "json"
8
+ }
9
+
10
+ def native_top_key
11
+ "webhook"
12
+ end
13
+
14
+ def native_attributes
15
+ super.concat([
16
+ ])
17
+ end
18
+
19
+ def native_attribute_aliases
20
+ super.concat([
21
+ ])
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,272 @@
1
+
2
+ module EPlat
3
+ class Mapping
4
+ module VirtualCollection
5
+ module Shopify
6
+ module Product
7
+ module Variant
8
+ class OptionValue < VirtualCollection::Base
9
+ attr_accessor :resource
10
+
11
+ def initialize(resource:, map_from:)
12
+ @resource = resource
13
+ super
14
+
15
+ return unless @resource.try :selected_options
16
+
17
+ @resource.option_values =
18
+ @resource.selected_options.map.with_index do |data, i|
19
+ item = EPlat::Product::Variant::OptionValue.new(variant_id: @resource.id)
20
+ item.mapping.virtual_collection = self
21
+ item.add_aliases!(native_attribute_aliases(i), EPlat::Product::Variant::OptionValue.schema)
22
+
23
+ item
24
+ end
25
+ end
26
+
27
+ def native_attribute_aliases(i)
28
+ [
29
+ {
30
+ alias_attribute: {
31
+ native_key: "[selected_options][#{i}][option_value][id]",
32
+ e_plat_key: "id",
33
+ virtual_collection: true,
34
+ custom_e_plat_getter: '-> { _1&.split("/")&.last }',
35
+ custom_native_setter: '-> { "gid://shopify/ProductOptionValue/#{_1}" }'
36
+ }
37
+ },
38
+ {
39
+ alias_attribute: {
40
+ native_key: "[selected_options][#{i}][name]",
41
+ e_plat_key: "name",
42
+ virtual_collection: true
43
+ }
44
+ },
45
+ {
46
+ alias_attribute: {
47
+ native_key: "[selected_options][#{i}][value]",
48
+ e_plat_key: "value",
49
+ virtual_collection: true
50
+ }
51
+ }
52
+ ]
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+
66
+ # consignments are deliveries, we're just going to operate within the context on one delivery per order
67
+ # this should be reasonable to tie us over for now
68
+
69
+ # integer :id
70
+ # string :admin_graphql_api_id
71
+ # integer :fulfillable_quantity
72
+ # string :fulfillment_service
73
+ # string :fulfillment_status
74
+ # boolean :gift_card
75
+ # integer :grams
76
+ # string :name
77
+ # string :price
78
+ # hash :price_set
79
+ # boolean :product_exists
80
+ # integer :product_id
81
+ # array :properties
82
+ # integer :quantity
83
+ # boolean :requires_shipping
84
+ # string :sku
85
+ # boolean :taxable
86
+ # string :title
87
+ # string :total_discount
88
+ # hash :total_discount_set
89
+ # integer :variant_id
90
+ # string :variant_inventory_management
91
+ # string :variant_title
92
+ # string :vendor
93
+ # array :tax_lines
94
+ # array :duties
95
+ # array :discount_allocations
96
+
97
+
98
+ # BG = {
99
+ # "consignments": [
100
+ # {
101
+ # "pickups": [],
102
+ # "shipping": [
103
+ # {
104
+ # "id": 3,
105
+ # "first_name": "Jane",
106
+ # "last_name": "Doe",
107
+ # "company": "",
108
+ # "street_1": "123 Main Street",
109
+ # "street_2": "",
110
+ # "city": "Austin",
111
+ # "zip": "78751",
112
+ # "country": "United States",
113
+ # "country_iso2": "US",
114
+ # "state": "Texas",
115
+ # "email": "oli@example.com",
116
+ # "phone": "",
117
+ # "form_fields": [],
118
+ # "line_items": [
119
+ # {
120
+ # "id": 3,
121
+ # "order_id": 102,
122
+ # "product_id": 88,
123
+ # "variant_id": 81,
124
+ # "order_pickup_method_id": 0,
125
+ # "order_address_id": 3,
126
+ # "name": "Chemex Coffeemaker",
127
+ # "name_customer": "Chemex Coffeemaker",
128
+ # "name_merchant": "Chemex Coffeemaker",
129
+ # "sku": "CC3C-SM",
130
+ # "upc": "",
131
+ # "type": "physical",
132
+ # "base_price": "83.3300",
133
+ # "price_ex_tax": "83.3300",
134
+ # "price_inc_tax": "83.3300",
135
+ # "price_tax": "0.0000",
136
+ # "base_total": "83.3300",
137
+ # "total_ex_tax": "83.3300",
138
+ # "total_inc_tax": "83.3300",
139
+ # "total_tax": "0.0000",
140
+ # "weight": "1.0000",
141
+ # "width": "0.0000",
142
+ # "height": "0.0000",
143
+ # "depth": "0.0000",
144
+ # "quantity": 1,
145
+ # "base_cost_price": "0.0000",
146
+ # "cost_price_inc_tax": "0.0000",
147
+ # "cost_price_ex_tax": "0.0000",
148
+ # "cost_price_tax": "0.0000",
149
+ # "is_refunded": false,
150
+ # "quantity_refunded": 0,
151
+ # "refund_amount": "0.0000",
152
+ # "return_id": 0,
153
+ # "wrapping_id": 0,
154
+ # "wrapping_name": "",
155
+ # "base_wrapping_cost": "0.0000",
156
+ # "wrapping_cost_ex_tax": "0.0000",
157
+ # "wrapping_cost_inc_tax": "0.0000",
158
+ # "wrapping_cost_tax": "0.0000",
159
+ # "wrapping_message": "",
160
+ # "quantity_shipped": 0,
161
+ # "event_name": null,
162
+ # "event_date": null,
163
+ # "fixed_shipping_cost": "0.0000",
164
+ # "ebay_item_id": "",
165
+ # "ebay_transaction_id": "",
166
+ # "option_set_id": 18,
167
+ # "parent_order_product_id": null,
168
+ # "is_bundled_product": false,
169
+ # "bin_picking_number": "0",
170
+ # "external_id": "",
171
+ # "fulfillment_source": "",
172
+ # "brand": "",
173
+ # "gift_certificate_id": null,
174
+ # "applied_discounts": [],
175
+ # "product_options": [
176
+ # {
177
+ # "id": 2,
178
+ # "option_id": 34,
179
+ # "order_product_id": 3,
180
+ # "product_option_id": 114,
181
+ # "display_name": "Size",
182
+ # "display_name_customer": "Size",
183
+ # "display_name_merchant": "Size",
184
+ # "display_value": "Small",
185
+ # "display_value_customer": "Small",
186
+ # "display_value_merchant": "Small",
187
+ # "value": "101",
188
+ # "type": "Multiple choice",
189
+ # "name": "Size1699441692-88",
190
+ # "display_style": "Dropdown"
191
+ # }
192
+ # ],
193
+ # "configurable_fields": [],
194
+ # "discounted_total_inc_tax": "83.3300"
195
+ # }
196
+ # ]
197
+ # }
198
+ # ],
199
+ # "items_total": 1,
200
+ # "items_shipped": 0,
201
+ # "shipping_method": "None",
202
+ # "base_cost": 0,
203
+ # "cost_ex_tax": 0,
204
+ # "cost_inc_tax": 0,
205
+ # "cost_tax": 0,
206
+ # "cost_tax_class_id": 0,
207
+ # "base_handling_cost": 0,
208
+ # "handling_cost_ex_tax": 0,
209
+ # "handling_cost_inc_tax": 0,
210
+ # "handling_cost_tax": 0,
211
+ # "handling_cost_tax_class_id": 0,
212
+ # "shipping_zone_id": 0,
213
+ # "shipping_zone_name": "",
214
+ # "shipping_quotes": {
215
+ # "url": "https://api.bigcommerce.com/stores/d0kmq3bory/v2/orders/102/consignments/shipping/3/shipping_quotes",
216
+ # "resource": "/orders/102/consignments/shipping/3/shipping_quotes"
217
+ # }
218
+ # }
219
+ # ]
220
+ # }
221
+
222
+ # Shopify = {
223
+ # "line_items": [
224
+ # {
225
+ # "id": 13120677806211,
226
+ # "admin_graphql_api_id": "gid://shopify/LineItem/13120677806211",
227
+ # "fulfillable_quantity": 1,
228
+ # "fulfillment_service": "manual",
229
+ # "fulfillment_status": null,
230
+ # "gift_card": false,
231
+ # "grams": 0,
232
+ # "name": "Winter Luggage - Sienna the longest name variant in the world",
233
+ # "price": "150.00",
234
+ # "price_set": {
235
+ # "shop_money": {
236
+ # "amount": "150.00",
237
+ # "currency_code": "GBP"
238
+ # },
239
+ # "presentment_money": {
240
+ # "amount": "150.00",
241
+ # "currency_code": "GBP"
242
+ # }
243
+ # },
244
+ # "product_exists": true,
245
+ # "product_id": 6610509627523,
246
+ # "properties": [],
247
+ # "quantity": 1,
248
+ # "requires_shipping": true,
249
+ # "sku": "skusku123",
250
+ # "taxable": true,
251
+ # "title": "Winter Luggage",
252
+ # "total_discount": "0.00",
253
+ # "total_discount_set": {
254
+ # "shop_money": {
255
+ # "amount": "0.00",
256
+ # "currency_code": "GBP"
257
+ # },
258
+ # "presentment_money": {
259
+ # "amount": "0.00",
260
+ # "currency_code": "GBP"
261
+ # }
262
+ # },
263
+ # "variant_id": 39428269408387,
264
+ # "variant_inventory_management": "shopify",
265
+ # "variant_title": "Sienna the longest name variant in the world",
266
+ # "vendor": "PreProduct Test",
267
+ # "tax_lines": [],
268
+ # "duties": [],
269
+ # "discount_allocations": []
270
+ # }
271
+ # ]
272
+ # }
@@ -4,6 +4,7 @@ module EPlat
4
4
  class Base < ActiveResource::Base
5
5
  include Concerns::OverwriteRequestMethods, Concerns::OverwriteInstanceMethods
6
6
  include Concerns::Aliases, Concerns::Dirty, Concerns::FullJson
7
+ include Concerns::GraphQLable
7
8
 
8
9
  self.connection_class = EPlat::Connection
9
10
  self.collection_parser = EPlat::Collection
@@ -92,6 +93,7 @@ module EPlat
92
93
 
93
94
  @mapped_attributes = ensure_e_plat_attributes!
94
95
  ensure_native_attributes!
96
+
95
97
  add_aliases!(mapping.native_attribute_aliases, type_schema || {})
96
98
  end
97
99
 
@@ -105,7 +107,7 @@ module EPlat
105
107
 
106
108
  def native_keys
107
109
  if client.shopify?
108
- schema.keys # EPlat uses Shopify's schema, so keys are always native
110
+ @mapping.native_attributes.presence || schema.keys # EPlat uses Shopify's schema, apar from a couple of Graphql only fields
109
111
  elsif mapping.class.to_s != EPlat::Mapping::Base && @mapping.native_attributes.present?
110
112
  @mapping.native_attributes.presence
111
113
  else
@@ -126,6 +128,26 @@ module EPlat
126
128
 
127
129
  top_level_resource?
128
130
  end
131
+
132
+ def formatted_id(id)
133
+ return id unless client.shopify? && client.api_version != "2024_01"
134
+ return if id.to_s.include?("gid://")
135
+
136
+ case element_name
137
+ when "product"
138
+ "gid://shopify/Product/#{id}"
139
+ when "variant"
140
+ "gid://shopify/ProductVariant/#{id}"
141
+ when "image"
142
+ "gid://shopify/ProductImage/#{id}"
143
+ else
144
+ raise EPlat::Errors.new("Unsupported element name")
145
+ end
146
+ end
147
+
148
+ def graphql_input
149
+ raise EPlat::Error.new("GraphQL input not supported for this resource and platform")
150
+ end
129
151
 
130
152
  private
131
153
 
@@ -134,7 +156,7 @@ module EPlat
134
156
  end
135
157
 
136
158
  def ensure_native_attributes!
137
- return if client.shopify? # EPlat uses Shopify's schema
159
+ return if client.shopify? && EPlat.config.shopify_api_version == "2024_01"
138
160
 
139
161
  AttributeInterface.new(self, keys: native_keys)
140
162
  end