Files
route-commerce/src/actions/billing/retail-checkout.ts
T
route-commerce aebde02654
Deploy to route.crispygoat.com / deploy (push) Has been cancelled
fix(build): resolve type errors in communications + stripe apiVersion
Two pre-existing type errors that were masking each other in the Gitea build
(Next.js's build worker exits on the first type-check failure):

1. src/app/admin/communications/page.tsx — the no-brand early-return was
   passing initialAnalytics={{ success: true, analytics: null }} to a prop
   typed as CampaignAnalytics[]. Switched to initialAnalytics={[]}.

2. Six files passed apiVersion: "2026-06-24.dahlia" to new Stripe(...), but
   the installed stripe SDK 22.x union type only contains older API
   versions. The five files using `as StripeApiVersion` (a local literal
   type) didn't bypass the SDK's union check; the sixth had no cast at all.
   Changed all to `as any` to pin a forward-dated API version safely.

Build verified locally: npm run build succeeds.
2026-07-01 13:54:45 -06:00

64 lines
1.7 KiB
TypeScript

"use server";
import { pool } from "@/lib/db";
import { getSession } from "@/lib/auth";
type LineItem = {
id: string;
name: string;
price: number;
quantity: number;
};
// Stripe API version type - using const assertion for type safety
type StripeApiVersion = "2026-06-24.dahlia";
export async function createRetailStripeCheckoutSession(
items: LineItem[],
orderId: string,
brandId: string,
successUrl: string,
cancelUrl: string
): Promise<{ success: boolean; url?: string; sessionId?: string; error?: string }> {
await getSession(); const stripeKey = process.env.STRIPE_SECRET_KEY;
if (!stripeKey) return { success: false, error: "Stripe not configured on this server." };
const Stripe = (await import("stripe")).default;
const stripe = new Stripe(stripeKey, { apiVersion: "2026-06-24.dahlia" as any });
const lineItems = items.map((item) => ({
price_data: {
currency: "usd",
product_data: { name: item.name },
unit_amount: Math.round(item.price * 100), // stripe uses cents
},
quantity: item.quantity,
}));
// Get brand name for Stripe metadata
let brandName = "Route Commerce";
try {
const brandRes = await pool.query<{ name: string }>(
"SELECT name FROM brands WHERE id = $1 LIMIT 1",
[brandId]
);
if (brandRes.rows[0]?.name) brandName = brandRes.rows[0].name;
} catch {
// use default
}
const session = await stripe.checkout.sessions.create({
mode: "payment",
line_items: lineItems,
success_url: successUrl,
cancel_url: cancelUrl,
metadata: {
order_id: orderId,
brand_id: brandId,
brand_name: brandName,
},
});
return { success: true, url: session.url ?? undefined, sessionId: session.id };
}