gohorsejobs/backoffice/src/stripe/stripe.controller.ts

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,
);
}
}