Skip to content

Commit

Permalink
fix: threads draft arg through for child resolvers in GraphQL queries (
Browse files Browse the repository at this point in the history
  • Loading branch information
JarrodMFlesch committed May 4, 2024
1 parent 56bedb8 commit 51149c7
Show file tree
Hide file tree
Showing 50 changed files with 375 additions and 92 deletions.
2 changes: 1 addition & 1 deletion packages/graphql/src/resolvers/collections/count.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 14 additions & 4 deletions packages/graphql/src/resolvers/collections/delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,37 @@ import type { Context } from '../types.js'
export type Resolver<TSlug extends keyof GeneratedTypes['collections']> = (
_: unknown,
args: {
draft: boolean
fallbackLocale?: string
id: number | string
locale?: string
},
context: {
req: PayloadRequestWithData
},
) => Promise<GeneratedTypes['collections'][TSlug]>

export default function getDeleteResolver<TSlug extends keyof GeneratedTypes['collections']>(
export function getDeleteResolver<TSlug extends keyof GeneratedTypes['collections']>(
collection: Collection,
): Resolver<TSlug> {
async function resolver(_, args, context: Context) {
return async function resolver(_, args, context: Context) {
let { req } = context
const locale = req.locale
const fallbackLocale = req.fallbackLocale
req = isolateObjectProperty(req, 'locale')
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 = {
Expand All @@ -42,6 +54,4 @@ export default function getDeleteResolver<TSlug extends keyof GeneratedTypes['co

return result
}

return resolver
}
12 changes: 11 additions & 1 deletion packages/graphql/src/resolvers/collections/find.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export type Resolver = (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
) => Promise<PaginatedDocs<any>>

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
Expand All @@ -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 = {
Expand Down
12 changes: 11 additions & 1 deletion packages/graphql/src/resolvers/collections/findByID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export type Resolver<T> = (
},
) => Promise<T>

export default function findByIDResolver<T extends keyof GeneratedTypes['collections']>(
export function findByIDResolver<T extends keyof GeneratedTypes['collections']>(
collection: Collection,
): Resolver<GeneratedTypes['collections'][T]> {
return async function resolver(_, args, context: Context) {
Expand All @@ -31,6 +31,16 @@ export default function findByIDResolver<T extends keyof GeneratedTypes['collect
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 = {
Expand Down
5 changes: 2 additions & 3 deletions packages/graphql/src/resolvers/collections/findVersionByID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import type { Context } from '../types.js'
export type Resolver<T extends TypeWithID = any> = (
_: unknown,
args: {
draft: boolean
fallbackLocale?: string
id: number | string
locale?: string
Expand All @@ -20,7 +19,7 @@ export type Resolver<T extends TypeWithID = any> = (
},
) => Promise<TypeWithVersion<T>>

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
Expand All @@ -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'),
}

Expand Down
17 changes: 13 additions & 4 deletions packages/graphql/src/resolvers/collections/findVersions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import type { Context } from '../types.js'
export type Resolver = (
_: unknown,
args: {
draft?: boolean
fallbackLocale?: string
limit?: number
locale?: string
Expand All @@ -22,15 +23,25 @@ export type Resolver = (
},
) => Promise<PaginatedDocs<any>>

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
req = isolateObjectProperty(req, 'locale')
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 = {
Expand All @@ -47,6 +58,4 @@ export default function findVersionsResolver(collection: Collection): Resolver {

return result
}

return resolver
}
19 changes: 14 additions & 5 deletions packages/graphql/src/resolvers/collections/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export type Resolver<TSlug extends keyof GeneratedTypes['collections']> = (
autosave: boolean
data: GeneratedTypes['collections'][TSlug]
draft: boolean
fallbackLocale?: string
id: number | string
locale?: string
},
Expand All @@ -21,24 +22,34 @@ export type Resolver<TSlug extends keyof GeneratedTypes['collections']> = (
},
) => Promise<GeneratedTypes['collections'][TSlug]>

export default function updateResolver<TSlug extends keyof GeneratedTypes['collections']>(
export function updateResolver<TSlug extends keyof GeneratedTypes['collections']>(
collection: Collection,
): Resolver<TSlug> {
async function resolver(_, args, context: Context) {
return async function resolver(_, args, context: Context) {
let { req } = context
const locale = req.locale
const fallbackLocale = req.fallbackLocale
req = isolateObjectProperty(req, 'locale')
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 = {
id: args.id,
autosave: args.autosave,
collection,
data: args.data,
data: args.data as any,
depth: 0,
draft: args.draft,
req: isolateObjectProperty(req, 'transactionID'),
Expand All @@ -48,6 +59,4 @@ export default function updateResolver<TSlug extends keyof GeneratedTypes['colle

return result
}

return resolver
}
78 changes: 47 additions & 31 deletions packages/graphql/src/schema/buildObjectType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import {
} from 'graphql'
import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars'
import { tabHasName } from 'payload/types'
import { toWords } from 'payload/utilities'
import { createDataloaderCacheKey, toWords } from 'payload/utilities'

import type { Context } from '../resolvers/types.js'

Expand Down Expand Up @@ -320,13 +320,24 @@ function buildObjectType({
type = type || newlyCreatedBlockType

const relationshipArgs: {
draft?: unknown
fallbackLocale?: unknown
limit?: unknown
locale?: unknown
page?: unknown
where?: unknown
} = {}

const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [relationTo]).some(
(relation) => graphqlResult.collections[relation].config.versions?.drafts,
)

if (relationsUseDrafts) {
relationshipArgs.draft = {
type: GraphQLBoolean,
}
}

if (config.localization) {
relationshipArgs.locale = {
type: graphqlResult.types.localeInputType,
Expand All @@ -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 = []
Expand All @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -479,6 +493,7 @@ function buildObjectType({
editor?.populationPromises({
context,
depth,
draft: args.draft,
field,
fieldPromises,
findMany: false,
Expand Down Expand Up @@ -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
Expand Down
14 changes: 7 additions & 7 deletions packages/graphql/src/schema/initCollections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Loading

0 comments on commit 51149c7

Please sign in to comment.