diff --git a/packages/graphql/src/resolvers/collections/count.ts b/packages/graphql/src/resolvers/collections/count.ts index ba060fda2..335ec8146 100644 --- a/packages/graphql/src/resolvers/collections/count.ts +++ b/packages/graphql/src/resolvers/collections/count.ts @@ -19,7 +19,7 @@ export type Resolver = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any ) => Promise<{ totalDocs: number }> -export default function countResolver(collection: Collection): Resolver { +export function countResolver(collection: Collection): Resolver { return async function resolver(_, args, context: Context) { let { req } = context const locale = req.locale diff --git a/packages/graphql/src/resolvers/collections/delete.ts b/packages/graphql/src/resolvers/collections/delete.ts index 7dfb3b199..d0677b577 100644 --- a/packages/graphql/src/resolvers/collections/delete.ts +++ b/packages/graphql/src/resolvers/collections/delete.ts @@ -10,7 +10,9 @@ import type { Context } from '../types.js' export type Resolver = ( _: unknown, args: { + draft: boolean fallbackLocale?: string + id: number | string locale?: string }, context: { @@ -18,10 +20,10 @@ export type Resolver = ( }, ) => Promise -export default function getDeleteResolver( +export function getDeleteResolver( collection: Collection, ): Resolver { - async function resolver(_, args, context: Context) { + return async function resolver(_, args, context: Context) { let { req } = context const locale = req.locale const fallbackLocale = req.fallbackLocale @@ -29,6 +31,16 @@ export default function getDeleteResolver Promise> -export default function findResolver(collection: Collection): Resolver { +export function findResolver(collection: Collection): Resolver { return async function resolver(_, args, context: Context) { let { req } = context const locale = req.locale @@ -34,6 +34,16 @@ export default function findResolver(collection: Collection): Resolver { req = isolateObjectProperty(req, 'fallbackLocale') req.locale = args.locale || locale req.fallbackLocale = args.fallbackLocale || fallbackLocale + if (!req.query) req.query = {} + + const draft: boolean = + args.draft ?? req.query?.draft === 'false' + ? false + : req.query?.draft === 'true' + ? true + : undefined + if (typeof draft === 'boolean') req.query.draft = String(draft) + context.req = req const options = { diff --git a/packages/graphql/src/resolvers/collections/findByID.ts b/packages/graphql/src/resolvers/collections/findByID.ts index 1738b520b..ed6313b1f 100644 --- a/packages/graphql/src/resolvers/collections/findByID.ts +++ b/packages/graphql/src/resolvers/collections/findByID.ts @@ -20,7 +20,7 @@ export type Resolver = ( }, ) => Promise -export default function findByIDResolver( +export function findByIDResolver( collection: Collection, ): Resolver { return async function resolver(_, args, context: Context) { @@ -31,6 +31,16 @@ export default function findByIDResolver = ( _: unknown, args: { - draft: boolean fallbackLocale?: string id: number | string locale?: string @@ -20,7 +19,7 @@ export type Resolver = ( }, ) => Promise> -export default function findVersionByIDResolver(collection: Collection): Resolver { +export function findVersionByIDResolver(collection: Collection): Resolver { return async function resolver(_, args, context: Context) { let { req } = context const locale = req.locale @@ -29,13 +28,13 @@ export default function findVersionByIDResolver(collection: Collection): Resolve req = isolateObjectProperty(req, 'fallbackLocale') req.locale = args.locale || locale req.fallbackLocale = args.fallbackLocale || fallbackLocale + context.req = req const options = { id: args.id, collection, depth: 0, - draft: args.draft, req: isolateObjectProperty(req, 'transactionID'), } diff --git a/packages/graphql/src/resolvers/collections/findVersions.ts b/packages/graphql/src/resolvers/collections/findVersions.ts index 8dfddd801..4bf618164 100644 --- a/packages/graphql/src/resolvers/collections/findVersions.ts +++ b/packages/graphql/src/resolvers/collections/findVersions.ts @@ -10,6 +10,7 @@ import type { Context } from '../types.js' export type Resolver = ( _: unknown, args: { + draft?: boolean fallbackLocale?: string limit?: number locale?: string @@ -22,8 +23,8 @@ export type Resolver = ( }, ) => Promise> -export default function findVersionsResolver(collection: Collection): Resolver { - async function resolver(_, args, context: Context) { +export function findVersionsResolver(collection: Collection): Resolver { + return async function resolver(_, args, context: Context) { let { req } = context const locale = req.locale const fallbackLocale = req.fallbackLocale @@ -31,6 +32,16 @@ export default function findVersionsResolver(collection: Collection): Resolver { req = isolateObjectProperty(req, 'fallbackLocale') req.locale = args.locale || locale req.fallbackLocale = args.fallbackLocale || fallbackLocale + if (!req.query) req.query = {} + + const draft: boolean = + args.draft ?? req.query?.draft === 'false' + ? false + : req.query?.draft === 'true' + ? true + : undefined + if (typeof draft === 'boolean') req.query.draft = String(draft) + context.req = req const options = { @@ -47,6 +58,4 @@ export default function findVersionsResolver(collection: Collection): Resolver { return result } - - return resolver } diff --git a/packages/graphql/src/resolvers/collections/update.ts b/packages/graphql/src/resolvers/collections/update.ts index 33642a311..ebdfde533 100644 --- a/packages/graphql/src/resolvers/collections/update.ts +++ b/packages/graphql/src/resolvers/collections/update.ts @@ -13,6 +13,7 @@ export type Resolver = ( autosave: boolean data: GeneratedTypes['collections'][TSlug] draft: boolean + fallbackLocale?: string id: number | string locale?: string }, @@ -21,10 +22,10 @@ export type Resolver = ( }, ) => Promise -export default function updateResolver( +export function updateResolver( collection: Collection, ): Resolver { - async function resolver(_, args, context: Context) { + return async function resolver(_, args, context: Context) { let { req } = context const locale = req.locale const fallbackLocale = req.fallbackLocale @@ -32,13 +33,23 @@ export default function updateResolver graphqlResult.collections[relation].config.versions?.drafts, + ) + + if (relationsUseDrafts) { + relationshipArgs.draft = { + type: GraphQLBoolean, + } + } + if (config.localization) { relationshipArgs.locale = { type: graphqlResult.types.localeInputType, @@ -350,6 +361,7 @@ function buildObjectType({ const locale = args.locale || context.req.locale const fallbackLocale = args.fallbackLocale || context.req.fallbackLocale let relatedCollectionSlug = field.relationTo + const draft = args.draft ?? context.req.query?.draft if (hasManyValues) { const results = [] @@ -365,17 +377,18 @@ function buildObjectType({ } const result = await context.req.payloadDataLoader.load( - JSON.stringify([ - context.req.transactionID, - collectionSlug, - id, - 0, - 0, - locale, + createDataloaderCacheKey({ + collectionSlug: collectionSlug as string, + currentDepth: 0, + depth: 0, + docID: id, + draft, fallbackLocale, - false, - false, - ]), + locale, + overrideAccess: false, + showHiddenFields: false, + transactionID: context.req.transactionID, + }), ) if (result) { @@ -411,17 +424,18 @@ function buildObjectType({ if (id) { const relatedDocument = await context.req.payloadDataLoader.load( - JSON.stringify([ - context.req.transactionID, - relatedCollectionSlug, - id, - 0, - 0, - locale, + createDataloaderCacheKey({ + collectionSlug: relatedCollectionSlug as string, + currentDepth: 0, + depth: 0, + docID: id, + draft, fallbackLocale, - false, - false, - ]), + locale, + overrideAccess: false, + showHiddenFields: false, + transactionID: context.req.transactionID, + }), ) if (relatedDocument) { @@ -479,6 +493,7 @@ function buildObjectType({ editor?.populationPromises({ context, depth, + draft: args.draft, field, fieldPromises, findMany: false, @@ -615,17 +630,18 @@ function buildObjectType({ if (id) { const relatedDocument = await context.req.payloadDataLoader.load( - JSON.stringify([ - context.req.transactionID, - relatedCollectionSlug, - id, - 0, - 0, - locale, + createDataloaderCacheKey({ + collectionSlug: relatedCollectionSlug, + currentDepth: 0, + depth: 0, + docID: id, + draft: false, fallbackLocale, - false, - false, - ]), + locale, + overrideAccess: false, + showHiddenFields: false, + transactionID: context.req.transactionID, + }), ) return relatedDocument || null diff --git a/packages/graphql/src/schema/initCollections.ts b/packages/graphql/src/schema/initCollections.ts index dc36d644a..1e638c1ed 100644 --- a/packages/graphql/src/schema/initCollections.ts +++ b/packages/graphql/src/schema/initCollections.ts @@ -24,17 +24,17 @@ import refresh from '../resolvers/auth/refresh.js' import resetPassword from '../resolvers/auth/resetPassword.js' import unlock from '../resolvers/auth/unlock.js' import verifyEmail from '../resolvers/auth/verifyEmail.js' -import countResolver from '../resolvers/collections/count.js' +import { countResolver } from '../resolvers/collections/count.js' import createResolver from '../resolvers/collections/create.js' -import getDeleteResolver from '../resolvers/collections/delete.js' +import { getDeleteResolver } from '../resolvers/collections/delete.js' import { docAccessResolver } from '../resolvers/collections/docAccess.js' import duplicateResolver from '../resolvers/collections/duplicate.js' -import findResolver from '../resolvers/collections/find.js' -import findByIDResolver from '../resolvers/collections/findByID.js' -import findVersionByIDResolver from '../resolvers/collections/findVersionByID.js' -import findVersionsResolver from '../resolvers/collections/findVersions.js' +import { findResolver } from '../resolvers/collections/find.js' +import { findByIDResolver } from '../resolvers/collections/findByID.js' +import { findVersionByIDResolver } from '../resolvers/collections/findVersionByID.js' +import { findVersionsResolver } from '../resolvers/collections/findVersions.js' import restoreVersionResolver from '../resolvers/collections/restoreVersion.js' -import updateResolver from '../resolvers/collections/update.js' +import { updateResolver } from '../resolvers/collections/update.js' import formatName from '../utilities/formatName.js' import { buildMutationInputType, getCollectionIDType } from './buildMutationInputType.js' import buildObjectType from './buildObjectType.js' diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index 5d01b5f0d..2145cd0c4 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -58,6 +58,7 @@ type RichTextAdapterBase< context: RequestContext currentDepth?: number depth: number + draft: boolean field: RichTextField fieldPromises: Promise[] findMany: boolean diff --git a/packages/payload/src/auth/operations/login.ts b/packages/payload/src/auth/operations/login.ts index ee4ff1f88..d2c0f5602 100644 --- a/packages/payload/src/auth/operations/login.ts +++ b/packages/payload/src/auth/operations/login.ts @@ -189,6 +189,7 @@ export const loginOperation = async { - const docKey = JSON.stringify([ - req.transactionID, - collection, - doc.id, - depth, + const docKey = createDataloaderCacheKey({ + collectionSlug: collection, currentDepth, - locale, - fallbackLocale, + depth, + docID: doc.id, + draft, + fallbackLocale: req.fallbackLocale, + locale: req.locale, overrideAccess, showHiddenFields, - ]) + transactionID: req.transactionID, + }) const docsIndex = keys.findIndex((key) => key === docKey) if (docsIndex > -1) { @@ -150,3 +155,40 @@ const batchAndLoadDocs = } export const getDataLoader = (req: PayloadRequest) => new DataLoader(batchAndLoadDocs(req)) + +type CreateCacheKeyArgs = { + collectionSlug: string + currentDepth: number + depth: number + docID: number | string + draft: boolean + fallbackLocale: string + locale: string + overrideAccess: boolean + showHiddenFields: boolean + transactionID: number | string +} +export const createDataloaderCacheKey = ({ + collectionSlug, + currentDepth, + depth, + docID, + draft, + fallbackLocale, + locale, + overrideAccess, + showHiddenFields, + transactionID, +}: CreateCacheKeyArgs): string => + JSON.stringify([ + transactionID, + collectionSlug, + docID, + depth, + currentDepth, + locale, + fallbackLocale, + overrideAccess, + showHiddenFields, + draft, + ]) diff --git a/packages/payload/src/collections/operations/create.ts b/packages/payload/src/collections/operations/create.ts index d2a36c0ee..beedd144b 100644 --- a/packages/payload/src/collections/operations/create.ts +++ b/packages/payload/src/collections/operations/create.ts @@ -288,6 +288,7 @@ export const createOperation = async ( currentDepth, depth, doc: result, + draft: draftEnabled, fallbackLocale, global: null, locale, diff --git a/packages/payload/src/collections/operations/findVersionByID.ts b/packages/payload/src/collections/operations/findVersionByID.ts index 40023411b..6745bc6e0 100644 --- a/packages/payload/src/collections/operations/findVersionByID.ts +++ b/packages/payload/src/collections/operations/findVersionByID.ts @@ -112,6 +112,7 @@ export const findVersionByIDOperation = async ( currentDepth, depth, doc: result.version, + draft: undefined, fallbackLocale, global: null, locale, diff --git a/packages/payload/src/collections/operations/findVersions.ts b/packages/payload/src/collections/operations/findVersions.ts index c8029d4c7..9fc865723 100644 --- a/packages/payload/src/collections/operations/findVersions.ts +++ b/packages/payload/src/collections/operations/findVersions.ts @@ -124,6 +124,7 @@ export const findVersionsOperation = async >( context: req.context, depth, doc: data.version, + draft: undefined, fallbackLocale, findMany: true, global: null, diff --git a/packages/payload/src/collections/operations/restoreVersion.ts b/packages/payload/src/collections/operations/restoreVersion.ts index bcb05004f..d07fd1bd1 100644 --- a/packages/payload/src/collections/operations/restoreVersion.ts +++ b/packages/payload/src/collections/operations/restoreVersion.ts @@ -142,6 +142,7 @@ export const restoreVersionOperation = async ( context: req.context, depth, doc: result, + draft: undefined, fallbackLocale, global: null, locale, diff --git a/packages/payload/src/collections/operations/update.ts b/packages/payload/src/collections/operations/update.ts index 0a2ec8f55..94361f242 100644 --- a/packages/payload/src/collections/operations/update.ts +++ b/packages/payload/src/collections/operations/update.ts @@ -176,6 +176,7 @@ export const updateOperation = async + draft: boolean fallbackLocale: null | string findMany?: boolean flattenLocales?: boolean @@ -38,6 +39,7 @@ export async function afterRead(args: Args): Promise { currentDepth: incomingCurrentDepth, depth: incomingDepth, doc: incomingDoc, + draft, fallbackLocale, findMany, flattenLocales = true, @@ -66,6 +68,7 @@ export async function afterRead(args: Args): Promise { currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: collection?.fields || global?.fields, diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index 5d63dd258..2fec04ae9 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -16,6 +16,7 @@ type Args = { currentDepth: number depth: number doc: Record + draft: boolean fallbackLocale: null | string field: Field | TabAsField /** @@ -49,6 +50,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, field, fieldPromises, @@ -152,6 +154,7 @@ export const promise = async ({ context, currentDepth, depth, + draft, field, fieldPromises, findMany, @@ -279,6 +282,7 @@ export const promise = async ({ relationshipPopulationPromise({ currentDepth, depth, + draft, fallbackLocale, field, locale, @@ -302,6 +306,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: field.fields, @@ -332,6 +337,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: field.fields, @@ -358,6 +364,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: field.fields, @@ -396,6 +403,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: block.fields, @@ -426,6 +434,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: block.fields, @@ -460,6 +469,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: field.fields, @@ -492,6 +502,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: field.fields, @@ -518,6 +529,7 @@ export const promise = async ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index 3004b251a..5d8a9aa18 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -1,6 +1,7 @@ import type { PayloadRequestWithData } from '../../../types/index.js' import type { RelationshipField, UploadField } from '../../config/types.js' +import { createDataloaderCacheKey } from '../../../collections/dataloader.js' import { fieldHasMaxDepth, fieldSupportsMany } from '../../config/types.js' type PopulateArgs = { @@ -8,6 +9,7 @@ type PopulateArgs = { data: Record dataReference: Record depth: number + draft: boolean fallbackLocale: null | string field: RelationshipField | UploadField index?: number @@ -23,6 +25,7 @@ const populate = async ({ data, dataReference, depth, + draft, fallbackLocale, field, index, @@ -52,17 +55,18 @@ const populate = async ({ if (shouldPopulate) { relationshipValue = await req.payloadDataLoader.load( - JSON.stringify([ - req.transactionID, - relatedCollection.config.slug, - id, + createDataloaderCacheKey({ + collectionSlug: relatedCollection.config.slug, + currentDepth: currentDepth + 1, depth, - currentDepth + 1, - locale, + docID: id as string, + draft, fallbackLocale, + locale, overrideAccess, showHiddenFields, - ]), + transactionID: req.transactionID, + }), ) } @@ -94,6 +98,7 @@ const populate = async ({ type PromiseArgs = { currentDepth: number depth: number + draft: boolean fallbackLocale: null | string field: RelationshipField | UploadField locale: null | string @@ -106,6 +111,7 @@ type PromiseArgs = { export const relationshipPopulationPromise = async ({ currentDepth, depth, + draft, fallbackLocale, field, locale, @@ -133,6 +139,7 @@ export const relationshipPopulationPromise = async ({ data: siblingDoc[field.name][key][index], dataReference: resultingDoc, depth: populateDepth, + draft, fallbackLocale, field, index, @@ -156,6 +163,7 @@ export const relationshipPopulationPromise = async ({ data: relatedDoc, dataReference: resultingDoc, depth: populateDepth, + draft, fallbackLocale, field, index, @@ -182,6 +190,7 @@ export const relationshipPopulationPromise = async ({ data: siblingDoc[field.name][key], dataReference: resultingDoc, depth: populateDepth, + draft, fallbackLocale, field, key, @@ -201,6 +210,7 @@ export const relationshipPopulationPromise = async ({ data: siblingDoc[field.name], dataReference: resultingDoc, depth: populateDepth, + draft, fallbackLocale, field, locale, diff --git a/packages/payload/src/fields/hooks/afterRead/traverseFields.ts b/packages/payload/src/fields/hooks/afterRead/traverseFields.ts index 0cae86486..cc09728e5 100644 --- a/packages/payload/src/fields/hooks/afterRead/traverseFields.ts +++ b/packages/payload/src/fields/hooks/afterRead/traverseFields.ts @@ -11,6 +11,7 @@ type Args = { currentDepth: number depth: number doc: Record + draft: boolean fallbackLocale: null | string /** * fieldPromises are used for things like field hooks. They should be awaited before awaiting populationPromises @@ -36,6 +37,7 @@ export const traverseFields = ({ currentDepth, depth, doc, + draft, fallbackLocale, fieldPromises, fields, @@ -59,6 +61,7 @@ export const traverseFields = ({ currentDepth, depth, doc, + draft, fallbackLocale, field, fieldPromises, diff --git a/packages/payload/src/globals/operations/findOne.ts b/packages/payload/src/globals/operations/findOne.ts index a9da608ed..7bbcd23b2 100644 --- a/packages/payload/src/globals/operations/findOne.ts +++ b/packages/payload/src/globals/operations/findOne.ts @@ -101,6 +101,7 @@ export const findOneOperation = async >( context: req.context, depth, doc, + draft: draftEnabled, fallbackLocale, global: globalConfig, locale, diff --git a/packages/payload/src/globals/operations/findVersionByID.ts b/packages/payload/src/globals/operations/findVersionByID.ts index 050d35961..22ecc5bd2 100644 --- a/packages/payload/src/globals/operations/findVersionByID.ts +++ b/packages/payload/src/globals/operations/findVersionByID.ts @@ -110,6 +110,7 @@ export const findVersionByIDOperation = async = an currentDepth, depth, doc: result.version, + draft: undefined, fallbackLocale, global: globalConfig, locale, diff --git a/packages/payload/src/globals/operations/findVersions.ts b/packages/payload/src/globals/operations/findVersions.ts index 1c75f9032..52e2c12de 100644 --- a/packages/payload/src/globals/operations/findVersions.ts +++ b/packages/payload/src/globals/operations/findVersions.ts @@ -96,6 +96,7 @@ export const findVersionsOperation = async >( // Patch globalType onto version doc globalType: globalConfig.slug, }, + draft: undefined, fallbackLocale, findMany: true, global: globalConfig, diff --git a/packages/payload/src/globals/operations/restoreVersion.ts b/packages/payload/src/globals/operations/restoreVersion.ts index 24bfd5b71..b7db497f8 100644 --- a/packages/payload/src/globals/operations/restoreVersion.ts +++ b/packages/payload/src/globals/operations/restoreVersion.ts @@ -107,6 +107,7 @@ export const restoreVersionOperation = async = any context: req.context, depth, doc: result, + draft: undefined, fallbackLocale, global: globalConfig, locale, diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 15c6ca3a5..40fc6657e 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -96,6 +96,7 @@ export const updateOperation = async = ({ currentDepth, depth, + draft, field, node, overrideAccess, @@ -27,6 +28,7 @@ export const relationshipPopulationPromise: PopulationPromise key: number | string overrideAccess?: boolean @@ -21,6 +24,7 @@ export const populate = async ({ currentDepth, data, depth, + draft, key, overrideAccess, req, @@ -33,17 +37,18 @@ export const populate = async ({ const dataRef = data as Record const doc = await req.payloadDataLoader.load( - JSON.stringify([ - req.transactionID, - collection.config.slug, - id, + createDataloaderCacheKey({ + collectionSlug: collection.config.slug, + currentDepth: currentDepth + 1, depth, - currentDepth + 1, - req.locale, - req.fallbackLocale, - typeof overrideAccess === 'undefined' ? false : overrideAccess, + docID: id as string, + draft, + fallbackLocale: req.fallbackLocale, + locale: req.locale, + overrideAccess: typeof overrideAccess === 'undefined' ? false : overrideAccess, showHiddenFields, - ]), + transactionID: req.transactionID, + }), ) if (doc) { diff --git a/packages/richtext-lexical/src/populate/populateLexicalPopulationPromises.ts b/packages/richtext-lexical/src/populate/populateLexicalPopulationPromises.ts index 58974b4a4..38b7fbca8 100644 --- a/packages/richtext-lexical/src/populate/populateLexicalPopulationPromises.ts +++ b/packages/richtext-lexical/src/populate/populateLexicalPopulationPromises.ts @@ -19,6 +19,7 @@ export const populateLexicalPopulationPromises = ({ context, currentDepth, depth, + draft, editorPopulationPromises, field, fieldPromises, @@ -42,6 +43,7 @@ export const populateLexicalPopulationPromises = ({ context, currentDepth, depth, + draft, editorPopulationPromises, field, fieldPromises, diff --git a/packages/richtext-lexical/src/populate/recurseNestedFields.ts b/packages/richtext-lexical/src/populate/recurseNestedFields.ts index ececec19f..fc73266ed 100644 --- a/packages/richtext-lexical/src/populate/recurseNestedFields.ts +++ b/packages/richtext-lexical/src/populate/recurseNestedFields.ts @@ -10,6 +10,7 @@ type NestedRichTextFieldsArgs = { currentDepth?: number data: unknown depth: number + draft: boolean /** * This maps all the population promises to the node types */ @@ -33,6 +34,7 @@ export const recurseNestedFields = ({ currentDepth = 0, data, depth, + draft, fieldPromises, fields, findMany, @@ -49,6 +51,7 @@ export const recurseNestedFields = ({ currentDepth, depth, doc: data as any, // Looks like it's only needed for hooks and access control, so doesn't matter what we pass here right now + draft, fallbackLocale: req.fallbackLocale, fieldPromises, fields, diff --git a/packages/richtext-slate/src/data/populate.ts b/packages/richtext-slate/src/data/populate.ts index 684936a93..663503ac2 100644 --- a/packages/richtext-slate/src/data/populate.ts +++ b/packages/richtext-slate/src/data/populate.ts @@ -1,12 +1,15 @@ import type { PayloadRequestWithData } from 'payload/types' import type { Collection, Field, RichTextField } from 'payload/types' +import { createDataloaderCacheKey } from 'payload/utilities' + import type { AdapterArguments } from '../types.js' type Arguments = { currentDepth?: number data: unknown depth: number + draft: boolean field: RichTextField key: number | string overrideAccess?: boolean @@ -20,6 +23,7 @@ export const populate = async ({ currentDepth, data, depth, + draft, key, overrideAccess, req, @@ -32,17 +36,18 @@ export const populate = async ({ const dataRef = data as Record const doc = await req.payloadDataLoader.load( - JSON.stringify([ - req.transactionID, - collection.config.slug, - id, + createDataloaderCacheKey({ + collectionSlug: collection.config.slug, + currentDepth: currentDepth + 1, depth, - currentDepth + 1, - req.locale, - req.fallbackLocale, - typeof overrideAccess === 'undefined' ? false : overrideAccess, + docID: id, + draft, + fallbackLocale: req.locale, + locale: req.fallbackLocale, + overrideAccess: typeof overrideAccess === 'undefined' ? false : overrideAccess, showHiddenFields, - ]), + transactionID: req.transactionID, + }), ) if (doc) { diff --git a/packages/richtext-slate/src/data/recurseNestedFields.ts b/packages/richtext-slate/src/data/recurseNestedFields.ts index 95b01525c..76fe3da25 100644 --- a/packages/richtext-slate/src/data/recurseNestedFields.ts +++ b/packages/richtext-slate/src/data/recurseNestedFields.ts @@ -9,6 +9,7 @@ type NestedRichTextFieldsArgs = { currentDepth?: number data: unknown depth: number + draft: boolean fields: Field[] overrideAccess: boolean populationPromises: Promise[] @@ -20,6 +21,7 @@ export const recurseNestedFields = ({ currentDepth = 0, data, depth, + draft, fields, overrideAccess = false, populationPromises, @@ -41,6 +43,7 @@ export const recurseNestedFields = ({ currentDepth, data: data[field.name], depth, + draft, field, key: i, overrideAccess, @@ -61,6 +64,7 @@ export const recurseNestedFields = ({ currentDepth, data: data[field.name], depth, + draft, field, key: i, overrideAccess, @@ -85,6 +89,7 @@ export const recurseNestedFields = ({ currentDepth, data: data[field.name], depth, + draft, field, key: 'value', overrideAccess, @@ -104,6 +109,7 @@ export const recurseNestedFields = ({ currentDepth, data, depth, + draft, field, key: field.name, overrideAccess, @@ -118,6 +124,7 @@ export const recurseNestedFields = ({ currentDepth, data: data[field.name], depth, + draft, fields: field.fields, overrideAccess, populationPromises, @@ -129,6 +136,7 @@ export const recurseNestedFields = ({ currentDepth, data, depth, + draft, fields: field.fields, overrideAccess, populationPromises, @@ -142,6 +150,7 @@ export const recurseNestedFields = ({ currentDepth, data, depth, + draft, fields: tab.fields, overrideAccess, populationPromises, @@ -158,6 +167,7 @@ export const recurseNestedFields = ({ currentDepth, data: data[field.name][i], depth, + draft, fields: block.fields, overrideAccess, populationPromises, @@ -174,6 +184,7 @@ export const recurseNestedFields = ({ currentDepth, data: data[field.name][i], depth, + draft, fields: field.fields, overrideAccess, populationPromises, @@ -191,6 +202,7 @@ export const recurseNestedFields = ({ children: node.children, currentDepth, depth, + draft, field, overrideAccess, populationPromises, diff --git a/packages/richtext-slate/src/data/richTextRelationshipPromise.ts b/packages/richtext-slate/src/data/richTextRelationshipPromise.ts index 9b5d6f271..8d2dec7b0 100644 --- a/packages/richtext-slate/src/data/richTextRelationshipPromise.ts +++ b/packages/richtext-slate/src/data/richTextRelationshipPromise.ts @@ -11,6 +11,7 @@ type RecurseRichTextArgs = { children: unknown[] currentDepth: number depth: number + draft: boolean field: RichTextField overrideAccess: boolean populationPromises: Promise[] @@ -22,6 +23,7 @@ export const recurseRichText = ({ children, currentDepth = 0, depth, + draft, field, overrideAccess = false, populationPromises, @@ -45,6 +47,7 @@ export const recurseRichText = ({ currentDepth, data: element, depth, + draft, field, key: 'value', overrideAccess, @@ -61,6 +64,7 @@ export const recurseRichText = ({ currentDepth, data: element.fields || {}, depth, + draft, fields: field.admin.upload.collections[element.relationTo].fields, overrideAccess, populationPromises, @@ -82,6 +86,7 @@ export const recurseRichText = ({ currentDepth, data: element.doc, depth, + draft, field, key: 'value', overrideAccess, @@ -97,6 +102,7 @@ export const recurseRichText = ({ currentDepth, data: element.fields || {}, depth, + draft, fields: field.admin?.link?.fields, overrideAccess, populationPromises, @@ -111,6 +117,7 @@ export const recurseRichText = ({ children: element.children, currentDepth, depth, + draft, field, overrideAccess, populationPromises, @@ -125,6 +132,7 @@ export const recurseRichText = ({ export const richTextRelationshipPromise = ({ currentDepth, depth, + draft, field, overrideAccess, populationPromises, @@ -136,6 +144,7 @@ export const richTextRelationshipPromise = ({ children: siblingDoc[field.name] as unknown[], currentDepth, depth, + draft, field, overrideAccess, populationPromises, diff --git a/packages/richtext-slate/src/index.tsx b/packages/richtext-slate/src/index.tsx index dc89bb68b..4305e1f10 100644 --- a/packages/richtext-slate/src/index.tsx +++ b/packages/richtext-slate/src/index.tsx @@ -64,6 +64,7 @@ export function slateEditor( context, currentDepth, depth, + draft, field, fieldPromises, findMany, @@ -84,6 +85,7 @@ export function slateEditor( context, currentDepth, depth, + draft, field, fieldPromises, findMany, diff --git a/packages/richtext-slate/src/types.ts b/packages/richtext-slate/src/types.ts index 618119ed9..4da723d1a 100644 --- a/packages/richtext-slate/src/types.ts +++ b/packages/richtext-slate/src/types.ts @@ -1,4 +1,4 @@ -import type { Config, SanitizedConfig } from 'payload/config' +import type { SanitizedConfig } from 'payload/config' import type { Field, RichTextFieldProps } from 'payload/types' import type { Editor } from 'slate' diff --git a/test/collections-graphql/config.ts b/test/collections-graphql/config.ts index fd7312801..8f343b00e 100644 --- a/test/collections-graphql/config.ts +++ b/test/collections-graphql/config.ts @@ -352,6 +352,9 @@ export default buildConfigWithDefaults({ relationTo: 'cyclical-relationship', }, ], + versions: { + drafts: true, + }, }, ], graphQL: { diff --git a/test/collections-graphql/int.spec.ts b/test/collections-graphql/int.spec.ts index d1e72e6e2..7513ef5ae 100644 --- a/test/collections-graphql/int.spec.ts +++ b/test/collections-graphql/int.spec.ts @@ -1001,6 +1001,79 @@ describe('collections-graphql', () => { }) }) + it('should query correctly with draft argument', async () => { + const publishValue = '1' + const draftValue = '2' + + // publish doc + const newDoc = await payload.create({ + collection: 'cyclical-relationship', + draft: false, + data: { + title: publishValue, + }, + }) + + // create cyclical relationship + await payload.update({ + collection: 'cyclical-relationship', + id: newDoc.id, + data: { + relationToSelf: newDoc.id, + }, + }) + + // save new version + await payload.update({ + collection: 'cyclical-relationship', + id: newDoc.id, + draft: true, + data: { + title: draftValue, + }, + }) + + const draftParentPublishedChild = `{ + CyclicalRelationships(draft: true) { + docs { + title + relationToSelf(draft: false) { + title + } + } + } + }` + const res1 = await restClient + .GRAPHQL_POST({ + body: JSON.stringify({ query: draftParentPublishedChild }), + }) + .then((res) => res.json()) + + const queriedDoc = res1.data.CyclicalRelationships.docs[0] + expect(queriedDoc.title).toEqual(draftValue) + expect(queriedDoc.relationToSelf.title).toEqual(publishValue) + + const publishedParentDraftChild = `{ + CyclicalRelationships(draft: false) { + docs { + title + relationToSelf(draft: true) { + title + } + } + } + }` + const res2 = await restClient + .GRAPHQL_POST({ + body: JSON.stringify({ query: publishedParentDraftChild }), + }) + .then((res) => res.json()) + + const queriedDoc2 = res2.data.CyclicalRelationships.docs[0] + expect(queriedDoc2.title).toEqual(publishValue) + expect(queriedDoc2.relationToSelf.title).toEqual(draftValue) + }) + describe('Error Handler', () => { it('should return have an array of errors when making a bad request', async () => { const query = `query {