Clarification on creating drafts from a published document in Sanity.io.
7 replies
Last updated: Dec 14, 2023
B
A couple questions on creating drafts from 3rd party.
I have a app where I want to change the state of a published document to draft so that someone has to go in and publish from the studio.
If I use
Has anyone worked through something similar?
I have a app where I want to change the state of a published document to draft so that someone has to go in and publish from the studio.
If I use
createIfNotExistdoes that just create a new draft that is a new document unrelated to the published document I am trying to change to a draft state? As far as I am aware, I cannot
patchand published document into a draft state.
Has anyone worked through something similar?
Dec 14, 2023, 4:46 PM
A draft and a published document are actually two separate documents in your dataset. To unpublish something via the API, you need to create a draft version, which is done by creating a copy of the published document with the
_idprefixed with
drafts.) then delete the published document.
Dec 14, 2023, 6:50 PM
B
Perfect! It was a misunderstanding I had of what createIfNotExists does. Thanks!
Dec 14, 2023, 6:56 PM
B
I wonder if the documentation could have some more clarification around it? If I am understanding it correctly, something like this could be helpful:
Note: If you are wanting to change the state of a Published document to be "draft" then use thecreateIfNotExistsfunction and set the id like so: `id: `drafts.previousDocId`` . This will create a draft document and leave a published Document. When published from the studio, the draft doc will merge with the published document and resolve changes
Dec 14, 2023, 7:09 PM
Yes! Something like that would be helpful. I’ll pass this along to the docs team. Thank you!
Dec 14, 2023, 7:10 PM
B
Here is an example function I have written that would do that if it can also be helpful
import { merge } from 'lodash/fp' // not necessary just what I was using const { docId, ...additionalProperties } = formData const updateObject = { ...propertiesToUpdate } const [published, draft] = await client.getDocuments([ docId, `drafts.${docId}`, ]) if (draft) { const res = await client.patch(docId).set(updateObject).commit() } else { const draftDoc = merge( { ...published, _id: `drafts.${docId}`, _type: 'card' }, updateObject, ) const res = await client.createIfNotExists(draftDoc) }
Dec 14, 2023, 7:16 PM
B
Also, shoutout to
user P
for the help and thoughts last week. Finally got it working!Dec 14, 2023, 7:16 PM
Sanity– build remarkable experiences at scale
Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.