3 Commits

Author SHA1 Message Date
Thomas Fransolet
a3e0b4df71 Le plafond de 5 utilisateurs existe enfin cote serveur
CreateUser ne comptait rien. Ce qui a ete livre le 12/08 dans manager-app --
compteur « X / 5 » et bouton d'ajout desactive -- est un garde-fou
d'interface : un POST direct sur l'API passait toujours. Le controle est
desormais fait la ou il est opposable, et rend 422.

Cote front, rien a retoucher : le resultat d'invokeAPI est deja lu depuis le
correctif du 409 e-mail deja pris, donc le message remontera tel quel.

Deux choix, tous deux documentes dans le code :

- 5 en dur. Le faire varier par plan serait une colonne sur SubscriptionPlan,
  qui n'en porte aucune sur les utilisateurs -- donc une migration apres le
  gel du schema (lot B). Dette V1 assumee.
- Le SuperAdmin n'y est pas soumis. C'est la seule porte de service qui
  reste tant qu'aucun champ ne permet de relever la limite d'un client, et
  ca s'aligne sur le front, qui ne lui montre deja pas le compteur.

L'inscription self-service (OnboardingController) n'est pas concernee : elle
cree le premier utilisateur d'une instance neuve.

4 tests : au plafond, sous le plafond, plafond par instance, SuperAdmin
exempte. dotnet test 175/175.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 14:55:24 +02:00
Thomas Fransolet
af6b5b76ef Self-service onboarding (Stripe + Resend) + Postgres v3 schema (pgvector, media, visitor questions)
75 fichiers, ~1 mois de travail depuis f222861 (17/07). Contenu :

Onboarding self-service — jamais exécuté de bout en bout
  OnboardingController, StripeWebhookController, StripeService, ResendEmailService
  + IEmailService (10 templates), EmailTemplates/, TrialLifecycleService (Hangfire),
  PasswordTokenHelper, SlugHelper, 5 DTOs. Essai 14 j, Stripe customer/Checkout/Tax,
  mot de passe oublié + invitation user, plafond IA d'essai.

Schéma Postgres v3 — passe pendant que la base est vide
  ContentEmbedding + index HNSW (vector_cosine_ops), IEmbeddingService +
  GoogleEmbeddingService (gemini-embedding-001, 768 dims), Deployment/Dockerfile.postgres
  (postgis 3.4.3 + pgvector 0.8.6, épinglé par digest — un tag mobile rejouerait le
  warning de collation glibc). Colonnes Resource : StoragePath, FileName,
  IncludeInAiKnowledge, AiIndexStatus + nouveaux ResourceType ajoutés EN FIN d'enum.

Guide IA
  Champs Guide* sur Instance + InstanceDTO, AssistantService lit la configuration client
  dans les 4 blocs de prompt (ton codé en dur retiré, règle hors-sujet ajoutée aux deux
  variantes qui n'en avaient pas), IHttpClientFactory à la place des new HttpClient().
  Table VisitorQuestion + ConversationId sur AiChatRequest.

Stats
  Rétention unifiée à 13 mois (instances ET plans), VisitEventPurgeService.

Nettoyage
  IsStepLocked / IsHiddenInitially / FactContent supprimés de GuidedStep — IsStepLocked
  rendait une étape définitivement infranchissable même après réussite.
  SectionMap allégé (-57 lignes).

Tests
  SectionParcoursControllerTests, FakeConfiguration, FakeEmailService.
  ContentEmbedding a cassé 116 tests sur 124 (EF InMemory ne connaît pas Vector) :
  l'entité est exclue quand le provider n'est pas Npgsql. Conséquence assumée —
  le vector store n'est couvert par aucun test. dotnet test 124/124.

10 migrations EF. Base locale à jour, dotnet build 0 erreur.
Rien n'est en prod : la bascule Mongo → Postgres est décrite dans DOCS/STATUS.md §1quinquies.

⚠️ appsettings.json contient les clés Stripe (test) et Resend (prod) en clair — à rotationner.
2026-08-09 22:11:48 +02:00
Thomas Fransolet
e0ff0eeba6 Quota update in controller, audit log (serilog) + ai translator + Unit tests ! (to be tested) + migration update 2026-04-10 16:28:33 +02:00