fix(graphql): respect draft: true when querying joins (#11869)

The same as https://github.com/payloadcms/payload/pull/11763 but also
for GraphQL. The previous fix was working only for the Local API and
REST API due to a different method for querying joins in GraphQL.
This commit is contained in:
Sasha
2025-04-01 21:41:47 +03:00
committed by GitHub
parent 4ac6d21ef6
commit e5690fcab9
4 changed files with 72 additions and 8 deletions

View File

@@ -5,6 +5,11 @@ export const versionsSlug = 'versions'
export const Versions: CollectionConfig = {
slug: versionsSlug,
fields: [
{
name: 'title',
type: 'text',
required: true,
},
{
name: 'category',
relationTo: 'categories',

View File

@@ -569,7 +569,7 @@ describe('Joins Field', () => {
const version = await payload.create({
collection: 'versions',
data: { categoryVersion: category.id },
data: { title: 'version', categoryVersion: category.id },
})
const res = await payload.find({ collection: 'categories-versions', draft: false })
@@ -582,7 +582,7 @@ describe('Joins Field', () => {
const version = await payload.create({
collection: 'versions',
data: { categoryVersions: [category.id] },
data: { title: 'version', categoryVersions: [category.id] },
})
const res = await payload.find({ collection: 'categories-versions', draft: false })
@@ -595,7 +595,7 @@ describe('Joins Field', () => {
const version = await payload.create({
collection: 'versions',
data: { categoryVersion: category.id },
data: { title: 'version', categoryVersion: category.id },
})
const res = await payload.find({
@@ -615,7 +615,14 @@ describe('Joins Field', () => {
const version = await payload.create({
collection: 'versions',
data: { _status: 'draft', categoryVersion: category.id },
data: { title: 'original-title', _status: 'draft', categoryVersion: category.id },
draft: true,
})
await payload.update({
collection: 'versions',
id: version.id,
data: { title: 'updated-title' },
draft: true,
})
@@ -625,6 +632,7 @@ describe('Joins Field', () => {
})
expect(res.docs[0].relatedVersions.docs[0].id).toBe(version.id)
expect(res.docs[0].relatedVersions.docs[0].title).toBe('updated-title')
})
it('should populate joins when versions on both sides draft true payload.db.queryDrafts', async () => {
@@ -632,7 +640,7 @@ describe('Joins Field', () => {
const version = await payload.create({
collection: 'versions',
data: { categoryVersions: [category.id] },
data: { categoryVersions: [category.id], title: 'version' },
})
const res = await payload.find({
@@ -932,6 +940,52 @@ describe('Joins Field', () => {
)
})
it('should populate joins with hasMany when on both sides documents are in draft', async () => {
const category = await payload.create({
collection: 'categories-versions',
data: { _status: 'draft' },
draft: true,
})
const version = await payload.create({
collection: 'versions',
data: { _status: 'draft', title: 'original-title', categoryVersion: category.id },
draft: true,
})
await payload.update({
collection: 'versions',
draft: true,
id: version.id,
data: { title: 'updated-title' },
})
const query = `query {
CategoriesVersions(draft: true) {
docs {
relatedVersions(
limit: 1
) {
docs {
id,
title
}
hasNextPage
}
}
}
}`
const res = await restClient
.GRAPHQL_POST({ body: JSON.stringify({ query }) })
.then((res) => res.json())
expect(res.data.CategoriesVersions.docs[0].relatedVersions.docs[0].id).toBe(version.id)
expect(res.data.CategoriesVersions.docs[0].relatedVersions.docs[0].title).toBe(
'updated-title',
)
})
it('should have simple paginate for joins inside groups', async () => {
const queryWithLimit = `query {
Categories(where: {

View File

@@ -54,6 +54,7 @@ export type SupportedTimezones =
| 'Asia/Singapore'
| 'Asia/Tokyo'
| 'Asia/Seoul'
| 'Australia/Brisbane'
| 'Australia/Sydney'
| 'Pacific/Guam'
| 'Pacific/Noumea'
@@ -464,6 +465,7 @@ export interface Singular {
*/
export interface Version {
id: string;
title: string;
category?: (string | null) | Category;
categoryVersion?: (string | null) | CategoriesVersion;
categoryVersions?: (string | CategoriesVersion)[] | null;
@@ -999,6 +1001,7 @@ export interface UploadsSelect<T extends boolean = true> {
* via the `definition` "versions_select".
*/
export interface VersionsSelect<T extends boolean = true> {
title?: T;
category?: T;
categoryVersion?: T;
categoryVersions?: T;
@@ -1232,7 +1235,6 @@ export interface Auth {
declare module 'payload' {
// @ts-ignore
// @ts-ignore
export interface GeneratedTypes extends Config {}
}
}