forked from chenyangguang/woocommerce
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsubscription.go
More file actions
231 lines (210 loc) · 11.9 KB
/
Copy pathsubscription.go
File metadata and controls
231 lines (210 loc) · 11.9 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
package woocommerce
import (
"fmt"
)
const (
subscriptionsBasePath = "subscriptions"
)
// SubscriptionService is an interface for interfacing with the subscriptions endpoints of woocommerce API
// https://woocommerce.github.io/woocommerce-rest-api-docs/#subscriptions
type SubscriptionService interface {
Create(subscription Subscription) (*Subscription, error)
Get(subscriptionId int64, options interface{}) (*Subscription, error)
List(options interface{}) ([]Subscription, error)
Update(subscription *Subscription) (*Subscription, error)
Delete(subscriptionID int64, options interface{}) (*Subscription, error)
Batch(option SubscriptionBatchOption) (*SubscriptionBatchResource, error)
ListWithPagination(options interface{}) ([]Subscription, *Pagination, error)
GetOrders(subscriptionID int64, options interface{}) ([]Order, *Pagination, error)
}
// SubscriptionServiceOp handles communication with the subscription related methods of WooCommerce'API
type SubscriptionServiceOp struct {
client *Client
}
// SubscriptionListOption list all thee subscription list option request params
// refrence url:
// https://woocommerce.github.io/woocommerce-rest-api-docs/#list-all-subscriptions
// parameters:
// context string Scope under which the request is made; determines fields present in response. Options: view and edit. Default is view.
// page integer Current page of the collection. Default is 1.
// per_page integer Maximum number of items to be returned in result set. Default is 10.
// search string Limit results to those matching a string.
// after string Limit response to resources published after a given ISO8601 compliant date.
// before string Limit response to resources published before a given ISO8601 compliant date.
// exclude array Ensure result set excludes specific IDs.
// include array Limit result set to specific ids.
// offset integer Offset the result set by a specific number of items.
// order string Subscription sort attribute ascending or descending. Options: asc and desc. Default is desc.
// orderby string Sort collection by object attribute. Options: date, id, include, title and slug. Default is date.
// parent array Limit result set to those of particular parent IDs.
// parent_exclude array Limit result set to all items except those of a particular parent ID.
// status array Limit result set to subscriptions assigned a specific status. Options: any, pending, processing, on-hold, completed, cancelled, refunded, failed and trash. Default is any.
// customer integer Limit result set to subscriptions assigned a specific customer.
// product integer Limit result set to subscriptions assigned a specific product.
// dp integer Number of decimal points to use in each resource. Default is 2.
type SubscriptionListOptions struct {
ListOptions
Parent []int64 `url:"parent,omitempty"`
ParentExclude []int64 `url:"parent_exclude,omitempty"`
Status []string `url:"status,omitempty"`
Customer int64 `url:"customer,omitempty"`
Product int64 `url:"product,omitempty"`
Dp int `url:"id,omitempty"`
}
// SubscriptionBatchOption setting operate for subscription in batch way
// https://woocommerce.github.io/woocommerce-rest-api-docs/#batch-update-subscriptions
type SubscriptionBatchOption struct {
Create []Subscription `json:"create,omitempty"`
Update []Subscription `json:"update,omitempty"`
Delete []int64 `json:"delete,omitempty"`
}
// SubscriptionBatchResource conservation the response struct for SubscriptionBatchOption request
type SubscriptionBatchResource struct {
Create []*Subscription `json:"create,omitempty"`
Update []*Subscription `json:"update,omitempty"`
Delete []*Subscription `json:"delete,omitempty"`
}
// Subscription represents a WooCommerce Subscription
// https://woocommerce.github.io/woocommerce-rest-api-docs/#subscription-properties
type Subscription struct {
ID int64 `json:"id,omitempty"`
ParentId int64 `json:"parent_id,omitempty"`
Status string `json:"status,omitempty"`
Currency string `json:"currency,omitempty"`
Version string `json:"version,omitempty"`
PricesIncludeTax bool `json:"prices_include_tax,omitempty"`
DateCreated StringTime `json:"date_created,omitempty"`
DateCreatedGmt StringTime `json:"date_created_gmt,omitempty"`
DateModified StringTime `json:"date_modified,omitempty"`
DateModifiedGmt StringTime `json:"date_modified_gmt,omitempty"`
DateCompleted StringTime `json:"date_completed,omitempty"`
DateCompletedGmt StringTime `json:"date_completed_gmt,omitempty"`
DatePaid StringTime `json:"date_paid,omitempty"`
DatePaidGmt StringTime `json:"date_paid_gmt,omitempty"`
StartDate StringTime `json:"start_date,omitempty"`
StartDateGmt StringTime `json:"start_date_gmt,omitempty"`
TrialEnd StringTime `json:"trial_end_date,omitempty"`
TrialEndGmt StringTime `json:"trial_end_date_gmt,omitempty"`
NextPaymentDate StringTime `json:"next_payment_date,omitempty"`
NextPaymentDateGmt StringTime `json:"next_payment_date_gmt,omitempty"`
LastPaymentDate StringTime `json:"last_payment_date,omitempty"`
LastPaymentDateGmt StringTime `json:"last_payment_date_gmt,omitempty"`
PaymentRetryDate StringTime `json:"payment_retry_date,omitempty"`
// New Fields
TrialPeriod string `json:"trial_period,omitempty"`
SuspensionCount int `json:"suspension_count,omitempty"`
RequiresManualRenewal bool `json:"requires_manual_renewal,omitempty"`
PaymentRetryDateGmt StringTime `json:"payment_retry_date_gmt,omitempty"`
CancelledDate StringTime `json:"cancelled_date,omitempty"`
CancelledDateGmt StringTime `json:"cancelled_date_gmt,omitempty"`
EndDate StringTime `json:"end_date,omitempty"`
EndDateGmt StringTime `json:"end_date_gmt,omitempty"`
DiscountsTotal StringFloat `json:"discount_total,omitempty"`
DiscountsTax StringFloat `json:"discount_tax,omitempty"`
ShippingTotal StringFloat `json:"shipping_total,omitempty"`
ShippingTax StringFloat `json:"shipping_tax,omitempty"`
CartTax StringFloat `json:"cart_tax,omitempty"`
Total StringFloat `json:"total,omitempty"`
TotalTax StringFloat `json:"total_tax,omitempty"`
CustomerId int64 `json:"customer_id,omitempty"`
OrderKey string `json:"order_key,omitempty"`
Billing *Billing `json:"billing,omitempty"`
Shipping *Shipping `json:"shipping,omitempty"`
PaymentMethod string `json:"payment_method,omitempty"`
PaymentMethodTitle string `json:"payment_method_title,omitempty"`
CustomerIpAddress string `json:"customer_ip_address,omitempty"`
CustomerUserAgent string `json:"customer_user_agent,omitempty"`
CreatedVia string `json:"created_via,omitempty"`
CustomerNote string `json:"customer_note,omitempty"`
Number string `json:"number,omitempty"`
Meta []MetaData `json:"meta,omitempty"`
MetaData []MetaData `json:"meta_data,omitempty"`
LineItems []LineItem `json:"line_items,omitempty"`
TaxLines []TaxLine `json:"tax_lines,omitempty"`
ShippingLines []ShippingLines `json:"shipping_lines,omitempty"`
FeeLines []FeeLine `json:"fee_lines,omitempty"`
CouponLines []CouponLine `json:"coupon_lines,omitempty"`
BillingPeriod string `json:"billing_period,omitempty"`
BillingInterval StringInt `json:"billing_interval,omitempty"`
ResubscribedFrom string `json:"resubscribed_from,omitempty"`
ResubscribedSubscription string `json:"resubscribed_subscription,omitempty"`
RemovedLineItems []LineItem `json:"removed_line_items,omitempty"`
PaymentDetails PaymentDetails `json:"payment_details,omitempty"`
PaymentUrl string `json:"payment_url,omitempty"`
TransitionStatus string `json:"transition_status,omitempty"`
TrackingCode string `json:"correios_tracking_code,omitempty"`
NeedsPayment bool `json:"needs_payment,omitempty"`
NeedsProcessing bool `json:"needs_processing,omitempty"`
IsEditable bool `json:"is_editable,omitempty"`
Links Links `json:"_links"`
TransactionId string `json:"transaction_id,omitempty"`
CartHash string `json:"cart_hash,omitempty"`
Refunds []Refund `json:"refunds,omitempty"`
}
type PaymentDetails struct {
PostMeta []MetaData `json:"post_meta,omitempty"`
UserMeta []MetaData `json:"user_meta,omitempty"`
}
func (o *SubscriptionServiceOp) List(options interface{}) ([]Subscription, error) {
subscriptions, _, err := o.ListWithPagination(options)
return subscriptions, err
}
// ListWithPagination lists products and return pagination to retrieve next/previous results.
func (o *SubscriptionServiceOp) ListWithPagination(options interface{}) ([]Subscription, *Pagination, error) {
resource := make([]Subscription, 0)
headers, err := o.client.createAndDoGetHeaders("GET", subscriptionsBasePath, nil, options, &resource)
if err != nil {
return nil, nil, err
}
// Extract pagination info from header
pagination, err := extractPagination(headers)
if err != nil {
return nil, nil, err
}
return resource, pagination, err
}
func (o *SubscriptionServiceOp) Create(subscription Subscription) (*Subscription, error) {
resource := new(Subscription)
err := o.client.Post(subscriptionsBasePath, subscription, &resource)
return resource, err
}
// Get individual subscription
func (o *SubscriptionServiceOp) Get(subscriptionID int64, options interface{}) (*Subscription, error) {
path := fmt.Sprintf("%s/%d", subscriptionsBasePath, subscriptionID)
resource := new(Subscription)
err := o.client.Get(path, resource, options)
return resource, err
}
func (o *SubscriptionServiceOp) Update(subscription *Subscription) (*Subscription, error) {
path := fmt.Sprintf("%s/%d", subscriptionsBasePath, subscription.ID)
resource := new(Subscription)
err := o.client.Put(path, subscription, &resource)
return resource, err
}
func (o *SubscriptionServiceOp) Delete(subscriptionID int64, options interface{}) (*Subscription, error) {
path := fmt.Sprintf("%s/%d", subscriptionsBasePath, subscriptionID)
resource := new(Subscription)
err := o.client.Delete(path, options, &resource)
return resource, err
}
func (o *SubscriptionServiceOp) Batch(data SubscriptionBatchOption) (*SubscriptionBatchResource, error) {
path := fmt.Sprintf("%s/batch", subscriptionsBasePath)
resource := new(SubscriptionBatchResource)
err := o.client.Post(path, data, &resource)
return resource, err
}
// GetOrders lists orders for a subscription and return pagination to retrieve next/previous results.
func (o *SubscriptionServiceOp) GetOrders(subscriptionID int64, options interface{}) ([]Order, *Pagination, error) {
path := fmt.Sprintf("%s/%d/orders", subscriptionsBasePath, subscriptionID)
resource := make([]Order, 0)
headers, err := o.client.createAndDoGetHeaders("GET", path, nil, options, &resource)
if err != nil {
return nil, nil, err
}
// Extract pagination info from header
pagination, err := extractPagination(headers)
if err != nil {
return nil, nil, err
}
return resource, pagination, err
}