-
Notifications
You must be signed in to change notification settings - Fork 6
Open
Description
Summary
The component has getSubscriptionByOrgId which returns a single subscription, but there's no listSubscriptionsByOrgId to return all subscriptions for an organization.
This is problematic because getSubscriptionByOrgId uses .first() which returns subscriptions in creation order. If an org has both a canceled subscription (created first) and an active subscription (created later), the query returns the canceled one instead of the active one.
Current API
// Returns first subscription found (by creation time), regardless of status
export const getSubscriptionByOrgId = query({
args: { orgId: v.string() },
returns: v.union(subscriptionValidator, v.null()),
handler: async (ctx, args) => {
const subscription = await ctx.db
.query("subscriptions")
.withIndex("by_org_id", (q) => q.eq("orgId", args.orgId))
.first(); // <-- Returns first, could be canceled
// ...
},
});Requested Addition
Add listSubscriptionsByOrgId (similar to listSubscriptionsByUserId):
export const listSubscriptionsByOrgId = query({
args: { orgId: v.string() },
returns: v.array(subscriptionValidator),
handler: async (ctx, args) => {
const subscriptions = await ctx.db
.query("subscriptions")
.withIndex("by_org_id", (q) => q.eq("orgId", args.orgId))
.collect();
return subscriptions.map(({ _id, _creationTime, ...data }) => data);
},
});Use Case
When building organization-based billing, you need to find the active subscription for an org, not just the first one created. With listSubscriptionsByOrgId, we can filter by status:
const allOrgSubscriptions = await ctx.runQuery(
components.stripe.public.listSubscriptionsByOrgId,
{ orgId }
);
const activeSubscription = allOrgSubscriptions.find(
(sub) => ["active", "trialing", "past_due"].includes(sub.status)
);Current Workaround
We have to:
- Call
getSubscriptionByOrgIdto get any subscription - If it's not active, use its
stripeCustomerIdto calllistSubscriptions - Filter by
orgIdand status manually
This is inefficient and error-prone.
Environment
@convex-dev/stripeversion: 0.1.1
stephen776
Metadata
Metadata
Assignees
Labels
No labels