@r1tsu/payload
Version:
181 lines (180 loc) • 7.17 kB
JavaScript
import executeAccess from '../../auth/executeAccess.js';
import { combineQueries } from '../../database/combineQueries.js';
import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js';
import { afterRead } from '../../fields/hooks/afterRead/index.js';
import { commitTransaction } from '../../utilities/commitTransaction.js';
import { initTransaction } from '../../utilities/initTransaction.js';
import { killTransaction } from '../../utilities/killTransaction.js';
import { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js';
import { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js';
import { getQueryDraftsSort } from '../../versions/drafts/getQueryDraftsSort.js';
import { buildAfterOperation } from './utils.js';
export const findOperation = async (incomingArgs)=>{
let args = incomingArgs;
try {
const shouldCommit = await initTransaction(args.req);
// /////////////////////////////////////
// beforeOperation - Collection
// /////////////////////////////////////
await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{
await priorHook;
args = await hook({
args,
collection: args.collection.config,
context: args.req.context,
operation: 'read',
req: args.req
}) || args;
}, Promise.resolve());
const { collection: { config: collectionConfig }, collection, currentDepth, depth, disableErrors, draft: draftsEnabled, limit, overrideAccess, page, pagination = true, req: { fallbackLocale, locale, payload }, req, showHiddenFields, sort, where } = args;
// /////////////////////////////////////
// Access
// /////////////////////////////////////
let accessResult;
if (!overrideAccess) {
accessResult = await executeAccess({
disableErrors,
req
}, collectionConfig.access.read);
// If errors are disabled, and access returns false, return empty results
if (accessResult === false) {
return {
docs: [],
hasNextPage: false,
hasPrevPage: false,
limit,
nextPage: null,
page: 1,
pagingCounter: 1,
prevPage: null,
totalDocs: 0,
totalPages: 1
};
}
}
// /////////////////////////////////////
// Find
// /////////////////////////////////////
const usePagination = pagination && limit !== 0;
const sanitizedLimit = limit ?? (usePagination ? 10 : 0);
const sanitizedPage = page || 1;
let result;
let fullWhere = combineQueries(where, accessResult);
if (collectionConfig.versions?.drafts && draftsEnabled) {
fullWhere = appendVersionToQueryKey(fullWhere);
await validateQueryPaths({
collectionConfig: collection.config,
overrideAccess,
req,
versionFields: buildVersionCollectionFields(collection.config),
where: fullWhere
});
result = await payload.db.queryDrafts({
collection: collectionConfig.slug,
limit: sanitizedLimit,
locale,
page: sanitizedPage,
pagination: usePagination,
req,
sort: getQueryDraftsSort(sort),
where: fullWhere
});
} else {
await validateQueryPaths({
collectionConfig,
overrideAccess,
req,
where
});
result = await payload.db.find({
collection: collectionConfig.slug,
limit: sanitizedLimit,
locale,
page: sanitizedPage,
pagination,
req,
sort,
where: fullWhere
});
}
// /////////////////////////////////////
// beforeRead - Collection
// /////////////////////////////////////
result = {
...result,
docs: await Promise.all(result.docs.map(async (doc)=>{
let docRef = doc;
await collectionConfig.hooks.beforeRead.reduce(async (priorHook, hook)=>{
await priorHook;
docRef = await hook({
collection: collectionConfig,
context: req.context,
doc: docRef,
query: fullWhere,
req
}) || docRef;
}, Promise.resolve());
return docRef;
}))
};
// /////////////////////////////////////
// afterRead - Fields
// /////////////////////////////////////
result = {
...result,
docs: await Promise.all(result.docs.map(async (doc)=>afterRead({
collection: collectionConfig,
context: req.context,
currentDepth,
depth,
doc,
fallbackLocale,
findMany: true,
global: null,
locale,
overrideAccess,
req,
showHiddenFields
})))
};
// /////////////////////////////////////
// afterRead - Collection
// /////////////////////////////////////
result = {
...result,
docs: await Promise.all(result.docs.map(async (doc)=>{
let docRef = doc;
await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{
await priorHook;
docRef = await hook({
collection: collectionConfig,
context: req.context,
doc: docRef,
findMany: true,
query: fullWhere,
req
}) || doc;
}, Promise.resolve());
return docRef;
}))
};
// /////////////////////////////////////
// afterOperation - Collection
// /////////////////////////////////////
result = await buildAfterOperation({
args,
collection: collectionConfig,
operation: 'find',
result
});
// /////////////////////////////////////
// Return results
// /////////////////////////////////////
if (shouldCommit) await commitTransaction(req);
return result;
} catch (error) {
await killTransaction(args.req);
throw error;
}
};
//# sourceMappingURL=find.js.map