Customer Portal : StripeService.CreateBillingPortalSessionAsync + POST /api/onboarding/billing-portal, calqué sur checkout-session. Une garde absente de l'énoncé : StripeCustomerId peut être nul, car CreateCustomerAsync n'est appelée que par l'inscription self-service. Les 4 instances venues de Mongo n'ont jamais vu Stripe — sans la garde, elles recevaient une erreur d'API Stripe illisible côté front. 409, distinct du 404 d'instance inconnue. Ratio jetons -> questions : InstanceQuotaDTO.aiTokensPerQuestion, mesuré sur les VisitorQuestion.TokensUsed de l'instance, seuil de 20 questions avant de faire foi — une seule réponse citant un long article doublerait la moyenne. En dessous, repli sur l'hypothèse de la grille tarifaire (10 000, pas 1 000 : le /1000 de manager-app était faux d'un facteur 10). Trois autres points du lot F étaient déjà faits et n'attendaient qu'une vérification : rate limiting, endpoint ApplicationInstance, quotas seed. 6 tests. dotnet test : 197 passés, 14 sautés, 0 échec. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Migrations
Invite de commande
Ouvrir un invite de commande dans le répertoire de la solution
Supprimer la dernière migration
A faire uniquement si elle n'a pas encore été appliquée à la base de données
dotnet ef migrations remove
Ajouter une migration
dotnet ef migrations add
Mise à jour de la base de données
dotnet ef database update