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