Skip to content

Commit

Permalink
fix(core): use full document in getReleaseEditEvents, store doc is pa…
Browse files Browse the repository at this point in the history
…rtial
  • Loading branch information
pedrobonamin committed Feb 14, 2025
1 parent f5316ae commit a89b91d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -137,26 +137,18 @@ describe('getReleaseEditEvents()', () => {
})
it('should not get the events if release is undefined', () => {
testScheduler.run(({expectObservable, hot}) => {
const releasesState$ = hot('a', {a: MOCKED_RELEASES_STATE})
const observeDocument$ = hot('a', {a: undefined})

const editEvents$ = getReleaseEditEvents({
client: mockClient,
releaseId: 'not-existing-release',
releasesState$,
})
const editEvents$ = getReleaseEditEvents({client: mockClient, observeDocument$})

expectObservable(editEvents$).toBe('(a)', {a: INITIAL_VALUE})
})
})
it('should get and build the release edit events', () => {
testScheduler.run(({expectObservable, cold, hot}) => {
const releasesState$ = hot('a', {a: MOCKED_RELEASES_STATE})
const observeDocument$ = hot('a', {a: MOCKED_RELEASE})

const editEvents$ = getReleaseEditEvents({
client: mockClient,
releaseId: MOCKED_RELEASE._id,
releasesState$,
})
const editEvents$ = getReleaseEditEvents({client: mockClient, observeDocument$})
const mockResponse$ = cold('-a|', {a: MOCKED_TRANSACTION_LOGS})
mockGetTransactionsLogs.mockReturnValueOnce(mockResponse$)
expectObservable(editEvents$).toBe('a-b', {
Expand All @@ -172,13 +164,9 @@ describe('getReleaseEditEvents()', () => {
})
it('should expand the release edit events transactions if received max', () => {
testScheduler.run(({expectObservable, cold, hot}) => {
const releasesState$ = hot('a', {a: MOCKED_RELEASES_STATE})
const observeDocument$ = hot('a', {a: MOCKED_RELEASE})

const editEvents$ = getReleaseEditEvents({
client: mockClient,
releaseId: MOCKED_RELEASE._id,
releasesState$,
})
const editEvents$ = getReleaseEditEvents({client: mockClient, observeDocument$})
const mockFirstResponse$ = cold('-a|', {
a: Array.from({length: 100}).map((_, index) => {
return {
Expand Down Expand Up @@ -227,15 +215,11 @@ describe('getReleaseEditEvents()', () => {
// Simulate the release states changing over time, but the _rev is the same
// 'a' at frame 0: initial state with _rev=rev1
// 'b' at frame 5: updated state with _rev=rev2
const releasesState$ = hot('a---b', {
a: MOCKED_RELEASES_STATE,
b: MOCKED_RELEASES_STATE,
})
const editEvents$ = getReleaseEditEvents({
client: mockClient,
releaseId: MOCKED_RELEASE._id,
releasesState$: releasesState$,
const observeDocument$ = hot('a---b', {
a: MOCKED_RELEASE,
b: MOCKED_RELEASE,
})
const editEvents$ = getReleaseEditEvents({client: mockClient, observeDocument$})
const mockResponse$ = cold('-a|', {a: MOCKED_TRANSACTION_LOGS})
mockGetTransactionsLogs.mockReturnValueOnce(mockResponse$)
// Even though the state changes, the editEvents$ should not emit again
Expand All @@ -252,24 +236,15 @@ describe('getReleaseEditEvents()', () => {
})
it('should refetch the edit events if release._rev changes', () => {
testScheduler.run(({expectObservable, cold, hot}) => {
// Define the initial and updated release state
const updatedReleaseState = {
...MOCKED_RELEASES_STATE,
releases: new Map([[MOCKED_RELEASE._id, {...MOCKED_RELEASE, _rev: 'changed-rev'}]]),
}
// Simulate the release states changing over time
// 'a' at frame 0: initial state with _rev=rev1
// 'b' at frame 5: updated state with _rev=rev2
const releasesState$ = hot('a---b', {
a: MOCKED_RELEASES_STATE,
b: updatedReleaseState,
const observeDocument$ = hot('a---b', {
a: MOCKED_RELEASE,
b: {...MOCKED_RELEASE, _rev: 'changed-rev'},
})

const editEvents$ = getReleaseEditEvents({
client: mockClient,
releaseId: MOCKED_RELEASE._id,
releasesState$: releasesState$,
})
const editEvents$ = getReleaseEditEvents({client: mockClient, observeDocument$})

const mockResponse$ = cold('-a|', {a: MOCKED_TRANSACTION_LOGS})
const newTransaction = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
} from 'rxjs'

import {getTransactionsLogs} from '../../../../store/translog/getTransactionsLogs'
import {type ReleasesReducerState} from '../../../store/reducer'
import {type ReleaseDocument} from '../../../store/types'
import {buildReleaseEditEvents} from './buildReleaseEditEvents'
import {type CreateReleaseEvent, type EditReleaseEvent} from './types'

Expand Down Expand Up @@ -120,23 +120,20 @@ export const INITIAL_VALUE: EditEventsObservableValue = {

interface getReleaseActivityEventsOpts {
client: SanityClient
releaseId: string
releasesState$: Observable<ReleasesReducerState>
observeDocument$: Observable<ReleaseDocument | undefined>
}

export function getReleaseEditEvents({
client,
releaseId,
releasesState$,
observeDocument$,
}: getReleaseActivityEventsOpts): Observable<EditEventsObservableValue> {
return releasesState$.pipe(
map((releasesState) => releasesState.releases.get(releaseId)),
// Don't emit if the release is not found
return observeDocument$.pipe(
filter(Boolean),
distinctUntilChanged((prev, next) => prev._rev === next._rev),
switchMap((release) => {
return getReleaseTransactions({
client,
documentId: releaseId,
documentId: release._id,
toTransaction: release._rev,
}).pipe(
map((transactions) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {

import {type DocumentPreviewStore} from '../../../../preview/documentPreviewStore'
import {type ReleasesReducerState} from '../../../store/reducer'
import {type ReleaseDocument} from '../../../store/types'
import {getReleaseIdFromReleaseDocumentId} from '../../../util/getReleaseIdFromReleaseDocumentId'
import {RELEASES_STUDIO_CLIENT_OPTIONS} from '../../../util/releasesClient'
import {getReleaseActivityEvents} from './getReleaseActivityEvents'
Expand Down Expand Up @@ -56,11 +57,11 @@ export function getReleaseEvents({
documentPreviewStore,
eventsAPIEnabled,
}: getReleaseEventsOpts) {
const activityEvents = eventsAPIEnabled
? getReleaseActivityEvents({client, releaseId})
: notEnabledActivityEvents
const observeDocument$ = documentPreviewStore.unstable_observeDocument(releaseId) as Observable<
ReleaseDocument | undefined
>

const editEvents$ = getReleaseEditEvents({client, releaseId, releasesState$})
const editEvents$ = getReleaseEditEvents({client, observeDocument$})

const releaseRev$ = releasesState$.pipe(
map((state) => state.releases.get(releaseId)?._rev),
Expand All @@ -70,18 +71,26 @@ export function getReleaseEvents({
skip(1),
)

// Turn off activity events if eventsAPI is not enabled.
const activityEvents = eventsAPIEnabled
? getReleaseActivityEvents({client, releaseId})
: notEnabledActivityEvents

const groqFilter = `_id in path("versions.${getReleaseIdFromReleaseDocumentId(releaseId)}.*")`
const documentsCount$ = documentPreviewStore
.unstable_observeDocumentIdSet(groqFilter, undefined, {
apiVersion: RELEASES_STUDIO_CLIENT_OPTIONS.apiVersion,
})
.pipe(
filter(({status}) => status === 'connected'),
map(({documentIds}) => documentIds.length),
distinctUntilChanged(),
// Emit only when count changes, after first non null value.
skip(1),
)
// Turn off document counts listener if eventsAPI is not enabled.
const documentsCount$ = eventsAPIEnabled
? of(0)
: documentPreviewStore
.unstable_observeDocumentIdSet(groqFilter, undefined, {
apiVersion: RELEASES_STUDIO_CLIENT_OPTIONS.apiVersion,
})
.pipe(
filter(({status}) => status === 'connected'),
map(({documentIds}) => documentIds.length),
distinctUntilChanged(),
// Emit only when count changes, after first non null value.
skip(1),
)

const sideEffects$ = merge(releaseRev$, documentsCount$).pipe(
tap(() => {
Expand Down

0 comments on commit a89b91d

Please sign in to comment.