All files / src/controllers stripe.controller.ts

0% Statements 0/44
0% Branches 0/7
0% Functions 0/5
0% Lines 0/44

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114                                                                                                                                                                                                                                   
import { Request, Response } from 'express';
import Stripe from 'stripe';
import { StripeService } from '../services/stripe';
import { stripeConfig } from '../config/stripe';
 
export class StripeController {
  private static stripeService = new StripeService();
 
  // Only for test
  static async createTestSubscription(req: Request, res: Response) {
    try {
      const result = await StripeController.stripeService.createTestSubscription();
      res.json({
        success: true,
        data: result
      });
    } catch (error: any) {
      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);
      res.json({ success: true, sessionId: session.id });
    } catch (error) {
      console.error('Error creating checkout:', error);
      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);
      res.json({ success: true, subscription });
    } catch (error) {
      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);
      res.json({ success: true, url: session.url });
    } catch (error) {
      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<any> {
    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;
      }
 
      res.json({ received: true });
    } catch (error) {
      console.error('Webhook error:', error);
      res.status(500).json({
        success: false,
        message: 'Error processing webhook'
      });
    }
  }
}