Soft delete
Qué cambia
Sección titulada «Qué cambia»Con softDelete activado, un borrado marca una columna en lugar de eliminar la fila, y cada lectura filtra las filas marcadas. Nada más cambia en la operación: se requiere el mismo permiso, beforeDelete todavía puede vetarlo y afterDelete aún se ejecuta. Desde el punto de vista de quien realiza la llamada, la fila fue eliminada; cómo lo registra la tabla es asunto de este flag.
import { defineCollection } from "@rebasepro/cms-types";
const invoices = defineCollection({ slug: "invoices", name: "Invoices", table: "invoices", softDelete: true, properties: { reference: { name: "Reference", type: "string" }, deletedAt: { name: "Deleted at", type: "date", admin: { readOnly: true } } }});true utiliza deletedAt (columna deleted_at). La forma de objeto permite renombrarlo: softDelete: { field: "archivedAt" }.
Solo para Postgres, al igual que la búsqueda y los índices.
Qué ve una lectura
Sección titulada «Qué ve una lectura»Las filas marcadas se ocultan por defecto de find, findById, count, las agregaciones, el refetch en tiempo real y de esta colección cuando se carga a través de una relación. Ese comportamiento por defecto es el objetivo: el código escrito antes de que existiera este flag sigue funcionando y nadie tiene que acordarse de filtrar.
Dos parámetros de consulta permiten acceder a ellas:
| Parámetro | Qué devuelve |
|---|---|
?deleted=include |
Filas activas y marcadas |
?deleted=only |
Solo filas marcadas — la vista de papelera |
Cualquier otra cosa devuelve un 400 en lugar de un fallback silencioso. Que ?deleted=true ocultara silenciosamente cada fila eliminada daría la impresión de funcionar y respondería a la pregunta opuesta.
Restaurar y eliminar de verdad
Sección titulada «Restaurar y eliminar de verdad»Una restauración es una actualización ordinaria que vuelve a establecer el campo en null. No hay un verbo especial, porque no hay un estado especial: la fila nunca se fue a ningún lado.
Un DELETE real es ?hard=true en la llamada de eliminación. Requiere exactamente el mismo permiso que un borrado ordinario: es el mismo verbo, y restringirlo por separado supondría una segunda superficie de control de acceso para una sola operación. Lo que cambia es si la fila puede recuperarse o no. Solo el valor literal true o 1 significa que sí; un error tipográfico devuelve un 400, porque quien realiza la llamada solicitó purgar y, si obtuviera un soft delete, creería que los datos han desaparecido.
Siguientes pasos
Sección titulada «Siguientes pasos»- Definición de colecciones — dónde se declara
softDelete - API REST — los endpoints de eliminación y consulta a los que pertenecen estos parámetros
- Reglas de seguridad (RLS) — quién puede eliminar una fila en primer lugar