Cycle de vie du contenu

Sur cette page

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épartRésultatEffet sur la révisionpublishedAtscheduledAtAppel répété
Enregistrer les modificationsToute entrée activeLe statut ne change pasSur une collection avec révisions, remplace la révision brouillon tandis que la révision en direct reste publiqueAucun changementAucun changementUn _rev fourni refuse un enregistrement obsolète ; l’omettre rend l’écriture REST inconditionnelle
PublierBrouillon, planifiée ou publiéePubliéePromeut la révision brouillon en en direct et efface le pointeur brouillonDéfini à la première publication ; conservé aux publications suivantes sauf si un appelant autorisé le remplaceEffacéConserve le contenu en direct et l’heure de publication, mais renvoie un nouveau _rev
Publier à échéancePlanifiée, ou publiée avec un brouillon planifiéPubliéeIdentique à publierUtilise l’heure planifiée à la première publication ; conserve la valeur existante lors de la publication d’un nouveau brouillon sur le contenu en directEffacéUn passage ultérieur du planificateur ignore une entrée dont la planification a déjà été effacée
DépublierToute entrée activeBrouillonEfface le pointeur en direct ; conserve le brouillon existant ou en crée un à partir de la révision en directConservéEffacéUne entrée qui est déjà un simple brouillon ne change pas
PlanifierBrouillon, planifiée ou publiéeUn brouillon devient planifié ; une entrée publiée reste publiéeAucun changementAucun changementDéfini à l’heure future demandéeRemplace la planification existante et renvoie un nouveau _rev
DéplanifierPlanifiée, ou publiée avec une planificationUne entrée planifiée devient brouillon ; une entrée publiée reste publiéeAucun changementAucun changementEffacéUne entrée sans planification ne change pas
Abandonner le brouillonToute entrée activeLe statut ne change pasEfface le pointeur brouillon ; la révision en direct reste inchangéeAucun changementAucun changementUne entrée sans brouillon ne change pas
Déplacer vers la corbeilleToute entrée activeÀ la corbeille et absente des lectures ordinairesConservéConservéConservéUne requête pour une entrée déjà à la corbeille renvoie introuvable
Restaurer depuis la corbeilleÀ la corbeilleBrouillonEfface le pointeur en direct ; conserve tout pointeur brouillonConservéEffacéExige une entrée encore à la corbeille
Supprimer définitivementÀ la corbeilleSuppriméeSupprime l’entrée et ses révisionsSuppriméSuppriméNe peut pas être répété ni annulé
Restaurer une révisionToute entrée activeLe statut ne change pasSur 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éeAucun changementAucun changementCré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.

ActionPermissionREST _revMCP _revVerrou admin et RESTHooks
Enregistrer les modificationscontent:edit_own ou content:edit_anyOptionnelObligatoireAppliquécontent:beforeSave, content:afterSave
Publiercontent:publish_own ou content:publish_anyOptionnelObligatoireAppliquécontent:beforePublish, content:afterPublish
Dépubliercontent:publish_own ou content:publish_anyOptionnelObligatoireAppliquécontent:beforeUnpublish, content:afterUnpublish
Planifiercontent:publish_own ou content:publish_anyOptionnelObligatoireAppliquécontent:beforeSchedule, content:afterSchedule
Déplanifiercontent:publish_own ou content:publish_anyNon acceptéNon acceptéAppliquécontent:afterUnschedule
Abandonner le brouilloncontent:edit_own ou content:edit_anyOptionnelObligatoireAppliquéAucun
Déplacer vers la corbeillecontent:delete_own ou content:delete_anyNon acceptéNon acceptéAppliquécontent:beforeDelete, content:afterDelete
Restaurer depuis la corbeillecontent:edit_own ou content:edit_anyNon acceptéNon acceptéNon appliquécontent:afterRestore
Supprimer définitivementcontent:delete_permanentNon acceptéNon acceptéNon appliquécontent:afterDelete
Restaurer une révisioncontent:edit_own ou content:edit_anyNon 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.