Skip to content

Commit

Permalink
add subscription-item
Browse files Browse the repository at this point in the history
  • Loading branch information
judell committed Apr 5, 2024
1 parent c12a67f commit 2359969
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 27 deletions.
21 changes: 21 additions & 0 deletions docs/tables/stripe_subscription_item.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
title: "Steampipe Table: stripe_subscription_item - Query Stripe Subscriptions using SQL"
description: "Query the items associaated with a Stripe Subscription."
---

# Table: stripe_subscription_item - Query Stripe Subscription Items using SQL

Stripe Subscriptions is a service within Stripe that allows businesses to manage recurring billing for their customers. Subscription Items provide details including price, quantity, and billing thresholds.

## Examples

### List details for a subscription

```sql+postgres
select
*
from
stripe_subscription
where
subscription_id = 'sub_1Oo64zCWwOK68BLnfPDrQWIX'
```
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/turbot/steampipe-plugin-stripe
go 1.21

require (
github.com/stripe/stripe-go v70.15.0+incompatible
github.com/stripe/stripe-go/v76 v76.0.0
github.com/turbot/steampipe-plugin-sdk/v5 v5.8.0
)

Expand Down
5 changes: 3 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -554,8 +554,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stripe/stripe-go v70.15.0+incompatible h1:hNML7M1zx8RgtepEMlxyu/FpVPrP7KZm1gPFQquJQvM=
github.com/stripe/stripe-go v70.15.0+incompatible/go.mod h1:A1dQZmO/QypXmsL0T8axYZkSN/uA/T/A64pfKdBAMiY=
github.com/stripe/stripe-go/v76 v76.0.0 h1:XmXcsaznrtrmncLKJhTxwXL78+AHiEO4cqdUITxAp/g=
github.com/stripe/stripe-go/v76 v76.0.0/go.mod h1:rw1MxjlAKKcZ+3FOXgTHgwiOa2ya6CPq6ykpJ0Q6Po4=
github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=
github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
github.com/turbot/go-kit v0.9.0-rc.1 h1:6j1IidB4LpTw0TDXY0DSY6UxtrjMr0KIOBk3glO3Xfk=
Expand Down Expand Up @@ -689,6 +689,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
Expand Down
2 changes: 1 addition & 1 deletion stripe/error.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package stripe

import (
"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"
)

func isNotFoundError(err error) bool {
Expand Down
15 changes: 8 additions & 7 deletions stripe/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@ func Plugin(ctx context.Context) *plugin.Plugin {
ShouldIgnoreError: isNotFoundError,
},
TableMap: map[string]*plugin.Table{
"stripe_account": tableStripeAccount(ctx),
"stripe_coupon": tableStripeCoupon(ctx),
"stripe_customer": tableStripeCustomer(ctx),
"stripe_invoice": tableStripeInvoice(ctx),
"stripe_plan": tableStripePlan(ctx),
"stripe_product": tableStripeProduct(ctx),
"stripe_subscription": tableStripeSubscription(ctx),
"stripe_account": tableStripeAccount(ctx),
"stripe_coupon": tableStripeCoupon(ctx),
"stripe_customer": tableStripeCustomer(ctx),
"stripe_invoice": tableStripeInvoice(ctx),
"stripe_plan": tableStripePlan(ctx),
"stripe_product": tableStripeProduct(ctx),
"stripe_subscription": tableStripeSubscription(ctx),
"stripe_subscription_item": tableStripeSubscriptionItem(ctx),
},
}
return p
Expand Down
6 changes: 4 additions & 2 deletions stripe/table_stripe_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,13 @@ func listAccount(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData
plugin.Logger(ctx).Error("stripe_account.listAccount", "connection_error", err)
return nil, err
}
item, err := conn.Account.Get()

item, err := conn.Accounts.Get()
if err != nil {
plugin.Logger(ctx).Error("stripe_customer.listAccount", "query_error", err)
plugin.Logger(ctx).Error("stripe_account.listAccount", "query_error", err)
return nil, err
}

d.StreamListItem(ctx, item)
return nil, nil
}
2 changes: 1 addition & 1 deletion stripe/table_stripe_coupon.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package stripe
import (
"context"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform"
Expand Down
2 changes: 1 addition & 1 deletion stripe/table_stripe_customer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package stripe
import (
"context"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform"
Expand Down
2 changes: 1 addition & 1 deletion stripe/table_stripe_invoice.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package stripe
import (
"context"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"

"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
Expand Down
2 changes: 1 addition & 1 deletion stripe/table_stripe_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package stripe
import (
"context"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform"
Expand Down
2 changes: 1 addition & 1 deletion stripe/table_stripe_product.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package stripe
import (
"context"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform"
Expand Down
17 changes: 11 additions & 6 deletions stripe/table_stripe_subscription.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package stripe
import (
"context"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/v76"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform"
Expand Down Expand Up @@ -88,14 +88,19 @@ func listSubscription(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat

// Exact values can leverage optional key quals for optimal caching
q := d.EqualsQuals
if q["customer_id"] != nil {
params.Customer = q["customer_id"].GetStringValue()

customerId := q["customer_id"].GetStringValue()
if customerId != "" {
params.Customer = &customerId
}

if q["collection_method"] != nil {
params.CollectionMethod = stripe.String(q["collection_method"].GetStringValue())
}
if q["status"] != nil {
params.Status = q["status"].GetStringValue()

status := q["status"].GetStringValue()
if status != "" {
params.Status = &status
}

// Comparison values
Expand All @@ -116,7 +121,7 @@ func listSubscription(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat
}
params.CreatedRange.GreaterThanOrEqual = tsSecs
case "=":
params.Created = tsSecs
params.Created = &tsSecs
case "<=":
if params.CreatedRange == nil {
params.CreatedRange = &stripe.RangeQueryParams{}
Expand Down
79 changes: 79 additions & 0 deletions stripe/table_stripe_subscription_item.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package stripe

import (
"context"
//"time"

"github.com/stripe/stripe-go/v76"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform"
)

func tableStripeSubscriptionItem(ctx context.Context) *plugin.Table {
return &plugin.Table{
Name: "stripe_subscription_item",
Description: "Subscription Items in Stripe represent the individual products that a customer is subscribed to.",
List: &plugin.ListConfig{
KeyColumns: plugin.SingleColumn("subscription_id"),
Hydrate: listSubscriptionItem,
},
Columns: []*plugin.Column{
// Add columns relevant to SubscriptionItems here
{Name: "id", Type: proto.ColumnType_STRING, Description: "Unique identifier for the subscription."},
{Name: "plan", Type: proto.ColumnType_JSON, Transform: transform.FromField("Plan"), Description: "A plan represents a billing configuration. (Deprecated)"},
{Name: "price", Type: proto.ColumnType_JSON, Transform: transform.FromField("Price"), Description: "A price represents a unit cost for a product, specifying the amount, currency, and billing frequency."},
{Name: "subscription_id", Type: proto.ColumnType_STRING, Transform: transform.FromField("Subscription"), Description: "The ID of the subscription this item belongs to."},
{Name: "usage_record_summaries", Type: proto.ColumnType_JSON, Hydrate: listUsageRecordSummaries, Transform: transform.FromValue()},
},
}
}

// listSubscriptionItem lists all subscription items
func listSubscriptionItem(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData) (interface{}, error) {
conn, err := connect(ctx, d)
if err != nil {
plugin.Logger(ctx).Error("stripe_subscription.listSubscriptionItem", "connection_error", err)
return nil, err
}

subscription_id := d.EqualsQuals["subscription_id"].GetStringValue()
plugin.Logger(ctx).Debug("stripe_subscription.listSubscriptionItem", "subscription_id", subscription_id)

params := &stripe.SubscriptionItemListParams{
Subscription: stripe.String(subscription_id),
}

i := conn.SubscriptionItems.List(params)

for i.Next() {
d.StreamListItem(ctx, i.SubscriptionItem())
}

return nil, nil
}

func listUsageRecordSummaries(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData) (interface{}, error) {
item := h.Item.(*stripe.SubscriptionItem)

plugin.Logger(ctx).Debug("stripe_subscription.listUsageRecordSummaries", "item", item)

conn, err := connect(ctx, d)
if err != nil {
plugin.Logger(ctx).Error("stripe_subscription.listSubscriptionItem", "connection_error", err)
return nil, err
}

params := &stripe.SubscriptionItemUsageRecordSummariesParams{
SubscriptionItem: stripe.String(item.ID),
}

var summaries []*stripe.UsageRecordSummary
u := conn.SubscriptionItems.UsageRecordSummaries(params)
for u.Next() {
summary := u.UsageRecordSummary()
summaries = append(summaries, summary)
}

return summaries, nil
}
7 changes: 4 additions & 3 deletions stripe/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (
"errors"
"os"

"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/client"
"github.com/stripe/stripe-go/v76"
"github.com/stripe/stripe-go/v76/client"

"github.com/turbot/steampipe-plugin-sdk/v5/plugin"
)
Expand Down Expand Up @@ -39,8 +39,9 @@ func connect(_ context.Context, d *plugin.QueryData) (*client.API, error) {
return nil, errors.New("api_key must be configured")
}

maxRetries := int64(10)
config := &stripe.BackendConfig{
MaxNetworkRetries: 10,
MaxNetworkRetries: &maxRetries,
}

conn := &client.API{}
Expand Down

0 comments on commit 2359969

Please sign in to comment.