Skip to content

Commit e90ff72

Browse files
authored
fix: reordering draft documents causes data loss (#12109)
Re-ordering documents with drafts uses `payload.update()` with `select: { id: true }` and that causes draft versions of those docs to be updated without any data. I've removed the `select` optimization to prevent data loss. Fixes #12097
1 parent babf4f9 commit e90ff72

File tree

3 files changed

+118
-2
lines changed

3 files changed

+118
-2
lines changed

Diff for: packages/payload/src/config/orderable/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,6 @@ export const addOrderableEndpoint = (config: SanitizedConfig) => {
257257
},
258258
depth: 0,
259259
req,
260-
select: { id: true },
261260
})
262261
}
263262

Diff for: test/sort/collections/Drafts/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export const DraftsCollection: CollectionConfig = {
77
admin: {
88
useAsTitle: 'text',
99
},
10+
orderable: true,
1011
versions: {
1112
drafts: true,
1213
},

Diff for: test/sort/int.spec.ts

+117-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import path from 'path'
44
import { fileURLToPath } from 'url'
55

66
import type { NextRESTClient } from '../helpers/NextRESTClient.js'
7-
import type { Orderable, OrderableJoin } from './payload-types.js'
7+
import type { Draft, Orderable, OrderableJoin } from './payload-types.js'
88

99
import { initPayloadInt } from '../helpers/initPayloadInt.js'
10+
import { draftsSlug } from './collections/Drafts/index.js'
1011
import { orderableSlug } from './collections/Orderable/index.js'
1112
import { orderableJoinSlug } from './collections/OrderableJoin/index.js'
1213

@@ -330,6 +331,121 @@ describe('Sort', () => {
330331
})
331332
})
332333

334+
describe('Orderable', () => {
335+
let orderable1: Orderable
336+
let orderable2: Orderable
337+
let orderableDraft1: Draft
338+
let orderableDraft2: Draft
339+
beforeAll(async () => {
340+
orderable1 = await payload.create({
341+
collection: orderableSlug,
342+
data: {
343+
title: 'Orderable 1',
344+
},
345+
})
346+
orderable2 = await payload.create({
347+
collection: orderableSlug,
348+
data: {
349+
title: 'Orderable 2',
350+
},
351+
})
352+
orderableDraft1 = await payload.create({
353+
collection: draftsSlug,
354+
data: {
355+
text: 'Orderable 1',
356+
_status: 'draft',
357+
},
358+
})
359+
orderableDraft2 = await payload.create({
360+
collection: draftsSlug,
361+
data: {
362+
text: 'Orderable 2',
363+
_status: 'draft',
364+
},
365+
})
366+
})
367+
368+
it('should set order by default', async () => {
369+
const ordered = await payload.find({
370+
collection: orderableSlug,
371+
where: {
372+
title: {
373+
contains: 'Orderable ',
374+
},
375+
},
376+
})
377+
378+
expect(orderable1._order).toBeDefined()
379+
expect(orderable2._order).toBeDefined()
380+
expect(parseInt(orderable1._order, 16)).toBeLessThan(parseInt(orderable2._order, 16))
381+
expect(ordered.docs[0].id).toStrictEqual(orderable1.id)
382+
expect(ordered.docs[1].id).toStrictEqual(orderable2.id)
383+
})
384+
385+
it('should allow reordering with REST API', async () => {
386+
const res = await restClient.POST('/reorder', {
387+
body: JSON.stringify({
388+
collectionSlug: orderableSlug,
389+
docsToMove: [orderable1.id],
390+
newKeyWillBe: 'greater',
391+
orderableFieldName: '_order',
392+
target: {
393+
id: orderable2.id,
394+
key: orderable2._order,
395+
},
396+
}),
397+
})
398+
399+
expect(res.status).toStrictEqual(200)
400+
401+
const ordered = await payload.find({
402+
collection: 'orderable',
403+
where: {
404+
title: {
405+
contains: 'Orderable ',
406+
},
407+
},
408+
})
409+
410+
expect(parseInt(ordered.docs[0]._order, 16)).toBeLessThan(
411+
parseInt(ordered.docs[1]._order, 16),
412+
)
413+
})
414+
415+
it('should allow reordering with REST API with drafts enabled', async () => {
416+
const res = await restClient.POST('/reorder', {
417+
body: JSON.stringify({
418+
collectionSlug: draftsSlug,
419+
docsToMove: [orderableDraft1.id],
420+
newKeyWillBe: 'greater',
421+
orderableFieldName: '_order',
422+
target: {
423+
id: orderableDraft2.id,
424+
key: orderableDraft2._order,
425+
},
426+
}),
427+
})
428+
429+
expect(res.status).toStrictEqual(200)
430+
431+
const ordered = await payload.find({
432+
collection: draftsSlug,
433+
draft: true,
434+
where: {
435+
text: {
436+
contains: 'Orderable ',
437+
},
438+
},
439+
})
440+
441+
expect(ordered.docs).toHaveLength(2)
442+
443+
expect(parseInt(ordered.docs[0]._order, 16)).toBeLessThan(
444+
parseInt(ordered.docs[1]._order, 16),
445+
)
446+
})
447+
})
448+
333449
describe('Orderable join', () => {
334450
let related: OrderableJoin
335451
let orderable1: Orderable

0 commit comments

Comments
 (0)