Legis — gestion de dossiers juridiques multi-tenant
Un produit SaaS vertical qui numérise le quotidien d'un cabinet d'avocats algérien : accueil des clients, enregistrement des affaires dans la hiérarchie judiciaire, suivi des audiences et des renvois, finances du cabinet, et documents en arabe recevables devant les tribunaux. L'ingénierie intéressante n'est pas le CRUD — c'est de modéliser un système juridique étranger assez fidèlement pour que le résultat soit utilisable au tribunal.
- DOMAINE
- 29 entités, hiérarchie judiciaire
- MULTI-TENANCE
- Schéma partagé, isolation par requête
- AUTH
- Rafraîchissement tournant, détection de rejeu
- SURFACE
- 212 endpoints REST, 180 gardes de droits
- PREMIER RENDU
- 977 → 168 Ko, chunk d'entrée gzippé
par IP
cookie
portée requête
lecture / écriture
↳ redis injoignable → on laisse passer, la connexion reste ouverte↳ licence expirée → lecture seule, jamais de blocage
première instance
lie les deux
cour d'appel
↳ la nouvelle affaire est elle-même susceptible d'appel — la chaîne se répète
- SOURCE
- 76 900 lignes · 3 dépôts
- DONNÉES
- 29 entités JPA · 31 migrations
- API
- 212 REST · 2 requêtes GraphQL
- RÉALISÉ
- 15 mois · 5 contributeurs
LE POINT DIFFICILE
Avec le sens droite-à-gauche appliqué à la page, mêler un libellé arabe et un numéro d'affaire latin dans un même bloc de texte fait planter le moteur PDF dans sa passe de réordonnancement bidirectionnel — et chaque document juridique associe exactement les deux. La solution a été de cesser de demander à cet algorithme de le résoudre : libellé et valeur sont devenus deux nœuds de texte dans une ligne flex, chacun de direction homogène, si bien que le chemin défaillant n'est jamais emprunté.
CE QUE J'AI ÉCARTÉ
Faire monter l'affaire dans la hiérarchie via une colonne de degré. Un appel est une seconde procédure, avec ses propres audiences, sa décision et ses honoraires ; les fusionner fait perdre le dossier dont l'avocat a besoin. Un appel crée désormais une nouvelle affaire liée à l'originale, et la chaîne se répète sans cas particulier.
CE QUE JE CORRIGERAIS EN PREMIER
L'isolation des locataires est appliquée dans la couche service à partir du contexte de la requête : un seul filtre oublié devient une fuite de confidentialité. La réponse est la sécurité au niveau des lignes, indexée sur une variable de session, pour que l'isolation survive à un WHERE manquant au lieu de reposer sur la rigueur des relectures.