Aller au contenu principal

ADR-013 — Workspace as a Private Administration Application

Statut

Accepted

Date

2026-07-19

Décideurs

Équipe Architecture DMV

Impact

DMV Workspace, Navigation Engine, API, Mobile, Platform Architecture

Contexte

Le Workspace a été développé dans la continuité technique du site public : Next.js App Router, Static Export, routes dynamiques par acteur (/acteur/{slug}/...), convention _ pour contourner les limites du Static Export, réécriture _redirects au niveau de Cloudflare Pages.

Ce mécanisme fonctionne mais répond à une hypothèse qui ne correspond pas au produit réel : que l'identité de l'espace de travail doive être portée par une URL publique, au même titre qu'une ressource du site public.

Le modèle produit DMV — deux surfaces distinctes

DMV expose un acteur de deux façons entièrement séparées.

Le mini-site public (dmv-public) est l'unique représentation publique d'un acteur. Il porte le SEO, les URLs publiques et partageables, les publications et événements publics, les favoris, et les notifications destinées aux citoyens.

Exemple : https://www.dansmonvillage.fr/bessan/acteur/coriane/

Le Workspace (dmv-workspace) sert uniquement à administrer ces ressources. Il n'est jamais une destination publique : aucune notification citoyenne, aucun favori, aucun lien partagé ne pointe vers le Workspace. Une notification concernant une publication ouvre toujours la publication publique — jamais son écran d'administration.

Cette séparation signifie que les contraintes qui justifient un slug public (lisibilité, stabilité, référencement, partage) ne s'appliquent structurellement pas au Workspace.

Modèle métier

Un acteur correspond à une entité juridique (SIRET). Une mairie est un acteur. Les services municipaux ne sont pas des acteurs distincts et ne possèdent pas de Workspace propre : toute publication rédigée par un agent reste publiée au nom de l'acteur mairie. L'organisation interne du Workspace ne modifie jamais l'identité publique portée par l'acteur.

Décision

Le Workspace est une application d'administration privée. Son adressage interne est découplé de l'identité publique de l'acteur.

Le contexte de travail actif (quel acteur, quelles permissions, quel rôle) est porté par un identifiant technique, pas par le slug public — transmis en paramètre de requête plutôt qu'en segment de route.

Exemple :

/publications?actor_id=42
/dashboard?actor_id=42

Cette forme est retenue plutôt qu'un segment de route opaque (/w/42/publications) parce qu'elle a une conséquence technique directe : /publications devient une route statique fixe, connue au build, sans segment dynamique. Elle élimine generateStaticParams(), la convention _, et tout besoin de réécriture externe (_redirects ou équivalent) — pas en le simplifiant, mais en supprimant la cause du problème.

Le contexte reste pleinement adressable : chaque onglet, chaque lien interne, chaque favori d'équipe transporte son propre actor_id dans son URL. Rien n'est stocké uniquement en session globale.

Les routes internes deviennent génériques et fixes : /dashboard, /publications, /statistiques, /profil, /services, /agenda, /parametres. Le changement d'espace actif change la valeur d'actor_id dans l'URL courante — jamais la route elle-même.

Les notifications citoyennes ciblent exclusivement le mini-site public, jamais le Workspace — voir « Le modèle produit DMV » ci-dessus.

Le Workspace peut néanmoins recevoir ses propres notifications internes (nouveau collaborateur, publication à modérer). Ces deep links suivent le même modèle : l'identifiant technique en paramètre, jamais un slug public.

Exemple : dmv://workspace/publications?actor_id=42

Multi-espaces

L'utilisateur sélectionne son espace actif parmi ceux auxquels il a accès. Ce choix se traduit par la valeur d'actor_id portée par l'URL courante, jamais par un état non adressable — ce qui garantit que deux onglets ouverts sur deux espaces différents restent indépendants et cohérents après rechargement.

Mobile

Ce modèle est identique sur Web, PWA et Native Shell Capacitor — l'identifiant technique transite de la même façon quelle que soit la plateforme.

Conséquences

  • Disparition des slugs publics et de la convention _ dans le Workspace.
  • Disparition de generateStaticParams() par acteur et de toute dépendance à _redirects — pas seulement déplacée, supprimée.
  • Simplification du Navigation Engine pour ce composant : plus de Platform Adapter dédié à une contrainte d'export statique.
  • Meilleure compatibilité native avec le multi-espaces et le multi-onglet.
  • Séparation explicite, documentée, entre identité publique (portée par le slug, sur dmv-public) et contexte privé d'administration (porté par un identifiant technique, sur dmv-workspace) — un principe désormais réutilisable pour toute future surface d'administration DMV (Coach, AssoSuite).

Migration

Cette ADR décrit l'architecture cible. La migration est progressive ; les versions intermédiaires peuvent continuer d'utiliser le mécanisme actuel tant qu'il n'empêche pas l'évolution du produit. Aucune rupture de compatibilité n'est recherchée sur le mini-site public, qui n'est pas concerné par cette décision.

Alternatives envisagées

AlternativeRaison de non-priorisation
Identifiant technique en segment de route (/w/{id}/publications)Reste une route dynamique Next.js : ne supprime pas la dépendance à generateStaticParams()/_redirects, seulement la sémantique du paramètre.
Conserver le slug public comme identifiant du WorkspaceConfond identité publique et contexte privé d'administration ; lie l'adressage interne du Workspace à un identifiant qui peut changer côté public.
Contexte stocké uniquement en session globale, sans identifiant dans l'URLCasse le multi-onglet et la restauration de contexte au rechargement.

Risques

Le principal risque est qu'un futur développement réintroduise un slug public dans une route du Workspace par réflexe de cohérence avec dmv-public. La séparation entre identité publique et contexte privé doit rester explicite dans la documentation d'architecture, pas seulement dans cette ADR.

Principe fondateur

Les URLs publiques identifient des ressources destinées à être découvertes, partagées et référencées.

Le Workspace n'identifie pas un acteur par une URL publique, mais par un identifiant technique de contexte, propre à une session d'administration privée.

Liens associés

  • docs/decisions/ADR-000-dmv-core-modular-applications.md
  • docs/06-architecture/26-platform-architecture.md
  • docs/06-architecture/27-architecture-governance.md
  • docs/12-apps/dmv/mobile/16-navigation-engine.md
  • docs/06-architecture/wall-engine/02-context-engine.md
  • docs/decisions/ADR-012-architecture-foundation-frozen.md