Aller au contenu

PD-278 — Agent Developer — Module dip-config

Livrable

Fichier produit : src/modules/documents/config/dissemination.config.ts

Résumé

Configuration Joi centralisée pour toutes les bornes numériques du flux DIP (spec §5.5, §5.6). Validation stricte au démarrage avec rejet fail-fast — aucun clamping silencieux.

Conformité code contract

Invariants respectés

Invariant Mécanisme
Toutes les bornes numériques sont configurables via env vars avec defaults contractuels 8 env vars avec defaults : DIP_MIN_COPIES=2, DIP_MAX_PACKAGE_SIZE=100, DIP_MOTIF_MAX_LENGTH=1024, SLA_TARGET_SEALED_TO_DIP_MS=2000, SLA_TARGET_DIP_TO_SEALED_MS=1500, SLA_HARD_TIMEOUT_MS=5000, DIP_RATE_LIMIT_PER_MIN=60, DIP_QUOTA_PER_DAY=1000
Validation Joi avec min/max stricts — rejet startup si hors bornes (pas de clamping) Joi.number().integer().min(X).max(Y) sur chaque paramètre, throw error si validation échoue

Forbidden respectés

Interdit Preuve de conformité
Valeurs magiques en dur dans le code Toutes les bornes sont dans le schéma Joi avec default(), aucune constante numérique en dur hors du schéma
Clamping silencieux de valeurs hors bornes Joi .min()/.max() rejette strictement ; throw error dans validateDisseminationConfig()

Interface exportée : DisseminationConfig

export interface DisseminationConfig {
  minCopies: number;           // [2, 10], default 2
  maxPackageSize: number;      // [1, 100], default 100
  motifMaxLength: number;      // [0, 1024], default 1024
  slaTargetSealedToDipMs: number; // [200, 5000], default 2000
  slaTargetDipToSealedMs: number; // [200, 5000], default 1500
  slaHardTimeoutMs: number;    // [1000, 30000], default 5000
  rateLimitPerMinute: number;  // [1, 1000], default 60
  quotaPerDay: number;         // [1, 100000], default 1000
}

Variables d'environnement

Variable Default Min Max Unité Référence spec
DIP_MIN_COPIES 2 2 10 copies §5.6
DIP_MAX_PACKAGE_SIZE 100 1 100 éléments §5.6
DIP_MOTIF_MAX_LENGTH 1024 0 1024 caractères UTF-8 §5.6
SLA_TARGET_SEALED_TO_DIP_MS 2000 200 5000 ms §5.5
SLA_TARGET_DIP_TO_SEALED_MS 1500 200 5000 ms §5.5
SLA_HARD_TIMEOUT_MS 5000 1000 30000 ms §5.5
DIP_RATE_LIMIT_PER_MIN 60 1 1000 req/min §5.6
DIP_QUOTA_PER_DAY 1000 1 100000 req/jour §5.6

Décisions architecturales

DA-01 : Pattern destruction.config.ts avec Number.parseInt(value, 10)

  • Decision : Réutilisation du pattern destruction.config.ts (Map + Number.parseInt base 10 + Object.defineProperty)
  • Rationale : Pattern établi et éprouvé dans le projet (PD-250, PD-279). Number.parseInt(v, 10) est plus robuste que Number(v) pour les entrées non numériques (ignore les suffixes).
  • Alternatives considered : Pattern restitution.config.ts (plus simple, Number() direct), Injectable class pattern (integrity.config.ts)
  • Trade-offs : Plus verbose que le pattern restitution mais plus robuste pour le parsing, et cohérent avec le fichier voisin destruction.config.ts qui a plus de paramètres similaires.

DA-02 : allowUnknown: true dans les options Joi

  • Decision : Utiliser allowUnknown: true (comme restitution.config.ts) plutôt que allowUnknown: false (comme destruction.config.ts)
  • Rationale : La config de dissemination est chargée dans un process.env contenant toutes les variables de l'application. allowUnknown: false rejetterait les variables d'autres modules (DATABASE_URL, REDIS_HOST, etc.) si passées directement. Le pattern restitution.config.ts utilise allowUnknown: true pour cette raison.
  • Alternatives considered : allowUnknown: false avec extraction préalable des clés connues
  • Trade-offs : allowUnknown: true ne valide pas la présence de variables inattendues, mais c'est acceptable car seules les clés DIP_* et SLA_* sont extraites.

Exports

Export Type Usage
DisseminationConfig Interface Typage de la configuration dans les consumers (C8, C9)
disseminationConfigSchema Joi.ObjectSchema Testable unitairement
validateDisseminationConfig() Function Testable unitairement (injection env custom)
default (registerAs) ConfigFactory NestJS ConfigModule.forFeature()

Hypothèses

Aucune hypothèse supplémentaire. Toutes les bornes sont directement tirées de la spec §5.5 et §5.6.

Fichiers hors périmètre identifiés

Aucun fichier hors périmètre n'a nécessité de modification.

Matrice de couverture (tests suggérés)

Test ID Fichier de test suggéré Description
TC-CONFIG-01 dissemination.config.spec.ts Defaults appliqués quand aucune env var fournie
TC-CONFIG-02 dissemination.config.spec.ts Valeurs custom dans les bornes acceptées
TC-CONFIG-03 dissemination.config.spec.ts Valeur sous min → Joi.ValidationError
TC-CONFIG-04 dissemination.config.spec.ts Valeur au-dessus max → Joi.ValidationError
TC-CONFIG-05 dissemination.config.spec.ts Valeur non numérique → Joi.ValidationError
TC-CONFIG-06 dissemination.config.spec.ts Valeur flottante rejetée (integer strict)
TC-CONFIG-07 dissemination.config.spec.ts abortEarly=false : toutes les erreurs collectées