Aller au contenu

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 à 524288000 bytes (500 MB) pour :
  • DocumentCategoryConfig.DEFAULT
  • DocumentCategoryConfig.B2C_EVIDENCE_MINOR
  • Validation contractuelle des rejets au-delà de 500 MB :
  • pré-validation middleware (via Content-Length quand 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 (besoin et spécification) avec la référence storage.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

  1. Le système récupère la limite de taille de la catégorie documentaire.
  2. Pour DEFAULT et B2C_EVIDENCE_MINOR, la limite effective est 524288000 bytes.
  3. Cette valeur est la référence contractuelle unique pour la story.

Flux N2 — Pré-validation d’upload (middleware)

  1. Le client émet une requête d’upload avec Content-Length (si présent).
  2. Le middleware compare Content-Length à la limite de catégorie.
  3. Si Content-Length > 524288000, la requête est rejetée.
  4. Si Content-Length <= 524288000, le flux continue vers la validation métier.

Flux N3 — Validation métier de taille (service)

  1. Le service applique la limite de catégorie sur la taille du fichier à valider.
  2. Si taille > 524288000, rejet avec ERR-79-004.
  3. 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

  1. Le besoin PD-252 est amendé pour refléter storage.category_max_bytes: 500 MB.
  2. La spécification PD-252 est amendée avec la même valeur de référence.
  3. Les deux artefacts sont cohérents entre eux.

Flux N5 — Vérification de cohérence inter-EB

  1. La pipeline de cohérence inter-EB exécute le contrôle des contraintes de taille.
  2. 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 valeur DEFAULT.maxSizeBytes est lue
    Then elle vaut 524288000.

  • T-02 (CA-02)
    Given la configuration catégories backend
    When la valeur B2C_EVIDENCE_MINOR.maxSizeBytes est lue
    Then elle vaut 524288000.

  • T-03 (CA-03 borne haute rejet)
    Given une requête upload avec Content-Length = 524288001 et catégorie DEFAULT
    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 avec Content-Length = 524288000 et catégorie DEFAULT
    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 fichier 524288001
    When le service de configuration applique la règle de catégorie
    Then la réponse contient ERR-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 contrainte storage.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.md
  • PD-252-specification.md
  • PD-101 (référence cohérence client)
  • Rapport coherence-report.py (Level 1.1, issue #5)