From c6a8564b7387a052bf3b17605ca5b9ef1a68e834 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 14:20:17 +0000 Subject: [PATCH] feat: Integrate credit system into Next.js SaaS Starter --- app/(dashboard)/credits/page.tsx | 22 ++ app/(dashboard)/dashboard/page.tsx | 16 +- app/(dashboard)/layout.tsx | 8 +- app/api/ai-generation/route.ts | 32 +++ app/api/credits/balance/route.ts | 16 ++ app/api/credits/grants-history/route.ts | 23 ++ app/api/credits/usage-history/route.ts | 23 ++ app/api/credits/use/route.ts | 28 +++ app/api/stripe/webhook/route.ts | 34 +-- components/ai/ai-generation-component.tsx | 34 +++ components/credits/credit-components.tsx | 171 +++++++++++++++ lib/db/schema.ts | 29 +++ lib/services/credit-service.ts | 190 +++++++++++++++++ lib/services/stripe-webhook-handler.ts | 44 ++++ lib/utils.ts | 7 + scripts/stripe-setup.js | 247 ++++++++++++++++++++++ 16 files changed, 890 insertions(+), 34 deletions(-) create mode 100644 app/(dashboard)/credits/page.tsx create mode 100644 app/api/ai-generation/route.ts create mode 100644 app/api/credits/balance/route.ts create mode 100644 app/api/credits/grants-history/route.ts create mode 100644 app/api/credits/usage-history/route.ts create mode 100644 app/api/credits/use/route.ts create mode 100644 components/ai/ai-generation-component.tsx create mode 100644 components/credits/credit-components.tsx create mode 100644 lib/services/credit-service.ts create mode 100644 lib/services/stripe-webhook-handler.ts create mode 100644 scripts/stripe-setup.js diff --git a/app/(dashboard)/credits/page.tsx b/app/(dashboard)/credits/page.tsx new file mode 100644 index 000000000..b3c1a9dcd --- /dev/null +++ b/app/(dashboard)/credits/page.tsx @@ -0,0 +1,22 @@ +import { CreditDashboard } from '@/components/credits/credit-components'; +import { getUser, getTeamForUser } from '@/lib/db/queries'; +import { redirect } from 'next/navigation'; + +export default async function CreditsPage() { + const user = await getUser(); + if (!user) { + redirect('/sign-in'); + } + + const team = await getTeamForUser(user.id); + if (!team) { + throw new Error('Team not found'); + } + + return ( +