UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

88 lines (81 loc) 3.46 kB
import {type TransactionLogEventWithEffects} from '@sanity/types' import {applyMendozaPatch} from '../../../../preview/utils/applyMendozaPatch' import {type ReleaseDocument, type ReleaseType} from '../../../store/types' import {getReleaseIdFromReleaseDocumentId} from '../../../util/getReleaseIdFromReleaseDocumentId' import {type ReleaseEvent} from './types' export function buildReleaseEditEvents( transactions: TransactionLogEventWithEffects[], release: ReleaseDocument, ): ReleaseEvent[] { // Confirm we have all the events by checking the first transaction id and the release._rev, the should match. if (release._rev !== transactions[0]?.id) { console.error('Some transactions are missing, cannot calculate the edit events') return [] } const releaseEditEvents: ReleaseEvent[] = [] // We start from the last release document and apply changes in reverse order // Compare for each transaction what changed, if metadata.releaseType or metadata.intendedPublishAt changed build an event. let currentDocument = release for (const transaction of transactions) { const effect = transaction.effects[release._id] if (!effect) continue // This will apply the revert effect to the document, so we will get the document from before this change. const before = applyMendozaPatch(currentDocument, effect.revert, currentDocument._rev) const changed: { releaseType?: ReleaseType intendedPublishDate?: string } = {} if (before?.state !== currentDocument.state && currentDocument.state === 'archived') { releaseEditEvents.push({ type: 'archiveRelease', timestamp: transaction.timestamp, author: transaction.author, releaseName: getReleaseIdFromReleaseDocumentId(release._id), id: transaction.id, origin: 'translog', }) } if (before?.state !== currentDocument.state && currentDocument.state === 'published') { releaseEditEvents.push({ type: 'publishRelease', timestamp: transaction.timestamp, author: transaction.author, releaseName: getReleaseIdFromReleaseDocumentId(release._id), id: transaction.id, origin: 'translog', }) } if (before?.state === 'unarchiving' && currentDocument.state === 'active') { releaseEditEvents.push({ type: 'unarchiveRelease', timestamp: transaction.timestamp, author: transaction.author, releaseName: getReleaseIdFromReleaseDocumentId(release._id), id: transaction.id, origin: 'translog', }) } if (before?.metadata.releaseType !== currentDocument.metadata.releaseType) { changed.releaseType = currentDocument.metadata.releaseType } if (before?.metadata.intendedPublishAt !== currentDocument.metadata.intendedPublishAt) { changed.intendedPublishDate = currentDocument.metadata.intendedPublishAt } // If the "changed" object has more than one key identify it as a change event if (Object.values(changed).length >= 1) { releaseEditEvents.push({ type: before ? 'editRelease' : 'createRelease', origin: 'translog', author: transaction.author, change: changed, id: transaction.id, timestamp: transaction.timestamp, releaseName: getReleaseIdFromReleaseDocumentId(release._id), }) } if (before) { currentDocument = before } } return releaseEditEvents }