← STATIONSCH 04 — FICHE/CH/04 · ÉCHAP POUR FERMERFREN

Pharmapedia — plateforme de révision en pharmacie

Une plateforme de révision pour étudiants en pharmacie, en production sur deux périodes d'examens. Six années de programme, un accès vendu sous forme de licences plutôt que par inscription, et des quiz de révision générés à la demande depuis une banque de questions. La charge est le point intéressant : quasi nulle la majeure partie de l'année, puis toute la promotion arrive dans la quinzaine qui précède les examens.

PROGRAMME
Six années, semestre → module → leçon
ACCÈS
Licences par année, semestre ou module
ÉVALUATION
Entraînement, examen chronométré, révision
SURFACE
80 routes, un seul process Next.js
PIC
Quinzaine d'examens, quelques milliers
FIG. 1 — GÉNÉRATION D'UN QUIZ DE RÉVISION
SÉLECTION
modules / leçons
LICENCE
vérif. de portée
BANQUE
questions actives
TIRAGE
mélangé, ×N
SESSION

↳ progression sauvegardée ; la soumission est transactionnelle↳ une seconde soumission sur une tentative terminée est refusée

UTILISATEURS
Quelques milliers en pharmacie
PROFIL
Charge concentrée sur les examens
CONSTATÉ
Aucune panne signalée sur deux sessions
DONNÉES
PostgreSQL 16 · Prisma · 12 migrations

LE POINT DIFFICILE

L'accès est vendu sous forme de licences, pas par inscription, et une licence porte sur une année, un semestre ou un module — exactement un des trois. Déterminer ce qu'un étudiant peut ouvrir revient à croiser son année avec chacune de ses licences actives, à chaque requête : et c'est cette requête qui doit rester peu coûteuse quand toute la promotion se connecte le même soir.

CE QUE J'AI ÉCARTÉ

L'inscription comme modèle d'accès. Elle correspond à la façon dont une université raisonne, mais pas à la façon dont le produit se vend : un étudiant achète un module, un semestre, ou l'année. Faire de la licence l'unité permet d'accorder et de faire expirer un accès sans toucher au programme qu'il vise.

CE QUE JE CORRIGERAIS EN PREMIER

Le cache et la limitation de débit vivent tous deux dans le process, ce qui fixe l'application à une seule instance : une seconde servirait ses propres lectures périmées et doublerait la limite réelle. Les déplacer derrière Redis est ce qui doit être fait avant que la charge ne grandisse encore — la forme actuelle a tenu, elle n'est pas confortable.