Backend (Supabase)
Vue d'ensemble
Le backend utilise Supabase qui fournit :
- Base de données PostgreSQL
- Authentification
- Stockage de fichiers
- Edge Functions (serverless)
- Realtime subscriptions
Structure du Projet
back-dedicaces/
├── supabase/
│ ├── functions/ # Edge Functions
│ │ ├── invite-participate/
│ │ ├── stripe/
│ │ ├── stripe-webhook/
│ │ ├── resend-invite-participate/
│ │ └── schedule-participant/
│ └── migrations/ # Migrations SQL
├── .env # Variables dev
└── .env.production # Variables prod
Authentification
Configuration
Supabase Auth est configuré avec :
- Email/Password : Authentification par défaut
- Magic Links : Liens de connexion par email
- Invitations : Via
auth.admin.inviteUserByEmail()
Flux d'Invitation
// Edge Function: invite-participate
const { email, productId } = await req.json();
// Créer l'invitation via Supabase Admin
const { data, error } = await supabaseAdmin.auth.admin.inviteUserByEmail(
email,
{
redirectTo: `${SITE_URL}/confirmation-invitation?productId=${productId}`
}
);
// Créer l'entrée product_items
await supabaseAdmin
.from('product_items')
.insert({
product_id: productId,
participant_id: data.user.id,
participant_name: email
});
Edge Functions
invite-participate
Invite des participants à un événement.
Endpoint: POST /functions/v1/invite-participate
Body:
{
"productId": "123",
"emails": ["user1@example.com", "user2@example.com"],
"sendByEmail": true
}
Réponse:
{
"success": true,
"invited": 2
}
stripe
Crée une session Stripe Checkout.
Endpoint: POST /functions/v1/stripe
Body:
{
"product_id": "123"
}
Réponse:
{
"id": "cs_xxx",
"url": "https://checkout.stripe.com/..."
}
Implémentation:
import Stripe from 'stripe';
const stripe = new Stripe(Deno.env.get('STRIPE_API_KEY'));
Deno.serve(async (req) => {
const { product_id } = await req.json();
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [{
price: 'price_1OrKs4Hk3BKifCINtMxMgRYE',
quantity: 1,
}],
mode: 'payment',
success_url: `${SITE_URL}/paiement/succes?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${SITE_URL}/paiement/erreur`,
metadata: {
product_id
}
});
return new Response(JSON.stringify(session), {
headers: { 'Content-Type': 'application/json' }
});
});