From a5cae077ccb103dc0f041f626db345c86514ab92 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 15 Nov 2024 14:22:04 -0500 Subject: [PATCH] fix: duplicate list preferences stored (#9185) The collection list columns are stored as user preferences to the payload-preferences collection. Normally one user should never have duplicate documents with the same key. This is controlled by using an upsert normally. The collection list does not have a good way to call upsert and was creating preferences documents every time. This change makes it so that existing preferences are updated rather than created with each column change. --- packages/ui/src/utilities/buildTableState.ts | 44 ++++++++++++-------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/ui/src/utilities/buildTableState.ts b/packages/ui/src/utilities/buildTableState.ts index c6a56e5cb..8c2d10dbd 100644 --- a/packages/ui/src/utilities/buildTableState.ts +++ b/packages/ui/src/utilities/buildTableState.ts @@ -166,6 +166,7 @@ export const buildTableState = async ( collection: 'payload-preferences', depth: 0, limit: 1, + pagination: false, where: { and: [ { @@ -186,30 +187,39 @@ export const buildTableState = async ( ], }, }) - .then((res) => res.docs[0]?.value as ListPreferences) + .then((res) => res.docs[0] ?? { id: null, value: {} }) - let newPrefs = preferencesResult + let newPrefs = preferencesResult.value - if (!preferencesResult || !dequal(columns, preferencesResult?.columns)) { + if (!preferencesResult.id || !dequal(columns, preferencesResult?.columns)) { const mergedPrefs = { ...(preferencesResult || {}), columns, } - - newPrefs = await payload - .create({ - collection: 'payload-preferences', - data: { - key: preferencesKey, - user: { - collection: user.collection, - value: user.id, - }, - value: mergedPrefs, + const preferencesArgs = { + collection: 'payload-preferences', + data: { + key: preferencesKey, + user: { + collection: user.collection, + value: user.id, }, - req, - }) - ?.then((res) => res.value as ListPreferences) + value: mergedPrefs, + }, + depth: 0, + req, + } + + if (preferencesResult.id) { + newPrefs = await payload + .update({ + ...preferencesArgs, + id: preferencesResult.id, + }) + ?.then((res) => res.value as ListPreferences) + } else { + newPrefs = await payload.create(preferencesArgs)?.then((res) => res.value as ListPreferences) + } } const fields = collectionConfig.fields