85 lines
2.5 KiB
TypeScript
85 lines
2.5 KiB
TypeScript
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
|
|
import { ApiTags, ApiOperation, ApiBody, ApiBearerAuth } from '@nestjs/swagger';
|
|
import { StripeService } from './stripe.service';
|
|
|
|
class CreateCustomerDto {
|
|
email: string;
|
|
name: string;
|
|
}
|
|
|
|
class CreateSubscriptionDto {
|
|
customerId: string;
|
|
priceId: string;
|
|
}
|
|
|
|
class CreateCheckoutDto {
|
|
customerId: string;
|
|
priceId: string;
|
|
successUrl: string;
|
|
cancelUrl: string;
|
|
}
|
|
|
|
class BillingPortalDto {
|
|
customerId: string;
|
|
returnUrl: string;
|
|
}
|
|
|
|
class CancelSubscriptionDto {
|
|
subscriptionId: string;
|
|
}
|
|
|
|
@ApiTags('Stripe')
|
|
@ApiBearerAuth()
|
|
@Controller('stripe')
|
|
export class StripeController {
|
|
constructor(private readonly stripeService: StripeService) { }
|
|
|
|
@Post('customers')
|
|
@ApiOperation({ summary: 'Create a Stripe customer' })
|
|
@ApiBody({ type: CreateCustomerDto })
|
|
async createCustomer(@Body() body: CreateCustomerDto) {
|
|
return this.stripeService.createCustomer(body.email, body.name);
|
|
}
|
|
|
|
@Post('subscriptions')
|
|
@ApiOperation({ summary: 'Create a subscription' })
|
|
@ApiBody({ type: CreateSubscriptionDto })
|
|
async createSubscription(@Body() body: CreateSubscriptionDto) {
|
|
return this.stripeService.createSubscription(body.customerId, body.priceId);
|
|
}
|
|
|
|
@Get('subscriptions/:customerId')
|
|
@ApiOperation({ summary: 'List subscriptions for a customer' })
|
|
async listSubscriptions(@Param('customerId') customerId: string) {
|
|
return this.stripeService.listSubscriptions(customerId);
|
|
}
|
|
|
|
@Post('subscriptions/cancel')
|
|
@ApiOperation({ summary: 'Cancel a subscription' })
|
|
@ApiBody({ type: CancelSubscriptionDto })
|
|
async cancelSubscription(@Body() body: CancelSubscriptionDto) {
|
|
return this.stripeService.cancelSubscription(body.subscriptionId);
|
|
}
|
|
|
|
@Post('checkout')
|
|
@ApiOperation({ summary: 'Create a checkout session' })
|
|
@ApiBody({ type: CreateCheckoutDto })
|
|
async createCheckoutSession(@Body() body: CreateCheckoutDto) {
|
|
return this.stripeService.createCheckoutSession(
|
|
body.customerId,
|
|
body.priceId,
|
|
body.successUrl,
|
|
body.cancelUrl,
|
|
);
|
|
}
|
|
|
|
@Post('billing-portal')
|
|
@ApiOperation({ summary: 'Create a billing portal session' })
|
|
@ApiBody({ type: BillingPortalDto })
|
|
async createBillingPortalSession(@Body() body: BillingPortalDto) {
|
|
return this.stripeService.createBillingPortalSession(
|
|
body.customerId,
|
|
body.returnUrl,
|
|
);
|
|
}
|
|
}
|