POST and PUT /_journal/api/v1/posts saved the row, then the categories, tags
and translations, and fired RecordSaved only when all succeeded. A failure
part-way left a committed row (possibly a new slug) with no event, so
subscribers such as an SEO plugin never created the redirect. The write now
runs in one lagoon transaction with the event emitted inside it.
- POST/PUT/DELETE /_journal/api/v1/posts fire RecordSaved/RecordDeleted
through cabana.EmitRecordSaved/EmitRecordDeleted, so a slug changed over
MCP reaches subscribers like an admin save
- PUT reports the changed columns and each submitted translation that
changed, read before the write (a translated slug per locale)
- TestAPIRecordEvents covers POST, PUT slug change and DELETE