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>
18 lines
666 B
C#
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; }
|
|
}
|
|
}
|