Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion lib/adapters/REST/endpoints/entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import type {
PatchEntryParams,
PatchReleaseEntryParams,
QueryParams,
UpdateEntryParams,
UpdateReleaseEntryParams,
} from '../../../common-types'
import type { CreateEntryProps, EntryProps, EntryReferenceProps } from '../../../entities/entry'
import type { RestEndpoint } from '../types'
Expand Down Expand Up @@ -105,10 +107,14 @@ export const patch: RestEndpoint<'Entry', 'patch'> = <T extends KeyValueMap = Ke

export const update: RestEndpoint<'Entry', 'update'> = <T extends KeyValueMap = KeyValueMap>(
http: AxiosInstance,
params: GetSpaceEnvironmentParams & { entryId: string },
params: UpdateEntryParams & QueryParams,
rawData: EntryProps<T>,
headers?: RawAxiosRequestHeaders
) => {
if (params.releaseId) {
return releaseEntry.update(http, params as UpdateReleaseEntryParams, rawData, headers ?? {})
}

const data: SetOptional<typeof rawData, 'sys'> = copy(rawData)
delete data.sys
return raw.put<EntryProps<T>>(
Expand Down
3 changes: 2 additions & 1 deletion lib/common-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1618,7 +1618,7 @@ export type MRActions = {
return: EntryProps<any>
}
update: {
params: GetSpaceEnvironmentParams & { entryId: string }
params: UpdateEntryParams & QueryParams
payload: EntryProps<any>
headers?: RawAxiosRequestHeaders
return: EntryProps<any>
Expand Down Expand Up @@ -2396,6 +2396,7 @@ export type PatchEntryParams = GetSpaceEnvironmentParams & {
version: number
releaseId?: string
}
export type UpdateEntryParams = GetSpaceEnvironmentParams & { entryId: string; releaseId?: string }
export type GetExtensionParams = GetSpaceEnvironmentParams & { extensionId: string }
export type GetEnvironmentTemplateParams = GetOrganizationParams & { environmentTemplateId: string }
export type GetFunctionParams = GetAppDefinitionParams & { functionId: string }
Expand Down
3 changes: 2 additions & 1 deletion lib/plain/common-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import type {
PatchReleaseEntryParams,
QueryParams,
ReleaseEnvironmentParams,
UpdateEntryParams,
UpdateReleaseEntryParams,
} from '../common-types'
import type {
Expand Down Expand Up @@ -320,7 +321,7 @@ export type PlainClientAPI = {
>
>
update<T extends KeyValueMap = KeyValueMap>(
params: OptionalDefaults<GetSpaceEnvironmentParams & { entryId: string }>,
params: OptionalDefaults<UpdateEntryParams & QueryParams>,
rawData: EntryProps<T>,
headers?: RawAxiosRequestHeaders
): Promise<EntryProps<T>>
Expand Down
50 changes: 50 additions & 0 deletions test/integration/entry-integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,32 @@ describe('Entry Api', () => {
expect(patchedEntry.sys.version).toBeGreaterThan(entryToPatch.sys.version)
expect((patchedEntry as any).sys.release.sys.id).toEqual(entryToPatch.sys.release.sys.id)
})

test('entry.update works', async () => {
const entryToUpdate = await createEntryClient.entry.get({
entryId: entry.sys.id,
releaseId: release.sys.id,
})

const updatedEntry = await createEntryClient.entry.update(
{
entryId: entryToUpdate.sys.id,
releaseId: release.sys.id,
},
{
...entryToUpdate,
fields: {
...entryToUpdate.fields,
title: { 'en-US': 'Entry updated via release' },
},
}
)

expect(updatedEntry.sys.id).toEqual(entryToUpdate.sys.id)
expect(updatedEntry.fields.title['en-US']).toEqual('Entry updated via release')
expect(updatedEntry.sys.version).toBeGreaterThan(entryToUpdate.sys.version)
expect((updatedEntry as any).sys.release.sys.id).toEqual(entryToUpdate.sys.release.sys.id)
})
})

describe('releaseId is provided in default params, but not in params', () => {
Expand Down Expand Up @@ -878,6 +904,30 @@ describe('Entry Api', () => {
expect(patchedEntry.sys.version).toBeGreaterThan(entryToPatch.sys.version)
expect((patchedEntry as any).sys.release.sys.id).toEqual(entryToPatch.sys.release.sys.id)
})

test('entry.update works', async () => {
const entryToUpdate = await createEntryClient.entry.get({
entryId: entry.sys.id,
})

const updatedEntry = await createEntryClient.entry.update(
{
entryId: entryToUpdate.sys.id,
},
{
...entryToUpdate,
fields: {
...entryToUpdate.fields,
title: { 'en-US': 'Entry updated via default release' },
},
}
)

expect(updatedEntry.sys.id).toEqual(entryToUpdate.sys.id)
expect(updatedEntry.fields.title['en-US']).toEqual('Entry updated via default release')
expect(updatedEntry.sys.version).toBeGreaterThan(entryToUpdate.sys.version)
expect((updatedEntry as any).sys.release.sys.id).toEqual(entryToUpdate.sys.release.sys.id)
})
})
})

Expand Down
81 changes: 81 additions & 0 deletions test/unit/adapters/REST/endpoints/entry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,4 +276,85 @@ describe('Rest Entry', () => {
)
})
})

test('update without releaseId', async () => {
const { httpMock, adapterMock, entityMock } = setup(Promise.resolve({}))

httpMock.put.mockReturnValue(Promise.resolve({ data: entityMock }))

const updateData = {
...entityMock,
fields: {
title: { 'en-US': 'Updated Title' },
},
}

return adapterMock
.makeRequest({
entityType: 'Entry',
action: 'update',
userAgent: 'mocked',
params: {
spaceId: 'space123',
environmentId: 'master',
entryId: 'entry123',
},
payload: updateData,
})
.then((r) => {
expect(r).to.eql(entityMock)
expect(httpMock.put.mock.calls[0][0]).to.eql(
'/spaces/space123/environments/master/entries/entry123'
)
// Check that sys is removed from the payload
expect(httpMock.put.mock.calls[0][1]).not.toHaveProperty('sys')
expect(httpMock.put.mock.calls[0][1].fields.title['en-US']).to.eql('Updated Title')
expect(httpMock.put.mock.calls[0][2].headers['X-Contentful-Version']).to.eql(
updateData.sys.version
)
})
})

test('update with releaseId delegates to release entry', async () => {
const { httpMock, adapterMock, entityMock } = setup(Promise.resolve({}))

// Mock the release entry endpoint
httpMock.put.mockReturnValue(Promise.resolve({ data: entityMock }))

const updateData = {
...entityMock,
fields: {
title: { 'en-US': 'Updated Title in Release' },
},
}

return adapterMock
.makeRequest({
entityType: 'Entry',
action: 'update',
userAgent: 'mocked',
params: {
spaceId: 'space123',
environmentId: 'master',
entryId: 'entry123',
releaseId: 'release456',
},
payload: updateData,
})
.then((r) => {
expect(r).to.eql(entityMock)
// When releaseId is provided, it should call the release entry endpoint
expect(httpMock.put.mock.calls[0][0]).to.eql(
'/spaces/space123/environments/master/releases/release456/entries/entry123'
)
// Check that sys is removed from the payload
expect(httpMock.put.mock.calls[0][1]).not.toHaveProperty('sys')
expect(httpMock.put.mock.calls[0][1].fields.title['en-US']).to.eql(
'Updated Title in Release'
)
expect(httpMock.put.mock.calls[0][2].headers['X-Contentful-Version']).to.eql(
updateData.sys.version
)
})
})
})