Skip to content

Commit d66aeba

Browse files
authored
Merge pull request #12 from webtaken/main
Subscription Item object
2 parents e3a708e + f224f1c commit d66aeba

10 files changed

+628
-63
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
[![GitHub license](https://img.shields.io/github/license/NdoleStudio/lemonsqueezy-go?color=brightgreen)](https://github.com/NdoleStudio/lemonsqueezy-go/blob/master/LICENSE)
99
[![PkgGoDev](https://pkg.go.dev/badge/github.com/NdoleStudio/lemonsqueezy-go)](https://pkg.go.dev/github.com/NdoleStudio/lemonsqueezy-go)
1010

11-
1211
This package provides a go API client for the lemonsqueezy API
1312

1413
## Installation
@@ -58,6 +57,11 @@ import "github.com/NdoleStudio/lemonsqueezy-go"
5857
- **Subscription Invoices**
5958
- `GET /v1/subscription-invoices/:id`: Retrieve a subscription invoice
6059
- `GET /v1/subscription-invoices`: List all subscription invoices
60+
- **Subscription Items**
61+
- `GET /v1/subscription-items/:id`: Retrieve a subscription item
62+
- `PATCH /v1/subscription-items/:id`: Update a subscription item
63+
- `GET /v1/subscription-items`: List all subscription items
64+
- `GET /v1/subscription-items/:id/current-usage`: Retrieve a subscription item's current usage
6165
- **Discounts**
6266
- `POST /v1/discounts`: Create a discount
6367
- `GET /v1/discounts/:id`: Retrieve a discount

client.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type Client struct {
3232
Orders *OrdersService
3333
OrderItems *OrderItemsService
3434
SubscriptionInvoices *SubscriptionInvoicesService
35+
SubscriptionItems *SubscriptionItemsService
3536
DiscountRedemptions *DiscountRedemptionsService
3637
Discounts *DiscountsService
3738
Checkouts *CheckoutsService
@@ -66,6 +67,7 @@ func New(options ...Option) *Client {
6667
client.Orders = (*OrdersService)(&client.common)
6768
client.OrderItems = (*OrderItemsService)(&client.common)
6869
client.SubscriptionInvoices = (*SubscriptionInvoicesService)(&client.common)
70+
client.SubscriptionItems = (*SubscriptionItemsService)(&client.common)
6971
client.DiscountRedemptions = (*DiscountRedemptionsService)(&client.common)
7072
client.Discounts = (*DiscountsService)(&client.common)
7173
client.Checkouts = (*CheckoutsService)(&client.common)
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package stubs
2+
3+
// SubscriptionItemGetResponse returns a dummy response to GET /v1/subscription-items/:id endpoint
4+
func SubscriptionItemGetResponse() []byte {
5+
return []byte(`
6+
{
7+
"jsonapi": {
8+
"version": "1.0"
9+
},
10+
"links": {
11+
"self": "https://api.lemonsqueezy.com/v1/subscription-item/1"
12+
},
13+
"data": {
14+
"type": "subscription-items",
15+
"id": "1",
16+
"attributes": {
17+
"subscription_id": 1,
18+
"price_id": 1,
19+
"quantity": 1,
20+
"is_usage_based": false,
21+
"created_at": "2023-07-18T12:16:24.000000Z",
22+
"updated_at": "2023-07-18T12:16:24.000000Z"
23+
},
24+
"relationships": {
25+
"subscription": {
26+
"links": {
27+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/subscription",
28+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/subscription"
29+
}
30+
},
31+
"price": {
32+
"links": {
33+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/price",
34+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/price"
35+
}
36+
},
37+
"usage-records": {
38+
"links": {
39+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/usage-records",
40+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/usage-records"
41+
}
42+
}
43+
},
44+
"links": {
45+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1"
46+
}
47+
}
48+
}
49+
`)
50+
}
51+
52+
// SubscriptionItemUpdateResponse is a dummy response to the PATCH /v1/subscription-items/:id endpoint
53+
func SubscriptionItemUpdateResponse() []byte {
54+
return []byte(`
55+
{
56+
"jsonapi": {
57+
"version": "1.0"
58+
},
59+
"links": {
60+
"self": "https://api.lemonsqueezy.com/v1/subscription-item/1"
61+
},
62+
"data": {
63+
"type": "subscription-items",
64+
"id": "1",
65+
"attributes": {
66+
"subscription_id": 1,
67+
"price_id": 1,
68+
"quantity": 10,
69+
"is_usage_based": false,
70+
"created_at": "2023-07-18T12:16:24.000000Z",
71+
"updated_at": "2023-07-18T12:23:18.000000Z"
72+
},
73+
"relationships": {
74+
"subscription": {
75+
"links": {
76+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/subscription",
77+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/subscription"
78+
}
79+
},
80+
"price": {
81+
"links": {
82+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/price",
83+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/price"
84+
}
85+
},
86+
"usage-records": {
87+
"links": {
88+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/usage-records",
89+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/usage-records"
90+
}
91+
}
92+
},
93+
"links": {
94+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1"
95+
}
96+
}
97+
}
98+
`)
99+
}
100+
101+
// SubscriptionItemsListResponse returns a dummy response to GET /v1/subscription-items endpoint
102+
func SubscriptionItemsListResponse() []byte {
103+
return []byte(`
104+
{
105+
"meta": {
106+
"page": {
107+
"currentPage": 1,
108+
"from": 1,
109+
"lastPage": 1,
110+
"perPage": 10,
111+
"to": 10,
112+
"total": 10
113+
}
114+
},
115+
"jsonapi": {
116+
"version": "1.0"
117+
},
118+
"links": {
119+
"first": "https://api.lemonsqueezy.com/v1/subscription-items?page%5Bnumber%5D=1&page%5Bsize%5D=10&sort=-created_at",
120+
"last": "https://api.lemonsqueezy.com/v1/subscription-items?page%5Bnumber%5D=1&page%5Bsize%5D=10&sort=-created_at"
121+
},
122+
"data": [
123+
{
124+
"type": "subscription-items",
125+
"id": "1",
126+
"attributes": {
127+
"subscription_id": 1,
128+
"price_id": 1,
129+
"quantity": 1,
130+
"is_usage_based": false,
131+
"created_at": "2023-07-18T12:16:24.000000Z",
132+
"updated_at": "2023-07-18T12:16:24.000000Z"
133+
},
134+
"relationships": {
135+
"subscription": {
136+
"links": {
137+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/subscription",
138+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/subscription"
139+
}
140+
},
141+
"price": {
142+
"links": {
143+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/price",
144+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/price"
145+
}
146+
},
147+
"usage-records": {
148+
"links": {
149+
"related": "https://api.lemonsqueezy.com/v1/subscription-items/1/usage-records",
150+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1/relationships/usage-records"
151+
}
152+
}
153+
},
154+
"links": {
155+
"self": "https://api.lemonsqueezy.com/v1/subscription-items/1"
156+
}
157+
}
158+
]
159+
}
160+
`)
161+
}
162+
163+
// SubscriptionItemCurrentUsageResponse returns a dummy response to GET /v1/subscription-items/:id/current-usage endpoint
164+
func SubscriptionItemCurrentUsageResponse() []byte {
165+
return []byte(`
166+
{
167+
"jsonapi": {
168+
"version": "1.0"
169+
},
170+
"meta": {
171+
"period_start": "2023-08-10T13:08:16.000000Z",
172+
"period_end": "2023-09-10T13:03:16.000000Z",
173+
"quantity": 5,
174+
"interval_unit": "month",
175+
"interval_quantity": 1
176+
}
177+
}
178+
`)
179+
}

internal/stubs/subscriptions.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ func SubscriptionGetResponse() []byte {
4141
"updated_at": "2021-08-11T13:47:28.000000Z"
4242
},
4343
"urls": {
44-
"update_payment_method": "https://app.lemonsqueezy.com/my-orders/2ba92a4e-a00a-45d2-a128-16856ffa8cdf/subscription/8/update-payment-method?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413"
44+
"update_payment_method": "https://my-store.lemonsqueezy.com/subscription/1/payment-details?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413",
45+
"customer_portal": "https://my-store.lemonsqueezy.com/billing?expires=1666869343&signature=82ae290ceac8edd4190c82825dd73a8743346d894a8ddbc4898b97eb96d105a5"
4546
},
4647
"renews_at": "2022-11-12T00:00:00.000000Z",
4748
"ends_at": null,
@@ -146,7 +147,8 @@ func SubscriptionUpdateResponse() []byte {
146147
"updated_at": "2021-08-11T13:47:28.000000Z"
147148
},
148149
"urls": {
149-
"update_payment_method": "https://app.lemonsqueezy.com/my-orders/2ba92a4e-a00a-45d2-a128-16856ffa8cdf/subscription/8/update-payment-method?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413"
150+
"update_payment_method": "https://my-store.lemonsqueezy.com/subscription/1/payment-details?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413",
151+
"customer_portal": "https://my-store.lemonsqueezy.com/billing?expires=1666869343&signature=82ae290ceac8edd4190c82825dd73a8743346d894a8ddbc4898b97eb96d105a5"
150152
},
151153
"renews_at": "2022-11-12T00:00:00.000000Z",
152154
"ends_at": null,
@@ -210,7 +212,8 @@ func SubscriptionsListResponse() []byte {
210212
"updated_at": "2021-08-11T13:47:28.000000Z"
211213
},
212214
"urls":{
213-
"update_payment_method":"https://app.lemonsqueezy.com/my-orders/2ba92a4e-a00a-45d2-a128-16856ffa8cdf/subscription/8/update-payment-method?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413"
215+
"update_payment_method": "https://my-store.lemonsqueezy.com/subscription/1/payment-details?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413",
216+
"customer_portal": "https://my-store.lemonsqueezy.com/billing?expires=1666869343&signature=82ae290ceac8edd4190c82825dd73a8743346d894a8ddbc4898b97eb96d105a5"
214217
},
215218
"renews_at":"2022-11-12T00:00:00.000000Z",
216219
"ends_at":null,
@@ -301,7 +304,8 @@ func SubscriptionsListResponse() []byte {
301304
"updated_at": "2021-08-11T13:47:28.000000Z"
302305
},
303306
"urls":{
304-
"update_payment_method":"https://app.lemonsqueezy.com/my-orders/2ba92a4e-a00a-45d2-a128-16856ffa8cdf/subscription/8/update-payment-method?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413"
307+
"update_payment_method": "https://my-store.lemonsqueezy.com/subscription/2/payment-details?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413",
308+
"customer_portal": "https://my-store.lemonsqueezy.com/billing?expires=1666869343&signature=82ae290ceac8edd4190c82825dd73a8743346d894a8ddbc4898b97eb96d105a5"
305309
},
306310
"renews_at":"2022-11-12T00:00:00.000000Z",
307311
"ends_at":null,
@@ -407,7 +411,8 @@ func SubscriptionCancelResponse() []byte {
407411
"updated_at": "2021-08-11T13:47:28.000000Z"
408412
},
409413
"urls": {
410-
"update_payment_method": "https://app.lemonsqueezy.com/my-orders/2ba92a4e-a00a-45d2-a128-16856ffa8cdf/subscription/8/update-payment-method?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413"
414+
"update_payment_method": "https://my-store.lemonsqueezy.com/subscription/1/payment-details?expires=1666869343&signature=9985e3bf9007840aeb3951412be475abc17439c449c1af3e56e08e45e1345413",
415+
"customer_portal": "https://my-store.lemonsqueezy.com/billing?expires=1666869343&signature=82ae290ceac8edd4190c82825dd73a8743346d894a8ddbc4898b97eb96d105a5"
411416
},
412417
"renews_at": "2022-11-12T00:00:00.000000Z",
413418
"ends_at": "2022-11-12T00:00:00.000000Z",

subscription_items.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import "time"
55
// In Lemon Squeezy A subscription item is an object that links a price to a subscription and also contains quantity information.
66
// https://docs.lemonsqueezy.com/api/subscription-items#the-subscription-item-object
77
type SubscriptionItem struct {
8-
ID int `json:"id"`
98
SubscriptionID int `json:"subscription_id"`
109
PriceID int `json:"price_id"`
1110
Quantity int `json:"quantity"`
@@ -20,12 +19,26 @@ type SubscriptionItemUpdateParams struct {
2019
Attributes SubscriptionItemUpdateParamsAttributes `json:"attributes"`
2120
}
2221

22+
// SubscriptionItemListParams are parameters for filtering list responses
23+
type SubscriptionItemListParams struct {
24+
SubscriptionID string
25+
PriceID string
26+
}
27+
2328
// SubscriptionUpdateParamsAttributes are subscription update attributes
2429
type SubscriptionItemUpdateParamsAttributes struct {
2530
Quantity int `json:"quantity,omitempty"`
2631
}
2732

28-
// ApiResponseRelationshipsSubscription relationships of a subscription object
33+
type ApiResponseMetaSubscriptionItemCurrentUsage struct {
34+
PeriodStart time.Time `json:"period_start"`
35+
PeriodEnd time.Time `json:"period_end"`
36+
Quantity int `json:"quantity"`
37+
IntervalUnit string `json:"interval_unit"`
38+
IntervalQuantity int `json:"interval_quantity"`
39+
}
40+
41+
// ApiResponseRelationshipsSubscription relationships of a subscription item object
2942
type ApiResponseRelationshipsSubscriptionItem struct {
3043
Subscription ApiResponseLinks `json:"subscription"`
3144
Price ApiResponseLinks `json:"price"`
@@ -37,3 +50,9 @@ type SubscriptionItemApiResponse = ApiResponse[SubscriptionItem, ApiResponseRela
3750

3851
// SubscriptionItemsApiResponse represents a list of subscription items api responses
3952
type SubscriptionItemsApiResponse = ApiResponseList[SubscriptionItem, ApiResponseRelationshipsSubscriptionItem]
53+
54+
// SubscriptionItemsCurrentUsageApiResponse represents the subscription item's current usage api response
55+
type SubscriptionItemCurrentUsageApiResponse struct {
56+
Jsonapi ApiResponseJSONAPI `json:"jsonapi"`
57+
Meta ApiResponseMetaSubscriptionItemCurrentUsage `json:"meta"`
58+
}

0 commit comments

Comments
 (0)