"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var WebhooksController_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebhooksController = void 0; const common_1 = require("@nestjs/common"); const config_1 = require("@nestjs/config"); const stripe_service_1 = require("./stripe.service"); const billing_service_1 = require("./billing.service"); let WebhooksController = WebhooksController_1 = class WebhooksController { constructor(stripeService, billingService, configService) { this.stripeService = stripeService; this.billingService = billingService; this.configService = configService; this.logger = new common_1.Logger(WebhooksController_1.name); } async handleStripeWebhook(req, signature) { const webhookSecret = this.configService.get('STRIPE_WEBHOOK_SECRET'); if (!webhookSecret) { this.logger.warn('STRIPE_WEBHOOK_SECRET not configured'); return { received: true }; } let event; try { event = this.stripeService.constructWebhookEvent(req.rawBody, signature, webhookSecret); } catch (err) { this.logger.error(`Webhook signature verification failed: ${err.message}`); return { error: 'Invalid signature' }; } this.logger.log(`Received Stripe event: ${event.type}`); try { switch (event.type) { case 'customer.subscription.created': case 'customer.subscription.updated': { const subscription = event.data.object; await this.billingService.handleSubscriptionCreated(subscription.id, subscription.customer, subscription.items.data[0].price.id); break; } case 'customer.subscription.deleted': { const subscription = event.data.object; await this.billingService.handleSubscriptionCancelled(subscription.id); break; } case 'payment_intent.succeeded': { const paymentIntent = event.data.object; const metadata = paymentIntent.metadata; if (metadata.packageCode && metadata.tenantId && metadata.tokens) { await this.billingService.handleTokenPurchase(metadata.tenantId, metadata.packageCode, parseInt(metadata.tokens, 10)); } break; } case 'invoice.payment_succeeded': { const invoice = event.data.object; this.logger.log(`Invoice paid: ${invoice.id}`); break; } case 'invoice.payment_failed': { const invoice = event.data.object; this.logger.warn(`Invoice payment failed: ${invoice.id}`); break; } case 'checkout.session.completed': { const session = event.data.object; this.logger.log(`Checkout completed: ${session.id}`); break; } default: this.logger.debug(`Unhandled event type: ${event.type}`); } } catch (error) { this.logger.error(`Error processing webhook: ${error.message}`); } return { received: true }; } }; exports.WebhooksController = WebhooksController; __decorate([ (0, common_1.Post)('stripe'), (0, common_1.HttpCode)(200), __param(0, (0, common_1.Req)()), __param(1, (0, common_1.Headers)('stripe-signature')), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, String]), __metadata("design:returntype", Promise) ], WebhooksController.prototype, "handleStripeWebhook", null); exports.WebhooksController = WebhooksController = WebhooksController_1 = __decorate([ (0, common_1.Controller)('webhooks'), __metadata("design:paramtypes", [stripe_service_1.StripeService, billing_service_1.BillingService, config_1.ConfigService]) ], WebhooksController); //# sourceMappingURL=webhooks.controller.js.map