lecoffre-back-mini/src/controllers/stripe.controller.ts
2025-09-22 05:59:38 +00:00

121 lines
4.0 KiB
TypeScript

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<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;
}
return res.json({ received: true });
} catch (error) {
console.error('Webhook error:', error);
return res.status(500).json({
success: false,
message: 'Error processing webhook'
});
}
}
}