shopify_oracle 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 431af632e49a61cea23e3606be12a3040b5183a351229a53cf4fc27f387d9363
4
+ data.tar.gz: 74ab32a60f133889b2ea6048672725709ffdeae8abd130beb4e8b6bb5db421e3
5
+ SHA512:
6
+ metadata.gz: 675da738016eb86aff429354012e318cb830feb314826137315e4b7cfd8b895f83e152587dca174cc366dad983f3d145bb6c82ee94287593dd1d42e506a1972e
7
+ data.tar.gz: e19467c647f5ce7666a6b6ddbb8f97a81b33cf90a3938da45030315b97731a022e2f435af73ab43adc32a3fbf9c654e1cc41bd1079c33ce7eb2d49771bb75224
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Accessor
5
+ class Base
6
+ class << self
7
+ def list(first: 10)
8
+ ShopifyOracle.query(class_name.underscore.pluralize, first:)
9
+ end
10
+
11
+ def find(id:)
12
+ ShopifyOracle.query(class_name.underscore, id:)
13
+ end
14
+
15
+ def class_name
16
+ name.split('::').last
17
+ end
18
+ end
19
+
20
+ attr_reader :gid, :object
21
+
22
+ def initialize(id:, object_class: Hash)
23
+ @oracle = ShopifyOracle
24
+
25
+ class_name = self.class.name.split('::').last
26
+ object_class_name = class_name.camelize(:lower)
27
+
28
+ @gid = id.is_a?(Integer) ? "gid://shopify/#{class_name}/#{id}" : id
29
+
30
+ object = self.class.find(id: @gid, oracle: @oracle).body['data'][object_class_name]
31
+ @object = JSON.parse(object.to_json, object_class:)
32
+ end
33
+
34
+ def reload
35
+ object = self.class.find(id: @gid, oracle: @oracle).body['data'][object_class]
36
+ @object = JSON.parse(object.to_json, object_class:)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Accessor
5
+ class Customer < Base
6
+ attr_reader :customer
7
+
8
+ def initialize(id:, oracle: nil)
9
+ super
10
+ @customer = @object
11
+ end
12
+
13
+ def reload
14
+ super
15
+ @customer = @object
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Accessor
5
+ class SellingPlanGroup < Base
6
+ class << self
7
+ def create(name:)
8
+ ShopifyOracle.mutate(:create_selling_plan_group, name:)
9
+ end
10
+ end
11
+
12
+ attr_reader :selling_plan_group
13
+
14
+ def initialize(id:, oracle: nil)
15
+ super
16
+ @selling_plan_group = @object
17
+ end
18
+
19
+ def reload
20
+ super
21
+ @selling_plan_group = @object
22
+ end
23
+
24
+ def edit_name(name:)
25
+ @oracle.mutate(
26
+ :edit_selling_plan_group_name,
27
+ sellingPlanGroup: @id,
28
+ name:
29
+ )
30
+ end
31
+
32
+ def add_variants(variants:)
33
+ variants = variants.map { |v| v.is_a?(Integer) ? "gid://shopify/ProductVariant/#{v}" : v }
34
+
35
+ @oracle.mutate(
36
+ :add_variants_to_selling_plan_group,
37
+ sellingPlanGroup: @gid,
38
+ variants:
39
+ )
40
+ end
41
+
42
+ def add_products(products:)
43
+ products = products.map { |v| v.is_a?(Integer) ? "gid://shopify/Product/#{v}" : v }
44
+
45
+ @oracle.mutate(
46
+ :add_products_to_selling_plan_group,
47
+ sellingPlanGroup: @gid,
48
+ products:
49
+ )
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Naming/VariableName
4
+ # rubocop:disable Naming/MethodParameterName
5
+ module ShopifyOracle
6
+ module Accessor
7
+ class SubscriptionContract < Base
8
+ class << self
9
+ def create_v2(
10
+ customer_id:,
11
+ customerPaymentMethodId:,
12
+ oracle: nil
13
+ )
14
+ customerId = customer_id.is_a?(Integer) ? "gid://shopify/Customer/#{customer_id}" : customer_id
15
+
16
+ ShopifyOracle.mutate(
17
+ :create_subscription_contract_v2,
18
+ customerId:,
19
+ customerPaymentMethodId:
20
+ )
21
+ end
22
+
23
+ # rubocop:disable Metrics/MethodLength
24
+ def create(
25
+ customer:, oracle: nil,
26
+ interval: 'WEEK',
27
+ intervalCount: 6,
28
+ maxCycles: 10,
29
+ minCycles: 3,
30
+ deliveryPrice: 5.50,
31
+ nextBillingDate: Time.zone.today + 30.days
32
+ )
33
+
34
+ address = customer.default_address
35
+ input = {
36
+ contract: {
37
+ billingPolicy: {
38
+ interval:,
39
+ intervalCount:,
40
+ maxCycles:,
41
+ minCycles:
42
+ },
43
+ customAttributes: [
44
+ {
45
+ key: 'key',
46
+ value: 'value'
47
+ }
48
+ ],
49
+ deliveryMethod: {
50
+ shipping: {
51
+ address: {
52
+ address1: address.address1,
53
+ address2: address.address2,
54
+ city: address.city,
55
+ company: address.company,
56
+ firstName: address.first_name,
57
+ lastName: address.last_name,
58
+ phone: address.phone,
59
+ provinceCode: address.region_code,
60
+ zip: address.zip,
61
+ countryCode: address.country_code
62
+ },
63
+ shippingOption: {
64
+ code: 'abc',
65
+ description: 'description',
66
+ presentmentTitle: 'title',
67
+ title: 'title'
68
+ }
69
+ }
70
+ },
71
+ deliveryPolicy: {
72
+ interval:,
73
+ intervalCount:
74
+ },
75
+ deliveryPrice:,
76
+ nextBillingDate:,
77
+ note: 'note',
78
+ status: 'ACTIVE'
79
+ },
80
+ customerId: "gid://shopify/Customer/#{customer.ext_id}",
81
+ nextBillingDate: Time.zone.today + 30.days,
82
+ currencyCode: 'GBP'
83
+ }
84
+
85
+ ShopifyOracle.mutate(:create_subscription_contract, input:)
86
+ end
87
+ # rubocop:enable Metrics/MethodLength
88
+ end
89
+
90
+ attr_reader :contract
91
+
92
+ def initialize(id:, oracle: nil)
93
+ super
94
+ @contract = @object
95
+ end
96
+
97
+ def reload
98
+ super
99
+ @contract = @object
100
+ end
101
+ end
102
+ end
103
+ end
104
+ # rubocop:enable Naming/VariableName
105
+ # rubocop:enable Naming/MethodParameterName
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Naming/VariableName
4
+ # rubocop:disable Naming/MethodParameterName
5
+ module ShopifyOracle
6
+ module Accessor
7
+ class SubscriptionDraft < Base
8
+ attr_reader :draft
9
+
10
+ def initialize(id:, oracle: nil)
11
+ super
12
+ @draft = @object
13
+ end
14
+
15
+ def reload
16
+ super
17
+ @draft = @object
18
+ end
19
+
20
+ def commit
21
+ @oracle.mutate(
22
+ :subscription_draft_commit,
23
+ draftId: @gid
24
+ )
25
+ end
26
+
27
+ def update_delivery_method(
28
+ address:
29
+ )
30
+ input = {
31
+ deliveryMethod: {
32
+ shipping: {
33
+ address:
34
+ }
35
+ }
36
+ }
37
+
38
+ @oracle.mutate(
39
+ :subscription_draft_update,
40
+ draftId: @gid,
41
+ input:
42
+ )
43
+ end
44
+
45
+ def add_line_item(
46
+ productVariantId:,
47
+ currentPrice:,
48
+ quantity:
49
+ )
50
+ productVariantId = "gid://shopify/ProductVariant/#{productVariantId}" if productVariantId.is_a?(Integer)
51
+ input = {
52
+ productVariantId:,
53
+ quantity:,
54
+ currentPrice:
55
+ }
56
+
57
+ @oracle.mutate(:add_line_item_to_subscription_draft, draftId: @id, input:)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ # rubocop:enable Naming/VariableName
63
+ # rubocop:enable Naming/MethodParameterName
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Connector
5
+ class Base
6
+ def initialize(shop:)
7
+ @shop = shop
8
+ session = ShopifyAPI::Utils::SessionUtils.load_offline_session(shop:)
9
+ @client = ShopifyAPI::Clients::Graphql::Admin.new(session:)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Connector
5
+ class Mutater < Base
6
+ def mutate(method, **args)
7
+ mutation = ShopifyOracle::Mutations.const_get("#{method.to_s.upcase}_MUTATION".to_sym)
8
+ @client.query(query: mutation, variables: args)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Connector
5
+ class Querier < Base
6
+ def query(method, **args)
7
+ query = ShopifyOracle::Queries.const_get("#{method.to_s.upcase}_QUERY".to_sym)
8
+ @client.query(query:, variables: args)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,274 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/ModuleLength
4
+ module ShopifyOracle
5
+ module Fragments
6
+ SELLING_PLAN_DELIVERY_POLICY = <<~GRAPHQL
7
+ fragment DeliveryPolicy on SellingPlanDeliveryPolicy {
8
+ interval
9
+ intervalCount
10
+ }
11
+ GRAPHQL
12
+
13
+ SELLING_PLAN = <<~GRAPHQL
14
+ fragment SellingPlan on SellingPlan {
15
+ id
16
+ createdAt
17
+ description
18
+ name
19
+ options
20
+ position
21
+ billingPolicy {
22
+ ... on SellingPlanRecurringBillingPolicy {
23
+ createdAt
24
+ interval
25
+ intervalCount
26
+ maxCycles
27
+ minCycles
28
+ }
29
+ }
30
+ deliveryPolicy {
31
+ ... on SellingPlanRecurringDeliveryPolicy {
32
+ createdAt
33
+ cutoff
34
+ intent
35
+ interval
36
+ intervalCount
37
+ }
38
+ }
39
+ pricingPolicies {
40
+ ... on SellingPlanRecurringPricingPolicy {
41
+ adjustmentType
42
+ adjustmentValue
43
+ createdAt
44
+ afterCycle
45
+ }
46
+ ... on SellingPlanFixedPricingPolicy {
47
+ adjustmentType
48
+ adjustmentValue {
49
+ ... on MoneyV2 {
50
+ amount
51
+ currencyCode
52
+ }
53
+ ... on SellingPlanPricingPolicyPercentageValue {
54
+ percentage
55
+ }
56
+ }
57
+ createdAt
58
+ }
59
+
60
+ }
61
+ }
62
+ GRAPHQL
63
+
64
+ SELLING_PLAN_GROUP = <<~GRAPHQL.freeze
65
+ #{SELLING_PLAN}
66
+
67
+ fragment SellingPlanGroup on SellingPlanGroup {
68
+ createdAt
69
+ id
70
+ description
71
+ merchantCode
72
+ name
73
+ options
74
+ position
75
+ productCount
76
+ productVariantCount
77
+ productVariants(first: $first) {
78
+ edges {
79
+ node {
80
+ id
81
+ }
82
+ }
83
+ }
84
+ summary
85
+ sellingPlans(first: $first) {
86
+ edges {
87
+ node {
88
+ ...SellingPlan
89
+ }
90
+ }
91
+ }
92
+ }
93
+ GRAPHQL
94
+
95
+ CUSTOMER_PAYMENT_METHOD = <<~GRAPHQL
96
+ fragment CustomerPaymentMethod on CustomerPaymentMethod {
97
+ id
98
+ instrument
99
+ revokedAt
100
+ revokedReason
101
+ }
102
+ GRAPHQL
103
+
104
+ CUSTOMER = <<~GRAPHQL.freeze
105
+ #{CUSTOMER_PAYMENT_METHOD}
106
+
107
+ fragment Customer on Customer {
108
+ id
109
+ firstName
110
+ lastName
111
+ displayName
112
+ email
113
+ paymentMethods(first: 10) {
114
+ edges {
115
+ node {
116
+ ...CustomerPaymentMethod
117
+ }
118
+ }
119
+ }
120
+ }
121
+ GRAPHQL
122
+
123
+ MONEY = <<~GRAPHQL
124
+ fragment Money on MoneyV2 {
125
+ amount
126
+ currencyCode
127
+ }
128
+ GRAPHQL
129
+
130
+ PRICING_POLICY = <<~GRAPHQL
131
+ fragment PricingPolicy on SubscriptionPricingPolicy {
132
+ basePrice {
133
+ ...Money
134
+ }
135
+ cycleDiscounts {
136
+ adjustmentType
137
+ adjustmentValue
138
+ afterCycle
139
+ computedPrice {
140
+ ...Money
141
+ }
142
+ }
143
+ }
144
+ GRAPHQL
145
+
146
+ BILLING_POLICY = <<~GRAPHQL
147
+ fragment BillingPolicy on SubscriptionBillingPolicy {
148
+ interval
149
+ intervalCount
150
+ maxCycles
151
+ minCycles
152
+ }
153
+ GRAPHQL
154
+
155
+ DELIVERY_POLICY = <<~GRAPHQL
156
+ fragment DeliveryPolicy on SubscriptionDeliveryPolicy {
157
+ interval
158
+ intervalCount
159
+ }
160
+ GRAPHQL
161
+
162
+ LINE_ADDED = <<~GRAPHQL.freeze
163
+ #{MONEY}
164
+ #{PRICING_POLICY}
165
+
166
+ fragment LineAdded on SubscriptionLine {
167
+ currentPrice {
168
+ ...Money
169
+ }
170
+ discountAllocations {
171
+ amount {
172
+ ...Money
173
+ }
174
+ discount
175
+ }
176
+ id
177
+ pricingPolicy {
178
+ ...PricingPolicy
179
+ }
180
+ productId
181
+ quantity
182
+ requiresShipping
183
+ sellingPlanId
184
+ sellingPlanName
185
+ sku
186
+ taxable
187
+ title
188
+ variantId
189
+ variantImage {
190
+ url
191
+ }
192
+ variantTitle
193
+ }
194
+ GRAPHQL
195
+
196
+ SUBSCRIPTION_DRAFT = <<~GRAPHQL.freeze
197
+ #{CUSTOMER}
198
+ #{DELIVERY_POLICY}
199
+ #{BILLING_POLICY}
200
+ #{MONEY}
201
+
202
+ fragment SubscriptionDraft on SubscriptionDraft {
203
+ currencyCode
204
+ customAttributes {
205
+ key
206
+ value
207
+ }
208
+ customer {
209
+ ...Customer
210
+ }
211
+ customerPaymentMethod {
212
+ id
213
+ instrument
214
+ revokedAt
215
+ revokedReason
216
+ }
217
+ billingPolicy {
218
+ ...BillingPolicy
219
+ }
220
+ deliveryMethod
221
+ deliveryPolicy {
222
+ ...DeliveryPolicy
223
+ }
224
+ deliveryPrice {
225
+ ...Money
226
+ }
227
+ id
228
+ nextBillingDate
229
+ shippingOptions
230
+ status
231
+ }
232
+ GRAPHQL
233
+
234
+ SUBSCRIPTION_CONTRACT = <<~GRAPHQL.freeze
235
+ #{MONEY}
236
+ #{BILLING_POLICY}
237
+ #{DELIVERY_POLICY}
238
+ #{CUSTOMER}
239
+
240
+ fragment SubscriptionContract on SubscriptionContract {
241
+ id
242
+ createdAt
243
+ currencyCode
244
+ deliveryPrice {
245
+ ...Money
246
+ }
247
+ lastPaymentStatus
248
+ lineCount
249
+ note
250
+ status
251
+ appAdminUrl
252
+ nextBillingDate
253
+ customAttributes {
254
+ key
255
+ value
256
+ }
257
+ billingPolicy {
258
+ ...BillingPolicy
259
+ }
260
+ deliveryPolicy {
261
+ ...DeliveryPolicy
262
+ }
263
+ customerPaymentMethod {
264
+ ...CustomerPaymentMethod
265
+ }
266
+ customer {
267
+ ...Customer
268
+ }
269
+ deliveryMethod
270
+ }
271
+ GRAPHQL
272
+ end
273
+ end
274
+ # rubocop:enable Metrics/ModuleLength
@@ -0,0 +1,266 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/ModuleLength
4
+ module ShopifyOracle
5
+ module Mutations
6
+ SUBSCRIPTION_DRAFT_UPDATE_MUTATION = <<~GRAPHQL
7
+ mutation($draftId: ID!, $input: SubscriptionDraftInput!) {
8
+ subscriptionDraftUpdate(
9
+ draftId: $draftId,
10
+ input: $input
11
+ ) {
12
+ draft {
13
+ id
14
+ }
15
+ userErrors {
16
+ field
17
+ message
18
+ }
19
+ }
20
+ }
21
+ GRAPHQL
22
+
23
+ SUBSCRIPTION_DRAFT_COMMIT_MUTATION = <<~GRAPHQL
24
+ mutation($draftId: ID!) {
25
+ subscriptionDraftCommit(draftId: $draftId) {
26
+ contract {
27
+ id
28
+ }
29
+ userErrors {
30
+ field
31
+ message
32
+ }
33
+ }
34
+ }
35
+ GRAPHQL
36
+
37
+ ADD_LINE_ITEM_TO_SUBSCRIPTION_DRAFT_MUTATION = <<~GRAPHQL.freeze
38
+ #{ShopifyOracle::Fragments::LINE_ADDED}
39
+
40
+ mutation subscriptionDraftLineAdd($draftId: ID!, $input: SubscriptionLineInput!) {
41
+ subscriptionDraftLineAdd(draftId: $draftId, input: $input) {
42
+ draft {
43
+ id
44
+ }
45
+ lineAdded {
46
+ ...LineAdded
47
+ }
48
+ userErrors {
49
+ field
50
+ message
51
+ }
52
+ }
53
+ }
54
+ GRAPHQL
55
+
56
+ CREATE_SUBSCRIPTION_CONTRACT_V2_MUTATION = <<~GRAPHQL
57
+ mutation($customerId: ID!, $customerPaymentMethodId: ID!) {
58
+ subscriptionContractCreate(
59
+ input: {
60
+ customerId: $customerId,
61
+ nextBillingDate: "2022-09-01"
62
+ currencyCode: GBP
63
+ contract: {
64
+ note: "Dear Sam, I hope you enjoy this gift."
65
+ status: ACTIVE
66
+ paymentMethodId: $customerPaymentMethodId
67
+ billingPolicy: { interval: MONTH, intervalCount: 1, minCycles: 3 }
68
+ deliveryPolicy: { interval: MONTH, intervalCount: 1 }
69
+ deliveryPrice: 14.99
70
+ deliveryMethod: {
71
+ shipping: {
72
+ address: {
73
+ firstName: "John"
74
+ lastName: "McDonald"
75
+ address1: "33 New Montgomery St"
76
+ address2: "#750"
77
+ city: "San Francisco"
78
+ province: "California"
79
+ country: "USA"
80
+ zip: "94105"
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ) {
87
+ draft {
88
+ id
89
+ }
90
+ userErrors {
91
+ field
92
+ message
93
+ }
94
+ }
95
+ }
96
+ GRAPHQL
97
+
98
+ CREATE_SUBSCRIPTION_CONTRACT_MUTATION = <<~GRAPHQL.freeze
99
+ #{ShopifyOracle::Fragments::SUBSCRIPTION_DRAFT}
100
+
101
+ mutation subscriptionContractCreate($input: SubscriptionContractCreateInput!) {
102
+ subscriptionContractCreate(input: $input) {
103
+ draft {
104
+ ...SubscriptionDraft
105
+ }
106
+ userErrors {
107
+ field
108
+ message
109
+ }
110
+ }
111
+ }
112
+ GRAPHQL
113
+
114
+ ADD_VARIANTS_TO_SELLING_PLAN_GROUP_MUTATION = <<~GRAPHQL
115
+ mutation($sellingPlanGroup: ID!, $variants: [ID!]!) {
116
+ sellingPlanGroupAddProductVariants(
117
+ id: $sellingPlanGroup,
118
+ productVariantIds: $variants
119
+ ) {
120
+ sellingPlanGroup {
121
+ id
122
+ productVariantCount
123
+ productVariants(first: 10) {
124
+ edges {
125
+ node {
126
+ id
127
+ title
128
+ inventoryQuantity
129
+ product {
130
+ id
131
+ title
132
+ totalInventory
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ userErrors {
139
+ field
140
+ message
141
+ }
142
+ }
143
+ }
144
+ GRAPHQL
145
+
146
+ ADD_PRODUCTS_TO_SELLING_PLAN_GROUP_MUTATION = <<~GRAPHQL
147
+ mutation($sellingPlanGroup: ID!, $products: [ID!]!) {
148
+ sellingPlanGroupAddProducts(
149
+ id: $sellingPlanGroup,
150
+ productIds: $products
151
+ ) {
152
+ sellingPlanGroup {
153
+ id
154
+ productVariantCount
155
+ productVariants(first: 10) {
156
+ edges {
157
+ node {
158
+ id
159
+ title
160
+ inventoryQuantity
161
+ product {
162
+ id
163
+ title
164
+ totalInventory
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ userErrors {
171
+ field
172
+ message
173
+ }
174
+ }
175
+ }
176
+ GRAPHQL
177
+
178
+ EDIT_SELLING_PLAN_GROUP_NAME_MUTATION = <<~GRAPHQL
179
+ mutation($sellingPlanGroup: ID!, $name: String!) {
180
+ sellingPlanGroupUpdate(
181
+ id: $sellingPlanGroup
182
+ input: { name: $name }
183
+ ) {
184
+ sellingPlanGroup {
185
+ id
186
+ name
187
+ }
188
+ userErrors {
189
+ field
190
+ message
191
+ }
192
+ }
193
+ }
194
+ GRAPHQL
195
+
196
+ CREATE_SELLING_PLAN_GROUP_MUTATION = <<~GRAPHQL
197
+ mutation($name: String!) {
198
+ sellingPlanGroupCreate(
199
+ input: {
200
+ name: $name,
201
+ merchantCode: "subscribe-and-save"
202
+ options: ["Delivery every"]
203
+ position: 1
204
+ sellingPlansToCreate: [
205
+ {
206
+ name: "Delivered every week"
207
+ options: "1 Week(s)"
208
+ position: 1
209
+ billingPolicy: { recurring: { interval: WEEK, intervalCount: 1 } }
210
+ deliveryPolicy: { recurring: { interval: WEEK, intervalCount: 1 } }
211
+ pricingPolicies: [
212
+ {
213
+ fixed: {
214
+ adjustmentType: PERCENTAGE
215
+ adjustmentValue: { percentage: 15.0 }
216
+ }
217
+ }
218
+ ]
219
+ }
220
+ {
221
+ name: "Delivered every six weeks"
222
+ options: "6 Week(s)"
223
+ position: 2
224
+ billingPolicy: { recurring: { interval: WEEK, intervalCount: 6 } }
225
+ deliveryPolicy: { recurring: { interval: WEEK, intervalCount: 6 } }
226
+ pricingPolicies: [
227
+ {
228
+ fixed: {
229
+ adjustmentType: PERCENTAGE
230
+ adjustmentValue: { percentage: 10.0 }
231
+ }
232
+ }
233
+ ]
234
+ }
235
+ {
236
+ name: "Delivered every three weeks"
237
+ options: "3 Week(s)"
238
+ position: 3
239
+ billingPolicy: { recurring: { interval: WEEK, intervalCount: 3 } }
240
+ deliveryPolicy: { recurring: { interval: WEEK, intervalCount: 3 } }
241
+ pricingPolicies: [
242
+ {
243
+ fixed: {
244
+ adjustmentType: PERCENTAGE
245
+ adjustmentValue: { percentage: 5.0 }
246
+ }
247
+ }
248
+ ]
249
+ }
250
+ ]
251
+ }
252
+ resources: { productIds: [], productVariantIds: [] }
253
+ ) {
254
+ sellingPlanGroup {
255
+ id
256
+ }
257
+ userErrors {
258
+ field
259
+ message
260
+ }
261
+ }
262
+ }
263
+ GRAPHQL
264
+ end
265
+ end
266
+ # rubocop:enable Metrics/ModuleLength
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyOracle
4
+ module Queries
5
+ CUSTOMERS_QUERY = <<~GRAPHQL
6
+ #{ShopifyOracle::Fragments::CUSTOMER}
7
+
8
+ query($first: Int = 10) {
9
+ customers(first: $first) {
10
+ edges {
11
+ node {
12
+ ...Customer
13
+ }
14
+ }
15
+ }
16
+ }
17
+ GRAPHQL
18
+
19
+ CUSTOMER_QUERY = <<~GRAPHQL.freeze
20
+ #{ShopifyOracle::Fragments::CUSTOMER}
21
+
22
+ query($id: ID!) {
23
+ customer(id: $id) {
24
+ ...Customer
25
+ }
26
+ }
27
+ GRAPHQL
28
+
29
+ SUBSCRIPTION_DRAFT_QUERY = <<~GRAPHQL.freeze
30
+ #{ShopifyOracle::Fragments::SUBSCRIPTION_DRAFT}
31
+
32
+ query($id: ID!) {
33
+ subscriptionDraft(id: $id) {
34
+ ...SubscriptionDraft
35
+ }
36
+ }
37
+ GRAPHQL
38
+
39
+ SUBSCRIPTION_CONTRACTS_QUERY = <<~GRAPHQL.freeze
40
+ #{ShopifyOracle::Fragments::SUBSCRIPTION_CONTRACT}
41
+
42
+ query($first: Int = 10) {
43
+ subscriptionContracts(first: $first) {
44
+ edges {
45
+ node {
46
+ ...SubscriptionContract
47
+ }
48
+ }
49
+ }
50
+ }
51
+ GRAPHQL
52
+
53
+ SUBSCRIPTION_CONTRACT_QUERY = <<~GRAPHQL.freeze
54
+ #{ShopifyOracle::Fragments::SUBSCRIPTION_CONTRACT}
55
+
56
+ query($id: ID!) {
57
+ subscriptionContract(id: $id) {
58
+ ...SubscriptionContract
59
+ }
60
+ }
61
+ GRAPHQL
62
+
63
+ SELLING_PLAN_GROUP_QUERY = <<~GRAPHQL.freeze
64
+ #{ShopifyOracle::Fragments::SELLING_PLAN_GROUP}
65
+
66
+ query($id: ID!, $first: Int = 10) {
67
+ sellingPlanGroup(id: $id) {
68
+ ...SellingPlanGroup
69
+ }
70
+ }
71
+ GRAPHQL
72
+
73
+ SELLING_PLAN_GROUPS_QUERY = <<~GRAPHQL.freeze
74
+ #{ShopifyOracle::Fragments::SELLING_PLAN_GROUP}
75
+
76
+ query($first: Int = 10) {
77
+ sellingPlanGroups(first: $first) {
78
+ edges {
79
+ node {
80
+ ...SellingPlanGroup
81
+ }
82
+ }
83
+ }
84
+ }
85
+ GRAPHQL
86
+
87
+ SELLING_PLAN_QUERY = <<~GRAPHQL.freeze
88
+ #{ShopifyOracle::Fragments::SELLING_PLAN}
89
+
90
+ query($id: ID!, $first: Int = 10) {
91
+ sellingPlan(id: $id) {
92
+ ...SellingPlan
93
+ }
94
+ }
95
+ GRAPHQL
96
+
97
+ SELLING_PLANS_QUERY = <<~GRAPHQL.freeze
98
+ #{ShopifyOracle::Fragments::SELLING_PLAN}
99
+
100
+ query($first: Int = 10) {
101
+ sellingPlans(first: $first) {
102
+ edges {
103
+ node {
104
+ ...SellingPlan
105
+ }
106
+ }
107
+ }
108
+ }
109
+ GRAPHQL
110
+ end
111
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shopify_api'
4
+ require 'shopify_oracle/connector/base'
5
+ require 'shopify_oracle/connector/querier'
6
+ require 'shopify_oracle/connector/mutater'
7
+ require 'shopify_oracle/fragments'
8
+ require 'shopify_oracle/mutations'
9
+ require 'shopify_oracle/queries'
10
+ require 'shopify_oracle/accessor/base'
11
+ require 'shopify_oracle/accessor/customer'
12
+ require 'shopify_oracle/accessor/selling_plan_group'
13
+ require 'shopify_oracle/accessor/subscription_contract'
14
+ require 'shopify_oracle/accessor/subscription_draft'
15
+
16
+ module ShopifyOracle
17
+ @shop = nil
18
+ @connector = nil
19
+ @querier = nil
20
+ @mutater = nil
21
+ @initialized = false
22
+
23
+ class << self
24
+ attr_accessor :shop
25
+
26
+ def build(shop: nil)
27
+ @shop = shop if @shop.nil? && shop.present?
28
+
29
+ shop ||= @shop
30
+
31
+ @querier = ShopifyOracle::Connector::Querier.new(shop:)
32
+ @mutater = ShopifyOracle::Connector::Mutater.new(shop:)
33
+ @initialized = true
34
+ end
35
+
36
+ def query(query, **args)
37
+ raise 'ShopifyOracle not initialized' unless @initialized
38
+
39
+ @querier.query(query, variables: args)
40
+ end
41
+
42
+ def mutate(mutation, **args)
43
+ raise 'ShopifyOracle not initialized' unless @initialized
44
+
45
+ @mutator.mutate(mutation, variables: args)
46
+ end
47
+ end
48
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shopify_oracle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yari Labs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: shopify_api
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '10'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '10'
27
+ description: A simple gem to facilitate interacting with the Shopify GraphQL API
28
+ email: dev@yarilabs.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/shopify_oracle.rb
34
+ - lib/shopify_oracle/accessor/base.rb
35
+ - lib/shopify_oracle/accessor/customer.rb
36
+ - lib/shopify_oracle/accessor/selling_plan_group.rb
37
+ - lib/shopify_oracle/accessor/subscription_contract.rb
38
+ - lib/shopify_oracle/accessor/subscription_draft.rb
39
+ - lib/shopify_oracle/connector/base.rb
40
+ - lib/shopify_oracle/connector/mutater.rb
41
+ - lib/shopify_oracle/connector/querier.rb
42
+ - lib/shopify_oracle/fragments.rb
43
+ - lib/shopify_oracle/mutations.rb
44
+ - lib/shopify_oracle/queries.rb
45
+ homepage: https://rubygems.org/gems/shopify_oracle
46
+ licenses:
47
+ - MIT
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubygems_version: 3.3.15
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: Oracle
68
+ test_files: []