Aller au contenu

ADR 0045 – Connexion de publication des packs

Statut : Décidée. Date : 04/10/2026. Prolonge l’ADR 0044 et reprend le principe de l’ADR 0015 (rôle distinct pour les tâches de fond).

Un pack publié est figé et partagé par toutes les organisations. Jusqu’ici, il se publiait par la ligne de commande (packs:publier) avec le rôle des migrations ; l’API (biotrace_app, soumis à la RLS) n’a aucun droit d’écriture sur les tables de packs, volontairement. Le cockpit doit permettre à l’équipe de l’éditeur de publier sans accès à la base.

L’API ouvre une seconde connexion, lue dans PUBLICATION_DATABASE_URL, utilisée par le seul service PublicationPacksService et seulement pour écrire. Sans cette variable, le cockpit contrôle les packs mais la publication répond 503 publication_indisponible. Elle n’a jamais de valeur par défaut, et ne retombe jamais sur la connexion de l’API.

  • Une seule règle, deux entrées : le cockpit appelle les fonctions de apps/api/src/packs/publication.ts, comme la ligne de commande. Le contrôle à blanc (controlerPack) fait les mêmes vérifications sans écrire, avec la connexion de lecture de l’API.
  • Rôles : lire et contrôler, tout rôle de l’éditeur ; publier, editeur_parametrage ou editeur_admin (EC-099 : packs, catalogues, publication). Pas d’étape de revue : EC-099 écarte toute séparation des tâches dans l’équipe.
  • Traçabilité : app.pack_version.publie_par garde le sujet Keycloak de l’auteur.
  • En production, un rôle PostgreSQL dédié suffit : SELECT sur le catalogue global (facteurs, unités, activités, modules, dictionnaire de variables, packs) et INSERT sur pack, pack_version, facteur_valeur, regle_decision, point_controle et referentiel (plus UPDATE sur referentiel, pour le rattachement au pack). En développement, c’est le rôle des migrations, comme la ligne de commande.
  • Donner à biotrace_app le droit d’écrire les packs : toute faille de l’API client permettrait d’altérer le contenu partagé par tous les clients.
  • Un second service pour la publication : double déploiement et double contrat sans besoin avéré (même raisonnement que l’ADR 0044).

Une variable d’environnement et un rôle à provisionner par l’infrastructure. Aucune dépendance nouvelle. La ligne de commande reste valable pour le pipeline.

Le service ne connaît que deux fonctions (controlerPack, publierPack) et une connexion injectée. Rendre la publication au pipeline seul revient à retirer les deux routes /v1/editeur/packs.