EmDash conserve la version publiée d’une entrée séparée des modifications non publiées. Le panneau d’administration, l’API REST, l’interface en ligne de commande (CLI) et les outils Model Context Protocol (MCP) utilisent les mêmes règles de cycle de vie.
Une entrée peut être draft, scheduled ou published. Une entrée publiée peut aussi avoir un brouillon et une
planification future : les visiteurs continuent de recevoir la révision en direct jusqu’à ce que le brouillon planifié
soit publié. La corbeille est distincte du statut. Une entrée mise à la corbeille conserve ses métadonnées de cycle de vie mais est
exclue des lectures de contenu ordinaires.
Transitions d’état
Le tableau suivant est le contrat canonique pour l’état du contenu, les pointeurs de révision et les horodatages de publication. « Aucun changement » signifie que l’opération conserve la valeur stockée.
| Action | État de départ | Résultat | Effet sur la révision | publishedAt | scheduledAt | Appel répété |
|---|---|---|---|---|---|---|
| Enregistrer les modifications | Toute entrée active | Le statut ne change pas | Sur une collection avec révisions, remplace la révision brouillon tandis que la révision en direct reste publique | Aucun changement | Aucun changement | Un _rev fourni refuse un enregistrement obsolète ; l’omettre rend l’écriture REST inconditionnelle |
| Publier | Brouillon, planifiée ou publiée | Publiée | Promeut la révision brouillon en en direct et efface le pointeur brouillon | Défini à la première publication ; conservé aux publications suivantes sauf si un appelant autorisé le remplace | Effacé | Conserve le contenu en direct et l’heure de publication, mais renvoie un nouveau _rev |
| Publier à échéance | Planifiée, ou publiée avec un brouillon planifié | Publiée | Identique à publier | Utilise l’heure planifiée à la première publication ; conserve la valeur existante lors de la publication d’un nouveau brouillon sur le contenu en direct | Effacé | Un passage ultérieur du planificateur ignore une entrée dont la planification a déjà été effacée |
| Dépublier | Toute entrée active | Brouillon | Efface le pointeur en direct ; conserve le brouillon existant ou en crée un à partir de la révision en direct | Conservé | Effacé | Une entrée qui est déjà un simple brouillon ne change pas |
| Planifier | Brouillon, planifiée ou publiée | Un brouillon devient planifié ; une entrée publiée reste publiée | Aucun changement | Aucun changement | Défini à l’heure future demandée | Remplace la planification existante et renvoie un nouveau _rev |
| Déplanifier | Planifiée, ou publiée avec une planification | Une entrée planifiée devient brouillon ; une entrée publiée reste publiée | Aucun changement | Aucun changement | Effacé | Une entrée sans planification ne change pas |
| Abandonner le brouillon | Toute entrée active | Le statut ne change pas | Efface le pointeur brouillon ; la révision en direct reste inchangée | Aucun changement | Aucun changement | Une entrée sans brouillon ne change pas |
| Déplacer vers la corbeille | Toute entrée active | À la corbeille et absente des lectures ordinaires | Conservé | Conservé | Conservé | Une requête pour une entrée déjà à la corbeille renvoie introuvable |
| Restaurer depuis la corbeille | À la corbeille | Brouillon | Efface le pointeur en direct ; conserve tout pointeur brouillon | Conservé | Effacé | Exige une entrée encore à la corbeille |
| Supprimer définitivement | À la corbeille | Supprimée | Supprime l’entrée et ses révisions | Supprimé | Supprimé | Ne peut pas être répété ni annulé |
| Restaurer une révision | Toute entrée active | Le statut ne change pas | Sur une collection avec révisions, remplace le brouillon par une copie de la révision sélectionnée ; la révision en direct reste inchangée | Aucun changement | Aucun changement | Crée une nouvelle révision et renvoie un nouveau _rev |
Sur une collection sans prise en charge des révisions, les enregistrements et publications utilisent la ligne de contenu au lieu des pointeurs en direct et brouillon. Restaurer une révision écrit les valeurs de champ sélectionnées directement dans cette ligne.
Restaurer une révision sur une collection avec révisions ne la publie pas. Publiez l’entrée après avoir examiné le brouillon restauré.
Permissions et protection en écriture
Les permissions dépendent de la propriété. Un Author peut agir sur une entrée qu’il possède ; un Editor peut effectuer la même action sur n’importe quelle entrée. La suppression définitive nécessite un Admin.
Définir publishedAt lors de la publication nécessite content:publish_any, même lorsque l’appelant possède
l’entrée.
L’API REST accepte _rev comme précondition optionnelle de concurrence optimiste là où c’est indiqué. Les outils MCP
l’exigent pour les mêmes opérations, de sorte qu’un agent doit lire l’entrée avant de la modifier. Un jeton obsolète
renvoie CONFLICT. Les écritures admin et REST protégées par un verrou d’entrée renvoient ENTRY_LOCKED sauf si une
requête autorisée utilise le contournement de verrou pris en charge. Les écritures MCP ne participent pas aux verrous d’entrée.
| Action | Permission | REST _rev | MCP _rev | Verrou admin et REST | Hooks |
|---|---|---|---|---|---|
| Enregistrer les modifications | content:edit_own ou content:edit_any | Optionnel | Obligatoire | Appliqué | content:beforeSave, content:afterSave |
| Publier | content:publish_own ou content:publish_any | Optionnel | Obligatoire | Appliqué | content:beforePublish, content:afterPublish |
| Dépublier | content:publish_own ou content:publish_any | Optionnel | Obligatoire | Appliqué | content:beforeUnpublish, content:afterUnpublish |
| Planifier | content:publish_own ou content:publish_any | Optionnel | Obligatoire | Appliqué | content:beforeSchedule, content:afterSchedule |
| Déplanifier | content:publish_own ou content:publish_any | Non accepté | Non accepté | Appliqué | content:afterUnschedule |
| Abandonner le brouillon | content:edit_own ou content:edit_any | Optionnel | Obligatoire | Appliqué | Aucun |
| Déplacer vers la corbeille | content:delete_own ou content:delete_any | Non accepté | Non accepté | Appliqué | content:beforeDelete, content:afterDelete |
| Restaurer depuis la corbeille | content:edit_own ou content:edit_any | Non accepté | Non accepté | Non appliqué | content:afterRestore |
| Supprimer définitivement | content:delete_permanent | Non accepté | Non accepté | Non appliqué | content:afterDelete |
| Restaurer une révision | content:edit_own ou content:edit_any | Non accepté | Non accepté | Non appliqué | Aucun |
L’événement content:afterDelete définit permanent à false lorsqu’une entrée est déplacée vers la corbeille et à true
après une suppression définitive. Les after-hooks réussis s’exécutent après le changement d’état et peuvent s’exécuter après l’envoi
de la réponse. Un plugin peut refuser l’enregistrement, la publication, la dépublication, la planification ou le déplacement vers la corbeille depuis
le before-hook correspondant.
Lorsque la publication planifiée arrive à échéance, elle utilise les hooks de publication. Si un
hook content:beforePublish refuse cette tentative planifiée, EmDash efface la planification et exécute
content:afterUnschedule.
Conflits et nouvelles tentatives
Utilisez le _rev renvoyé par chaque lecture ou écriture pour la prochaine opération protégée. EmDash refuse un
jeton obsolète au lieu de remplacer une modification concurrente. Relisez l’entrée, examinez l’état
plus récent, puis décidez de réessayer ou non.
Une réponse d’erreur ne prouve pas toujours qu’aucun état n’a changé. Si une connexion se termine avant que le client ne reçoive une réponse, lisez l’entrée avant de réessayer une opération de cycle de vie. Cela empêche aussi qu’une nouvelle tentative remplace le travail achevé par un autre éditeur.
La restauration d’une révision valide le contenu restauré et sa révision d’audit ensemble. Si l’une des écritures échoue, EmDash conserve le contenu et l’historique des révisions d’avant la requête.
Voir la référence de l’API REST pour les schémas de requête et de réponse HTTP, la référence du serveur MCP pour les entrées des outils et la référence des hooks pour les charges utiles des événements.