EmDash mantiene la versione pubblicata di una voce separata dalle modifiche non pubblicate. Il pannello di amministrazione, l’API REST, l’interfaccia a riga di comando (CLI) e gli strumenti Model Context Protocol (MCP) usano le stesse regole di ciclo di vita.
Una voce può essere draft, scheduled o published. Una voce pubblicata può anche avere una bozza e una
pianificazione futura: i visitatori continuano a ricevere la revisione live finché la bozza pianificata non viene
pubblicata. Il cestino è separato dallo stato. Una voce nel cestino conserva i suoi metadati di ciclo di vita ma è
esclusa dalle letture ordinarie dei contenuti.
Transizioni di stato
La tabella seguente è il contratto canonico per lo stato del contenuto, i puntatori di revisione e i timestamp di pubblicazione. «Nessuna modifica» significa che l’operazione conserva il valore memorizzato.
| Azione | Stato iniziale | Risultato | Effetto sulla revisione | publishedAt | scheduledAt | Chiamata ripetuta |
|---|---|---|---|---|---|---|
| Salva modifiche | Qualsiasi voce attiva | Lo stato non cambia | Su una collection con revisioni, sostituisce la revisione bozza mentre la revisione live resta pubblica | Nessuna modifica | Nessuna modifica | Un _rev fornito rifiuta un salvataggio obsoleto; ometterlo rende la scrittura REST incondizionata |
| Pubblica | Bozza, pianificata o pubblicata | Pubblicata | Promuove la revisione bozza a live e cancella il puntatore bozza | Impostato alla prima pubblicazione; preservato nelle pubblicazioni successive salvo che un chiamante autorizzato lo sovrascriva | Cancellato | Conserva il contenuto live e l’ora di pubblicazione, ma restituisce un nuovo _rev |
| Pubblica quando dovuto | Pianificata, o pubblicata con una bozza pianificata | Pubblicata | Come pubblica | Usa l’ora pianificata alla prima pubblicazione; conserva il valore esistente pubblicando una nuova bozza sul contenuto live | Cancellato | Un passaggio successivo dello scheduler salta una voce la cui pianificazione è già stata cancellata |
| Annulla pubblicazione | Qualsiasi voce attiva | Bozza | Cancella il puntatore live; conserva la bozza esistente o ne crea una dalla revisione live | Preservato | Cancellato | Una voce che è già una semplice bozza non cambia |
| Pianifica | Bozza, pianificata o pubblicata | Una bozza diventa pianificata; una voce pubblicata resta pubblicata | Nessuna modifica | Nessuna modifica | Impostato all’ora futura richiesta | Sostituisce la pianificazione esistente e restituisce un nuovo _rev |
| Annulla pianificazione | Pianificata, o pubblicata con una pianificazione | Una voce pianificata diventa bozza; una voce pubblicata resta pubblicata | Nessuna modifica | Nessuna modifica | Cancellato | Una voce senza pianificazione non cambia |
| Scarta bozza | Qualsiasi voce attiva | Lo stato non cambia | Cancella il puntatore bozza; la revisione live resta invariata | Nessuna modifica | Nessuna modifica | Una voce senza bozza non cambia |
| Sposta nel cestino | Qualsiasi voce attiva | Nel cestino e assente dalle letture ordinarie | Preservato | Preservato | Preservato | Una richiesta per una voce già nel cestino restituisce non trovato |
| Ripristina dal cestino | Nel cestino | Bozza | Cancella il puntatore live; conserva qualsiasi puntatore bozza | Preservato | Cancellato | Richiede una voce ancora nel cestino |
| Elimina definitivamente | Nel cestino | Rimossa | Rimuove la voce e le sue revisioni | Rimosso | Rimosso | Non può essere ripetuto né annullato |
| Ripristina una revisione | Qualsiasi voce attiva | Lo stato non cambia | Su una collection con revisioni, sostituisce la bozza con una copia della revisione selezionata; la revisione live resta invariata | Nessuna modifica | Nessuna modifica | Crea una nuova revisione e restituisce un nuovo _rev |
Su una collection senza supporto alle revisioni, salvataggi e pubblicazioni usano la riga di contenuto invece dei puntatori live e bozza. Ripristinare una revisione scrive i valori di campo selezionati direttamente in quella riga.
Ripristinare una revisione su una collection con revisioni non la pubblica. Pubblica la voce dopo aver esaminato la bozza ripristinata.
Autorizzazioni e protezione in scrittura
Le autorizzazioni dipendono dalla proprietà. Un Author può agire su una voce di cui è proprietario; un Editor può eseguire la stessa azione su qualsiasi voce. L’eliminazione definitiva richiede un Admin.
Impostare publishedAt durante la pubblicazione richiede content:publish_any, anche quando il chiamante possiede la
voce.
L’API REST accetta _rev come precondizione opzionale di concorrenza ottimistica dove indicato. Gli strumenti MCP
lo richiedono per le stesse operazioni, così un agente deve leggere la voce prima di modificarla. Un token obsoleto
restituisce CONFLICT. Le scritture admin e REST protette da un blocco voce restituiscono ENTRY_LOCKED salvo che una
richiesta autorizzata usi l’override di blocco supportato. Le scritture MCP non partecipano ai blocchi voce.
| Azione | Autorizzazione | REST _rev | MCP _rev | Blocco admin e REST | Hook |
|---|---|---|---|---|---|
| Salva modifiche | content:edit_own o content:edit_any | Facoltativo | Obbligatorio | Applicato | content:beforeSave, content:afterSave |
| Pubblica | content:publish_own o content:publish_any | Facoltativo | Obbligatorio | Applicato | content:beforePublish, content:afterPublish |
| Annulla pubblicazione | content:publish_own o content:publish_any | Facoltativo | Obbligatorio | Applicato | content:beforeUnpublish, content:afterUnpublish |
| Pianifica | content:publish_own o content:publish_any | Facoltativo | Obbligatorio | Applicato | content:beforeSchedule, content:afterSchedule |
| Annulla pianificazione | content:publish_own o content:publish_any | Non accettato | Non accettato | Applicato | content:afterUnschedule |
| Scarta bozza | content:edit_own o content:edit_any | Facoltativo | Obbligatorio | Applicato | Nessuno |
| Sposta nel cestino | content:delete_own o content:delete_any | Non accettato | Non accettato | Applicato | content:beforeDelete, content:afterDelete |
| Ripristina dal cestino | content:edit_own o content:edit_any | Non accettato | Non accettato | Non applicato | content:afterRestore |
| Elimina definitivamente | content:delete_permanent | Non accettato | Non accettato | Non applicato | content:afterDelete |
| Ripristina una revisione | content:edit_own o content:edit_any | Non accettato | Non accettato | Non applicato | Nessuno |
L’evento content:afterDelete imposta permanent a false quando una voce viene spostata nel cestino e a true
dopo l’eliminazione definitiva. Gli after-hook riusciti vengono eseguiti dopo il cambio di stato e possono essere eseguiti dopo l’invio
della risposta. Un plugin può rifiutare salvataggio, pubblicazione, annullamento pubblicazione, pianificazione o spostamento nel cestino dal
before-hook corrispondente.
Quando la pubblicazione pianificata raggiunge la scadenza, usa gli hook di pubblicazione. Se un
hook content:beforePublish rifiuta quel tentativo pianificato, EmDash cancella la pianificazione ed esegue
content:afterUnschedule.
Conflitti e nuovi tentativi
Usa il _rev restituito da ogni lettura o scrittura per la successiva operazione protetta. EmDash rifiuta un
token obsoleto invece di sostituire una modifica concorrente. Rileggi la voce, esamina lo stato
più recente e poi decidi se riprovare.
Una risposta di errore non dimostra sempre che nessuno stato sia cambiato. Se una connessione termina prima che il client riceva una risposta, leggi la voce prima di ripetere un’operazione di ciclo di vita. Questo evita anche che un nuovo tentativo sostituisca il lavoro completato da un altro editor.
Il ripristino di una revisione conferma insieme il contenuto ripristinato e la sua revisione di audit. Se una delle scritture fallisce, EmDash conserva il contenuto e la cronologia delle revisioni di prima della richiesta.
Vedi il riferimento API REST per gli schemi di richiesta e risposta HTTP, il riferimento del server MCP per gli input degli strumenti e il riferimento degli hook per i payload degli eventi.