forked from r0busta/go-shopify-graphql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
price_list.go
109 lines (90 loc) · 3.14 KB
/
price_list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//go:generate mockgen -package shopify -destination price_list_mock.go -source price_list.go
package shopify
import (
"context"
"fmt"
"github.com/r0busta/go-shopify-graphql-model/graph/model"
)
// PriceList represents a price list.
type PriceList struct {
ID string `json:"id"`
Name string `json:"name"`
Currency string `json:"currency"`
}
// PriceListService defines the price list service operations.
type PriceListService interface {
GetPriceLists(ctx context.Context) ([]PriceList, error)
AddFixedPricesToPriceList(ctx context.Context, priceListID string, prices []PriceListPriceInput) error
}
// PriceListBulkQueryClient defines the required bulk query client operations.
type PriceListBulkQueryClient interface {
BulkQuery(query string, v interface{}) error
}
// PriceListMutationClient defines the required mutation client operations.
type PriceListMutationClient interface {
Mutate(ctx context.Context, m interface{}, variables map[string]interface{}) error
}
// PriceListServiceOp represents a price list service.
type PriceListServiceOp struct {
bulkQueryClient PriceListBulkQueryClient
mutationClient PriceListMutationClient
}
const (
priceListsGetAllBulkQuery = `
{
priceLists {
edges {
node {
id
name
currency
}
}
}
}
`
)
// GetPriceLists returns all price lists for the store.
func (s *PriceListServiceOp) GetPriceLists(_ context.Context) ([]PriceList, error) {
var res []PriceList
err := s.bulkQueryClient.BulkQuery(priceListsGetAllBulkQuery, &res)
if err != nil {
return nil, fmt.Errorf("failed to retrieve price lists: %w", err)
}
return res, nil
}
// PriceListPriceInput represents a price list price input.
type PriceListPriceInput struct {
CompareAtPrice model.MoneyInput `json:"compareAtPrice"`
Price model.MoneyInput `json:"price"`
VariantID string `json:"variantId"`
}
type priceListPriceOutput struct {
CompareAtPrice model.MoneyV2 `json:"compareAtPrice"`
Price model.MoneyV2 `json:"price"`
// Commented because I'm not sure why this causes a deadlock on the query generator, and we don't need it now...
// Variant model.ProductVariant `json:"variant"`
}
type priceListFixedPricesAddResult struct {
Prices []priceListPriceOutput `json:"prices"`
UserErrors []model.UserError `json:"userErrors,omitempty"`
}
type mutationPriceListFixedPricesAdd struct {
PriceListFixedPricesAddResult priceListFixedPricesAddResult `graphql:"priceListFixedPricesAdd(priceListId: $priceListId, prices: $prices)" json:"priceListFixedPricesAdd"`
}
// AddFixedPricesToPriceList adds fixed prices to a price list based on the arguments received.
func (s *PriceListServiceOp) AddFixedPricesToPriceList(ctx context.Context, priceListID string, prices []PriceListPriceInput) error {
m := mutationPriceListFixedPricesAdd{}
vars := map[string]interface{}{
"priceListId": priceListID,
"prices": prices,
}
err := s.mutationClient.Mutate(ctx, &m, vars)
if err != nil {
return err
}
if len(m.PriceListFixedPricesAddResult.UserErrors) > 0 {
return fmt.Errorf("%+v", m.PriceListFixedPricesAddResult.UserErrors)
}
return nil
}