import { Request, Response } from 'express'; import Stripe from 'stripe'; import { StripeService } from '../services/stripe'; import { stripeConfig, isStripeConfigured } from '../config/stripe'; export class StripeController { private static stripeService = new StripeService(); // Only for test static async createTestSubscription(req: Request, res: Response) { if (!isStripeConfigured()) { return res.status(503).json({ success: false, message: 'Stripe n\'est pas configuré pour ce déploiement' }); } try { const result = await StripeController.stripeService.createTestSubscription(); return res.json({ success: true, data: result }); } catch (error: any) { return res.status(500).json({ success: false, message: 'Erreur lors de la création de l\'abonnement de test', error: { message: error.message, type: error.type, code: error.code } }); } } static async createCheckoutSession(req: Request, res: Response) { try { const session = await StripeController.stripeService.createCheckoutSession(req.body, req.body.frequency); return res.json({ success: true, sessionId: session.id }); } catch (error) { console.error('Error creating checkout:', error); return res.status(500).json({ success: false, message: 'Erreur lors de la création de la session de paiement' }); } } static async getSubscription(req: Request, res: Response) { try { const subscription = await StripeController.stripeService.getSubscription(req.params.id); return res.json({ success: true, subscription }); } catch (error) { return res.status(500).json({ success: false, message: 'Erreur lors de la récupération de l\'abonnement' }); } } static async createPortalSession(req: Request, res: Response) { try { const session = await StripeController.stripeService.createPortalSession(req.params.id); return res.json({ success: true, url: session.url }); } catch (error) { return res.status(500).json({ success: false, message: 'Erreur lors de la création de la session du portail' }); } } static async handleWebhook(req: Request, res: Response): Promise { const sig = req.headers['stripe-signature'] as string; let event: Stripe.Event; try { event = Stripe.webhooks.constructEvent(req.body, sig, stripeConfig.STRIPE_WEBHOOK_SECRET!); } catch (err: any) { return res.status(400).send(`Webhook Error: ${err.message}`); } try { switch (event.type) { case 'checkout.session.completed': const session = event.data.object as Stripe.Checkout.Session; if (session.status === 'complete') { const subscription = JSON.parse(session.metadata!.subscription); // Stock subscription (create process) console.log('New subscription:', subscription); } break; case 'invoice.payment_succeeded': const invoice = event.data.object as Stripe.Invoice; if (['subscription_update', 'subscription_cycle'].includes(invoice.billing_reason!)) { const subscription = await StripeController.stripeService.getSubscription((invoice as any).subscription); // Update subscription (update process) console.log('Subscription update:', subscription); } break; case 'customer.subscription.deleted': const deletedSubscription = event.data.object as Stripe.Subscription; // Delete subscription (update process to delete) console.log('Subscription deleted:', deletedSubscription.id); break; } return res.json({ received: true }); } catch (error) { console.error('Webhook error:', error); return res.status(500).json({ success: false, message: 'Error processing webhook' }); } } }