import { createServerFn } from '@tanstack/react-start';
import { db } from '@repo/db';
import { stripeClient } from '../stripe';
import type Stripe from 'stripe';
type StripePrice = {
// my internal metadata shape
recurrence: 'month' | 'year';
productId: string;
description: string;
priceId: string;
costPerCredit: number;
// ...
};
export const getSubscription = createServerFn()
// inputValidator + middleware omitted for brevity
.handler(async ({ context: { db, session } }) => {
const sub = await db.query.subscriptions.findFirst({
where: (subs, { eq }) =>
eq(subs.referenceId, session.session.userId),
});
if (!sub?.stripeSubscriptionId) return null;
const stripeSub: Stripe.Response<Stripe.Subscription> =
await stripeClient.subscriptions.retrieve(
sub.stripeSubscriptionId,
{
expand: [
'latest_invoice',
'latest_invoice.payment_intent',
'latest_invoice.charge',
'latest_invoice.payment_intent.payment_method',
'items.data.price.product',
'schedule',
],
},
);
return {
...sub,
// previously compatible
metadata: sub.metadata as StripePrice | undefined,
// this is what triggers the type error now
stripe: stripeSub,
};
});
import { createServerFn } from '@tanstack/react-start';
import { db } from '@repo/db';
import { stripeClient } from '../stripe';
import type Stripe from 'stripe';
type StripePrice = {
// my internal metadata shape
recurrence: 'month' | 'year';
productId: string;
description: string;
priceId: string;
costPerCredit: number;
// ...
};
export const getSubscription = createServerFn()
// inputValidator + middleware omitted for brevity
.handler(async ({ context: { db, session } }) => {
const sub = await db.query.subscriptions.findFirst({
where: (subs, { eq }) =>
eq(subs.referenceId, session.session.userId),
});
if (!sub?.stripeSubscriptionId) return null;
const stripeSub: Stripe.Response<Stripe.Subscription> =
await stripeClient.subscriptions.retrieve(
sub.stripeSubscriptionId,
{
expand: [
'latest_invoice',
'latest_invoice.payment_intent',
'latest_invoice.charge',
'latest_invoice.payment_intent.payment_method',
'items.data.price.product',
'schedule',
],
},
);
return {
...sub,
// previously compatible
metadata: sub.metadata as StripePrice | undefined,
// this is what triggers the type error now
stripe: stripeSub,
};
});