Comment ça publie
Publier transforme un post brouillon en fichier HTML statique uploadé sur votre site Flexweg. Tout le pipeline tourne dans le navigateur de l'admin qui clique sur Publier — pas de serveur, pas de
Publier transforme un post brouillon en fichier HTML statique uploadé sur votre site Flexweg. Tout le pipeline tourne dans le navigateur de l'admin qui clique sur Publier — pas de serveur, pas de worker de build, pas d'edge function.
Vue d'ensemble
┌─────────────────────────────────────────────────────────────────┐
│ L'admin clique sur Publier │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Construire PublishContext │
│ • Charger tous les posts, pages, termes, médias du backend │
│ • Appliquer les patches pour le post en cours de publication │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Résoudre l'URL du post │
│ • core/slug.ts.buildPostUrl(post, terms, settings) │
│ • Détecter collisions ; bail si oui │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Rendre le HTML │
│ • core/markdown.ts → marked + DOMPurify │
│ • Filtres `post.markdown.before`, `post.html.body` │
│ • Wrap dans le BaseLayout du thème + SingleTemplate │
│ • renderToStaticMarkup côté navigateur │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Hash + compare │
│ • sha256 du HTML │
│ • Si === Post.lastPublishedHash → skip upload │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Cleanup des chemins stales │
│ • Si Post.lastPublishedPath !== nouveau chemin, supprimer ancien│
│ • Retenter les `previousPublishedPaths` non encore supprimés │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Upload le HTML │
│ • POST /files/upload (API Files Flexweg) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Renders additionnels (plugin hooks) │
│ • Filtre `publish.additional` → variantes par langue, etc. │
│ • Upload chaque variante, tracking via lastPublishedPathsByLocale│
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Marquer le post en ligne │
│ • Patcher Post.lastPublishedPath, lastPublishedHash, status │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Cascade : re-rendre les listings │
│ • Home, archives de catégorie │
│ • Filtre `publish.extraListings` → homes localisées │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Actions de post-publish (plugins) │
│ • publish.complete → sitemaps, RSS, archives, search, … │
└─────────────────────────────────────────────────────────────────┘
Pourquoi côté navigateur
Pas de serveur de build, pas d'edge function. Les avantages :
- Aucune infra à maintenir côté hébergement public
- Cycle de feedback instantané — l'éditeur voit le rendu réel pendant qu'il édite
- Plus simple à débugger — tout est en JavaScript dans le navigateur, vous avez accès aux dev tools
Le coût : la publication consomme du temps CPU navigateur. Pour un post simple, ~200 ms. Pour Regenerate everything sur un site avec 1000 posts, ~30 s (en parallèle limité par le throttling de 75 ms entre uploads).
Stockage du résultat
Le pipeline ne crée pas de fichiers de cache intermédiaires côté navigateur — tout est en mémoire le temps de l'opération, puis uploadé sur Flexweg et oublié. Le seul état persisté est :
- En base :
Post.lastPublishedPath,Post.lastPublishedHash,Post.previousPublishedPaths[],Post.lastPublishedPathsByLocale - Sur Flexweg : le fichier HTML lui-même
Aucune table de cache, aucun journal d'opérations, aucune queue. Si vous fermez l'onglet à mi-publication, l'opération s'arrête net — il faut re-cliquer sur Publier pour finir le travail.
Que se passe-t-il en cas d'erreur
Le pipeline lève à la première erreur (échec de hash, échec d'upload, échec de cleanup). L'admin attrape l'erreur et :
- Affiche un toast avec le message
- Loggue dans la console
- Ne marque PAS le post comme En ligne si le HTML principal n'a pas pu être uploadé
Si le upload principal réussit mais une étape de cascade échoue (re-render d'archives, sitemap, RSS), le post est bien marqué En ligne et l'erreur est juste loggée — l'utilisateur peut cliquer sur Regenerate everything pour rattraper.