Ciclo de vida del contenido

En esta página

EmDash mantiene la versión publicada de una entrada separada de los cambios no publicados. El panel de administración, la API REST, la interfaz de línea de comandos (CLI) y las herramientas del Model Context Protocol (MCP) usan las mismas reglas de ciclo de vida.

Una entrada puede estar en draft, scheduled o published. Una entrada publicada también puede tener un borrador y una programación futura: los visitantes siguen recibiendo la revisión en vivo hasta que se publique el borrador programado. La papelera es independiente del estado. Una entrada en la papelera conserva sus metadatos de ciclo de vida pero se excluye de las lecturas ordinarias de contenido.

Transiciones de estado

La tabla siguiente es el contrato canónico para el estado del contenido, los punteros de revisión y las marcas de tiempo de publicación. «Sin cambio» significa que la operación conserva el valor almacenado.

AcciónEstado inicialResultadoEfecto en la revisiónpublishedAtscheduledAtLlamada repetida
Guardar cambiosCualquier entrada activaEl estado no cambiaEn una colección con revisiones, sustituye la revisión de borrador mientras la revisión en vivo sigue públicaSin cambioSin cambioUn _rev suministrado rechaza un guardado obsoleto; omitirlo hace que la escritura REST sea incondicional
PublicarBorrador, programada o publicadaPublicadaPromueve la revisión de borrador a en vivo y borra el puntero de borradorSe establece en la primera publicación; se conserva en publicaciones posteriores salvo que un llamador autorizado lo sobrescribaBorradoConserva el contenido en vivo y la hora de publicación, pero devuelve un _rev nuevo
Publicar cuando toqueProgramada, o publicada con un borrador programadoPublicadaIgual que publicarUsa la hora programada en la primera publicación; conserva el valor existente al publicar un borrador nuevo sobre el contenido en vivoBorradoUn paso posterior del programador omite una entrada cuya programación ya se borró
DespublicarCualquier entrada activaBorradorBorra el puntero en vivo; conserva el borrador existente o crea uno a partir de la revisión en vivoConservadoBorradoUna entrada que ya es un borrador simple no cambia
ProgramarBorrador, programada o publicadaUn borrador pasa a programada; una entrada publicada sigue publicadaSin cambioSin cambioSe establece en la hora futura solicitadaSustituye la programación existente y devuelve un _rev nuevo
DesprogramarProgramada, o publicada con una programaciónUna entrada programada pasa a borrador; una entrada publicada sigue publicadaSin cambioSin cambioBorradoUna entrada sin programación no cambia
Descartar borradorCualquier entrada activaEl estado no cambiaBorra el puntero de borrador; la revisión en vivo no cambiaSin cambioSin cambioUna entrada sin borrador no cambia
Mover a la papeleraCualquier entrada activaEn la papelera y ausente de las lecturas ordinariasConservadoConservadoConservadoUna solicitud de una entrada que ya está en la papelera devuelve no encontrado
Restaurar desde la papeleraEn la papeleraBorradorBorra el puntero en vivo; conserva cualquier puntero de borradorConservadoBorradoRequiere una entrada que siga en la papelera
Eliminar permanentementeEn la papeleraEliminadaElimina la entrada y sus revisionesEliminadoEliminadoNo se puede repetir ni deshacer
Restaurar una revisiónCualquier entrada activaEl estado no cambiaEn una colección con revisiones, sustituye el borrador por una copia de la revisión seleccionada; la revisión en vivo no cambiaSin cambioSin cambioCrea una revisión nueva y devuelve un _rev nuevo

En una colección sin soporte de revisiones, guardar y publicar usan la fila de contenido en lugar de punteros en vivo y de borrador. Restaurar una revisión escribe los valores de campo seleccionados directamente en esa fila.

Restaurar una revisión en una colección con revisiones no la publica. Publica la entrada después de revisar el borrador restaurado.

Permisos y protección de escritura

Los permisos dependen de la propiedad. Un Author puede actuar sobre una entrada que posee; un Editor puede realizar la misma acción sobre cualquier entrada. La eliminación permanente requiere un Admin.

Establecer publishedAt durante la publicación requiere content:publish_any, incluso cuando el llamador posee la entrada.

La API REST acepta _rev como una precondición opcional de concurrencia optimista donde se indica. Las herramientas MCP lo exigen para las mismas operaciones, de modo que un agente debe leer la entrada antes de cambiarla. Un token obsoleto devuelve CONFLICT. Las escrituras de administración y REST protegidas por un bloqueo de entrada devuelven ENTRY_LOCKED salvo que una solicitud autorizada use la anulación de bloqueo admitida. Las escrituras MCP no participan en los bloqueos de entrada.

AcciónPermisoREST _revMCP _revBloqueo de admin y RESTHooks
Guardar cambioscontent:edit_own o content:edit_anyOpcionalObligatorioAplicadocontent:beforeSave, content:afterSave
Publicarcontent:publish_own o content:publish_anyOpcionalObligatorioAplicadocontent:beforePublish, content:afterPublish
Despublicarcontent:publish_own o content:publish_anyOpcionalObligatorioAplicadocontent:beforeUnpublish, content:afterUnpublish
Programarcontent:publish_own o content:publish_anyOpcionalObligatorioAplicadocontent:beforeSchedule, content:afterSchedule
Desprogramarcontent:publish_own o content:publish_anyNo aceptadoNo aceptadoAplicadocontent:afterUnschedule
Descartar borradorcontent:edit_own o content:edit_anyOpcionalObligatorioAplicadoNinguno
Mover a la papeleracontent:delete_own o content:delete_anyNo aceptadoNo aceptadoAplicadocontent:beforeDelete, content:afterDelete
Restaurar desde la papeleracontent:edit_own o content:edit_anyNo aceptadoNo aceptadoNo aplicadocontent:afterRestore
Eliminar permanentementecontent:delete_permanentNo aceptadoNo aceptadoNo aplicadocontent:afterDelete
Restaurar una revisióncontent:edit_own o content:edit_anyNo aceptadoNo aceptadoNo aplicadoNinguno

El evento content:afterDelete establece permanent en false cuando una entrada se mueve a la papelera y en true tras la eliminación permanente. Los after-hooks correctos se ejecutan después del cambio de estado y pueden ejecutarse después de que se haya enviado la respuesta. Un plugin puede rechazar guardar, publicar, despublicar, programar o mover a la papelera desde el before-hook correspondiente.

Cuando la publicación programada llega a su hora, usa los hooks de publicación. Si un hook content:beforePublish rechaza ese intento programado, EmDash borra la programación y ejecuta content:afterUnschedule.

Conflictos y reintentos

Usa el _rev devuelto por cada lectura o escritura para la siguiente operación protegida. EmDash rechaza un token desactualizado en lugar de sustituir un cambio concurrente. Vuelve a leer la entrada, revisa el estado más reciente y decide entonces si reintentar.

Una respuesta de error no siempre demuestra que no cambió ningún estado. Si una conexión termina antes de que el cliente reciba una respuesta, lee la entrada antes de reintentar una operación de ciclo de vida. Esto también evita que un reintento sustituya el trabajo completado por otro editor.

La restauración de una revisión confirma el contenido restaurado y su revisión de auditoría juntos. Si cualquiera de las escrituras falla, EmDash conserva el contenido y el historial de revisiones de antes de la solicitud.

Consulta la referencia de la API REST para los esquemas de solicitud y respuesta HTTP, la referencia del servidor MCP para las entradas de las herramientas y la referencia de hooks para las cargas útiles de los eventos.