feat: add upsert to database interface and adapters (#8397)

- Adds the upsert method to the database interface
- Adds a mongodb specific option to extend the updateOne to accept
mongoDB Query Options (to pass `upsert: true`)
- Added upsert method to all database adapters
- Uses db.upsert in the payload preferences update operation

Includes a test using payload-preferences
This commit is contained in:
Dan Ribbens
2024-09-25 09:23:54 -04:00
committed by GitHub
parent 06ea67a184
commit 82ba1930e5
10 changed files with 101 additions and 24 deletions

View File

@@ -1,7 +1,7 @@
import type { CollationOptions, TransactionOptions } from 'mongodb'
import type { MongoMemoryReplSet } from 'mongodb-memory-server'
import type { ClientSession, Connection, ConnectOptions } from 'mongoose'
import type { BaseDatabaseAdapter, DatabaseAdapterObj, Payload } from 'payload'
import type { ClientSession, Connection, ConnectOptions, QueryOptions } from 'mongoose'
import type { BaseDatabaseAdapter, DatabaseAdapterObj, Payload, UpdateOneArgs } from 'payload'
import fs from 'fs'
import mongoose from 'mongoose'
@@ -36,6 +36,7 @@ import { updateGlobal } from './updateGlobal.js'
import { updateGlobalVersion } from './updateGlobalVersion.js'
import { updateOne } from './updateOne.js'
import { updateVersion } from './updateVersion.js'
import { upsert } from './upsert.js'
export type { MigrateDownArgs, MigrateUpArgs } from './types.js'
@@ -124,6 +125,7 @@ declare module 'payload' {
}[]
sessions: Record<number | string, ClientSession>
transactionOptions: TransactionOptions
updateOne: (args: { options?: QueryOptions } & UpdateOneArgs) => Promise<Document>
versions: {
[slug: string]: CollectionModel
}
@@ -191,6 +193,7 @@ export function mongooseAdapter({
updateGlobalVersion,
updateOne,
updateVersion,
upsert,
})
}

View File

@@ -1,3 +1,4 @@
import type { QueryOptions } from 'mongoose'
import type { PayloadRequest, UpdateOne } from 'payload'
import type { MongooseAdapter } from './index.js'
@@ -9,11 +10,20 @@ import { withSession } from './withSession.js'
export const updateOne: UpdateOne = async function updateOne(
this: MongooseAdapter,
{ id, collection, data, locale, req = {} as PayloadRequest, where: whereArg },
{
id,
collection,
data,
locale,
options: optionsArgs = {},
req = {} as PayloadRequest,
where: whereArg,
},
) {
const where = id ? { id: { equals: id } } : whereArg
const Model = this.collections[collection]
const options = {
const options: QueryOptions = {
...optionsArgs,
...(await withSession(this, req)),
lean: true,
new: true,

View File

@@ -0,0 +1,10 @@
import type { PayloadRequest, Upsert } from 'payload'
import type { MongooseAdapter } from './index.js'
export const upsert: Upsert = async function upsert(
this: MongooseAdapter,
{ collection, data, locale, req = {} as PayloadRequest, where },
) {
return this.updateOne({ collection, data, locale, options: { upsert: true }, req, where })
}