121 lines
4.0 KiB
TypeScript
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'
|
|
});
|
|
}
|
|
}
|
|
}
|