import { Body, Controller, Get, Headers, Post, RawBodyRequest, Req, } from "@nestjs/common"; import { Request } from "express"; import { ok } from "../common/response"; import { StripeService } from "./stripe.service"; import { CurrentUser } from "../common/decorators/current-user.decorator"; import { Public } from "../common/decorators/public.decorator"; import { PrismaService } from "../prisma/prisma.service"; @Controller("billing") export class StripeController { constructor( private readonly stripeService: StripeService, private readonly prisma: PrismaService, ) {} @Get("subscription") async getSubscription(@CurrentUser() userId: string) { const data = await this.stripeService.getSubscription(userId); return ok(data); } @Post("checkout") async checkout(@CurrentUser() userId: string, @Body("priceId") priceId: string) { const user = await this.prisma.user.findUnique({ where: { id: userId }, select: { email: true }, }); if (!user) return ok({ error: "User not found" }); const data = await this.stripeService.createCheckoutSession(userId, user.email, priceId); return ok(data); } @Post("portal") async portal(@CurrentUser() userId: string) { const data = await this.stripeService.createPortalSession(userId); return ok(data); } @Public() @Post("webhook") async webhook( @Req() req: RawBodyRequest, @Headers("stripe-signature") signature: string, ) { const data = await this.stripeService.handleWebhook(req.rawBody!, signature); return data; } }