PD-285 — Alignement contractuel de la limite d’upload backend à 500 MB¶
1. Objectif¶
Contractualiser l’alignement des limites de taille d’upload backend de 100 MB à 500 MB pour supprimer l’incohérence inter-EB avec PD-101, garantir une règle unique côté backend pour les catégories concernées, et synchroniser la documentation normative PD-252.
2. Périmètre / Hors périmètre¶
Inclus¶
- Relèvement de la limite
maxSizeBytesà524288000bytes (500 MB) pour : DocumentCategoryConfig.DEFAULTDocumentCategoryConfig.B2C_EVIDENCE_MINOR- Validation contractuelle des rejets au-delà de
500 MB: - pré-validation middleware (via
Content-Lengthquand présent) - validation métier service (code erreur
ERR-79-004) - Mise à jour des tests unitaires liés aux limites de catégorie.
- Amendement documentaire PD-252 (
besoinetspécification) avec la référencestorage.category_max_bytes: 500 MB. - Validation de cohérence inter-EB : suppression de l’écart PD-101 vs backend.
Exclu¶
- Changement de
NORMATIVE_DEFAULTS.MAX_FILE_SIZE(multipart,5 TB) : inchangé. - Changement des quotas utilisateur (cumul, concurrence, journalier) : inchangé.
- Changement client mobile PD-101 : inchangé.
- Changement d’infrastructure S3/OVH : inchangé.
- Changement des politiques MIME / audit mineurs hors taille : inchangé.
3. Définitions¶
- MB (binaire) :
1 MB = 1024 * 1024 bytes. - 500 MB :
524288000 bytes. - 100 MB :
104857600 bytes. - Catégorie documentaire : clé de configuration de politique de fichier (ex.
DEFAULT,B2C_EVIDENCE_MINOR). Content-Length: en-tête HTTP représentant la taille du corps, entier en bytes.ERR-79-004: code d’erreur métier “taille fichier dépassée”.- Règle de cohérence inter-EB :
SYSTÈME >= BACKEND >= CLIENT. - Amendement documentaire : modification des artefacts PD-252 sans ajout de nouvelle logique métier.
4. Invariants (non négociables)¶
| ID | Règle | Justification |
|---|---|---|
| INV-285-01-coherence | La borne backend pour les catégories ciblées est 500 MB (exactement 524288000 bytes) et respecte SYSTÈME >= BACKEND >= CLIENT. | Élimine l’incohérence détectée par la pipeline inter-EB. |
| INV-285-02-categories-cible | Seules DEFAULT et B2C_EVIDENCE_MINOR sont relevées à 500 MB dans cette story. | Respect strict du besoin et limitation du périmètre. |
| INV-285-03-rejet-hors-borne | Toute taille strictement > 524288000 bytes est rejetée. Comportement hors borne : rejet explicite (pas de clamp). | Règle testable, déterministe, et conforme CA-03/CA-04. |
| INV-285-04-unite-et-bornes | Paramètre storage.category_max_bytes : défaut 524288000, min 1, max 524288000, unité bytes. Valeur hors [1, 524288000] : invalide/rejetée. | Bornage numérique contractuel explicite. |
| INV-285-05-erreur-metier | Le rejet métier pour dépassement de taille utilise ERR-79-004. | UX et observabilité cohérentes côté backend. |
| INV-285-06-non-regression | Tout fichier de taille 1..104857600 bytes conserve le comportement antérieur (acceptation si autres règles satisfaites). | Garantie de rétrocompatibilité fonctionnelle. |
| INV-285-07-doc-sync | PD-252 besoin et spécification référencent storage.category_max_bytes: 500 MB après amendement. | Source documentaire alignée avec la norme backend. |
| INV-285-08-checklist-temporelle | Aucune transition temporelle identifiée. | Exigence SLA temporels traitée explicitement. |
| INV-285-09-etats-retour | Aucune transition retour applicable (validation stateless requête par requête, sans machine d’état persistée modifiée). | Exigence transitions inverses traitée explicitement. |
| INV-285-10-protection-distribuee | Aucun mécanisme de protection distribuée applicable (module synchrone mono-instance sur ce flux de validation). | Pas de worker/queue/lock dans le périmètre de la story. |
| INV-285-11-atomicite-ddl | Aucune atomicité multi-composant applicable et aucune migration DDL applicable. | Aucun flux DB+queue ni modification de schéma demandés. |
| INV-285-12-intermodule | Aucune contrainte inter-module applicable. | Aucun guard cross-module ni dépendance de route externe demandés. |
5. Flux nominaux¶
Flux N1 — Lecture de la règle de taille catégorie¶
- Le système récupère la limite de taille de la catégorie documentaire.
- Pour
DEFAULTetB2C_EVIDENCE_MINOR, la limite effective est524288000 bytes. - Cette valeur est la référence contractuelle unique pour la story.
Flux N2 — Pré-validation d’upload (middleware)¶
- Le client émet une requête d’upload avec
Content-Length(si présent). - Le middleware compare
Content-Lengthà la limite de catégorie. - Si
Content-Length > 524288000, la requête est rejetée. - Si
Content-Length <= 524288000, le flux continue vers la validation métier.
Flux N3 — Validation métier de taille (service)¶
- Le service applique la limite de catégorie sur la taille du fichier à valider.
- Si taille
> 524288000, rejet avecERR-79-004. - Si taille
<= 524288000, la validation taille est conforme (sous réserve des autres règles hors périmètre).
Flux N4 — Amendement documentaire PD-252¶
- Le besoin PD-252 est amendé pour refléter
storage.category_max_bytes: 500 MB. - La spécification PD-252 est amendée avec la même valeur de référence.
- Les deux artefacts sont cohérents entre eux.
Flux N5 — Vérification de cohérence inter-EB¶
- La pipeline de cohérence inter-EB exécute le contrôle des contraintes de taille.
- Le couple PD-101 (client 500 MB) / backend (500 MB) n’est plus signalé comme incohérent.
Modèle de données contractuel (§5, référence unique)¶
| Donnée | Format/encodage | Taille/longueur | Jeu caractères | Sensibilité casse | Regex/contrainte | Comportement invalide |
|---|---|---|---|---|---|---|
DocumentCategory (DEFAULT, B2C_EVIDENCE_MINOR) | Enum texte | 1..64 caractères (valeurs connues) | A-Z + _ | case-sensitive | ^[A-Z_]{1,64}$ + appartenance à l’enum | Rejet de la requête de validation |
maxSizeBytes | Entier décimal (bytes) | 1..524288000 | 0-9 | N/A | ^[0-9]+$ et borne numérique | Rejet de configuration/validation |
Content-Length | Entier décimal HTTP | >=0 ; borne utile story 0..524288000 | 0-9 | N/A | ^[0-9]+$ | Valeur non numérique : requête invalide ; valeur > borne : rejet |
Code erreur ERR-79-004 | Chaîne ASCII | exact 10 chars | A-Z0-9- | case-sensitive | ^ERR-[0-9]{2}-[0-9]{3}$ | Si code différent, non-conformité contractuelle |
5bis. Diagrammes¶
Séquence — Validation de taille d’upload (Flux N2 + N3)¶
sequenceDiagram
participant Client
participant Middleware as Middleware (pré-validation)
participant Service as Service métier (validation catégorie)
Client->>Middleware: POST /upload (Content-Length, catégorie)
alt Content-Length > 524288000 [INV-285-03]
Middleware-->>Client: 413 Rejet immédiat (E-01)
else Content-Length <= 524288000 ou absent
Middleware->>Service: Forward requête
Service->>Service: Récupère maxSizeBytes catégorie [INV-285-01, INV-285-02]
alt taille fichier > 524288000 [INV-285-03]
Service-->>Client: 400 ERR-79-004 (E-02) [INV-285-05]
else taille fichier <= 524288000
Note over Service: Validation taille OK [INV-285-06]
Service-->>Client: 200 Upload accepté
end
end Séquence — Cohérence inter-EB post-amendement (Flux N4 + N5)¶
sequenceDiagram
participant Ops as Orchestrateur
participant Doc as PD-252 (besoin + spec)
participant Pipeline as Pipeline cohérence inter-EB
Ops->>Doc: Amende storage.category_max_bytes = 500 MB [INV-285-07]
Doc-->>Ops: Artefacts mis à jour
Ops->>Pipeline: Exécute contrôle cohérence
Pipeline->>Pipeline: Compare PD-101 client (500 MB) vs backend (500 MB) [INV-285-01]
Pipeline-->>Ops: Aucune incohérence détectée 6. Cas d’erreur¶
| ID | Cas | Réponse attendue |
|---|---|---|
| E-01 | Content-Length > 524288000 au middleware | Rejet immédiat de la requête (pré-validation). |
| E-02 | Taille métier > 524288000 au service | Rejet métier avec ERR-79-004. |
| E-03 | Catégorie non reconnue | Rejet explicite selon politique de validation de catégorie (hors périmètre du code d’erreur spécifique taille). |
| E-04 | Valeur de taille non numérique / mal formée | Rejet explicite (entrée invalide). |
| E-05 | Documentation PD-252 non alignée avec backend | Non-conformité documentaire bloquante pour clôture de story. |
| E-06 | Pipeline inter-EB signale encore un écart | Critère CA-07 non satisfait, story non clôturable. |
7. Critères d’acceptation (testables)¶
| ID | Critère | Observable |
|---|---|---|
| CA-01 | DocumentCategoryConfig.DEFAULT.maxSizeBytes = 524288000 | Test unitaire/lecture config confirme la valeur exacte. |
| CA-02 | DocumentCategoryConfig.B2C_EVIDENCE_MINOR.maxSizeBytes = 524288000 | Test unitaire/lecture config confirme la valeur exacte. |
| CA-03 | Le middleware rejette les uploads > 500 MB via Content-Length | Test middleware : 524288001 rejeté ; 524288000 accepté (sur critère taille). |
| CA-04 | Le service rejette les uploads > 500 MB avec ERR-79-004 | Test service : dépassement taille -> code d’erreur conforme. |
| CA-05 | Les tests unitaires liés aux limites sont à jour et passent | Exécution suite ciblée : statut succès. |
| CA-06 | PD-252 besoin + spécification mentionnent storage.category_max_bytes: 500 MB | Diff documentaire vérifiable dans les deux artefacts. |
| CA-07 | La pipeline de cohérence inter-EB ne signale plus l’incohérence PD-101 vs backend | Rapport de cohérence sans issue correspondante. |
8. Scénarios de test (Given / When / Then)¶
-
T-01 (CA-01)
Given la configuration catégories backend
When la valeurDEFAULT.maxSizeBytesest lue
Then elle vaut524288000. -
T-02 (CA-02)
Given la configuration catégories backend
When la valeurB2C_EVIDENCE_MINOR.maxSizeBytesest lue
Then elle vaut524288000. -
T-03 (CA-03 borne haute rejet)
Given une requête upload avecContent-Length = 524288001et catégorieDEFAULT
When le middleware de taille exécute la pré-validation
Then la requête est rejetée. -
T-04 (CA-03 borne haute inclusive acceptée)
Given une requête upload avecContent-Length = 524288000et catégorieDEFAULT
When le middleware de taille exécute la pré-validation
Then la requête n’est pas rejetée pour motif de taille. -
T-05 (CA-04)
Given une validation métier avec taille fichier524288001
When le service de configuration applique la règle de catégorie
Then la réponse contientERR-79-004. -
T-06 (CA-05)
Given la suite de tests unitaires mise à jour
When la suite est exécutée
Then tous les tests concernés sont passants. -
T-07 (CA-06)
Given les artefacts PD-252 besoin et spécification
When les documents sont vérifiés
Then chacun contient la contraintestorage.category_max_bytes: 500 MB. -
T-08 (CA-07)
Given la pipeline de cohérence inter-EB exécutée après amendement
When le rapport de cohérence est produit
Then aucune incohérence PD-101 vs backend sur la taille max n’est remontée.
9. Hypothèses explicites¶
| ID | Hypothèse | Impact si faux |
|---|---|---|
| H-01 | La valeur 500 MB est exprimée en base binaire (500 * 1024 * 1024). | Risque d’écart d’interprétation et de faux positifs/negatifs aux bornes. |
| H-02 | Le code d’erreur ERR-79-004 reste la référence contractuelle pour dépassement de taille. | Incohérence API/UX et tests à réviser. |
| H-03 | La pipeline inter-EB compare les contraintes sur une même unité (bytes). | Résultats de cohérence potentiellement invalides. |
| H-04 | Aucun autre profil catégorie ne doit être relevé dans cette story. | Extension de périmètre non contractualisée. |
| H-05 | Le contrôle middleware via Content-Length n’est pas l’unique garde-fou ; la validation métier reste autorité finale. | Risque de contournement si en-tête absent/incorrect. |
| H-06 | Les mécanismes multipart et quotas existants restent inchangés et opérationnels. | Risque non évalué sur charge/abus au-delà du périmètre. |
10. Points à clarifier¶
10.1 Contraintes techniques (obligatoire)¶
- Projet cible code :
ProbatioVault-backend - Stack contractuelle réelle :
NestJS + TypeScript + TypeORM + PostgreSQL - Indices de référence stack :
package.json,nest-cli.json - Projet documentaire associé :
ProbatioVault-doc(Markdown, sans runtime applicatif)
10.2 Données manquantes / ambiguïtés à lever¶
| ID | Point à clarifier | Pourquoi |
|---|---|---|
| Q-01 | Nom final de l’épic (valeur fournie = Référence épique) | Référence incomplète pour l’artefact final. |
| Q-02 | Valeur de {DOMAINE} et {PD-285-nom} pour le chemin de destination | Nécessaire pour un chemin d’artefact déterministe. |
| Q-03 | Sémantique attendue quand Content-Length est absent/non fiable | Nécessaire pour verrouiller le comportement de pré-validation (middleware). |
| Q-04 | Format exact attendu du rapport de cohérence pour CA-07 | Nécessaire pour rendre l’observable de clôture totalement objectif. |
Références¶
- Epic :
Référence épique(à préciser) - JIRA :
PD-285 - Repos concernés :
ProbatioVault-backend,ProbatioVault-doc - Documents associés :
PD-252-besoin.mdPD-252-specification.mdPD-101(référence cohérence client)- Rapport
coherence-report.py(Level 1.1, issue #5)