Files
payload/packages/db-mongodb/src/findOne.ts
Sasha 79a7b4ad02 chore(db-mongodb): tsconfig uses strict: true and noUncheckedIndexedAccess: true (#11444)
Migrates the `db-mongodb` package to use `strict: true` and
`noUncheckedIndexedAccess: true` TSConfig properties.
This greatly improves code quality and prevents some runtime errors or
gives better error messages.
2025-03-01 00:17:24 +02:00

77 lines
1.9 KiB
TypeScript

import type { AggregateOptions, QueryOptions } from 'mongoose'
import { type FindOne } from 'payload'
import type { MongooseAdapter } from './index.js'
import { buildQuery } from './queries/buildQuery.js'
import { aggregatePaginate } from './utilities/aggregatePaginate.js'
import { buildJoinAggregation } from './utilities/buildJoinAggregation.js'
import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'
import { getCollection } from './utilities/getEntity.js'
import { getSession } from './utilities/getSession.js'
import { transform } from './utilities/transform.js'
export const findOne: FindOne = async function findOne(
this: MongooseAdapter,
{ collection: collectionSlug, joins, locale, req, select, where = {} },
) {
const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })
const session = await getSession(this, req)
const options: AggregateOptions & QueryOptions = {
lean: true,
session,
}
const query = await buildQuery({
adapter: this,
collectionSlug,
fields: collectionConfig.flattenedFields,
locale,
where,
})
const projection = buildProjectionFromSelect({
adapter: this,
fields: collectionConfig.flattenedFields,
select,
})
const aggregate = await buildJoinAggregation({
adapter: this,
collection: collectionSlug,
collectionConfig,
joins,
locale,
projection,
query,
})
let doc
if (aggregate) {
const { docs } = await aggregatePaginate({
adapter: this,
joinAggregation: aggregate,
limit: 1,
Model,
pagination: false,
projection,
query,
session,
})
doc = docs[0]
} else {
;(options as Record<string, unknown>).projection = projection
doc = await Model.findOne(query, {}, options)
}
if (!doc) {
return null
}
transform({ adapter: this, data: doc, fields: collectionConfig.fields, operation: 'read' })
return doc
}