manager-service/ManagerService/DTOs/InstanceQuotaDTO.cs
Thomas Fransolet 2dc0cfceeb Lot F : portail de facturation Stripe et coût réel d'une question
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>
2026-08-13 10:10:50 +02:00

18 lines
666 B
C#

namespace ManagerService.DTOs
{
public class InstanceQuotaDTO
{
public long storageUsedBytes { get; set; }
public long storageQuotaBytes { get; set; }
public long aiTokensUsed { get; set; }
public long aiTokensPerMonth { get; set; }
/// <summary>
/// Combien de jetons coûte une question, en moyenne. Le gestionnaire raisonne en
/// questions, pas en jetons : c'est le diviseur que manager-app doit appliquer, et il
/// vient d'ici pour être calé sur l'usage réel de l'instance plutôt que codé en dur.
/// </summary>
public long aiTokensPerQuestion { get; set; }
}
}