fix: cascade graphql locales through relationships (#6166)

This commit is contained in:
Jarrod Flesch
2024-05-03 08:33:53 -04:00
committed by GitHub
parent 27ea117731
commit e25814e1ee
13 changed files with 1244 additions and 71 deletions

7
.vscode/launch.json vendored
View File

@@ -58,6 +58,13 @@
"PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER": "s3" "PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER": "s3"
} }
}, },
{
"command": "node --no-deprecation test/dev.js collections-graphql",
"cwd": "${workspaceFolder}",
"name": "Run Dev GraphQL",
"request": "launch",
"type": "node-terminal"
},
{ {
"command": "node --no-deprecation test/dev.js fields", "command": "node --no-deprecation test/dev.js fields",
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",

View File

@@ -28,6 +28,7 @@ export default function countResolver(collection: Collection): Resolver {
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = fallbackLocale req.fallbackLocale = fallbackLocale
context.req = req
const options = { const options = {
collection, collection,

View File

@@ -29,6 +29,7 @@ export default function getDeleteResolver<TSlug extends keyof GeneratedTypes['co
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
id: args.id, id: args.id,

View File

@@ -29,6 +29,7 @@ export default function duplicateResolver<T extends keyof GeneratedTypes['collec
const fallbackLocale = req.fallbackLocale const fallbackLocale = req.fallbackLocale
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
id: args.id, id: args.id,

View File

@@ -34,6 +34,7 @@ export default function findResolver(collection: Collection): Resolver {
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
collection, collection,

View File

@@ -31,6 +31,7 @@ export default function findByIDResolver<T extends keyof GeneratedTypes['collect
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
id: args.id, id: args.id,

View File

@@ -29,6 +29,7 @@ export default function findVersionByIDResolver(collection: Collection): Resolve
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
id: args.id, id: args.id,

View File

@@ -31,6 +31,7 @@ export default function findVersionsResolver(collection: Collection): Resolver {
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
collection, collection,

View File

@@ -32,6 +32,7 @@ export default function updateResolver<TSlug extends keyof GeneratedTypes['colle
req = isolateObjectProperty(req, 'fallbackLocale') req = isolateObjectProperty(req, 'fallbackLocale')
req.locale = args.locale || locale req.locale = args.locale || locale
req.fallbackLocale = args.fallbackLocale || fallbackLocale req.fallbackLocale = args.fallbackLocale || fallbackLocale
context.req = req
const options = { const options = {
id: args.id, id: args.id,

View File

@@ -36,6 +36,10 @@ export const pointSlug = 'point'
export const errorOnHookSlug = 'error-on-hooks' export const errorOnHookSlug = 'error-on-hooks'
export default buildConfigWithDefaults({ export default buildConfigWithDefaults({
localization: {
defaultLocale: 'en',
locales: ['en', 'es'],
},
collections: [ collections: [
{ {
access: openAccess, access: openAccess,
@@ -333,6 +337,22 @@ export default buildConfigWithDefaults({
], ],
slug: 'content-type', slug: 'content-type',
}, },
{
slug: 'cyclical-relationship',
access: openAccess,
fields: [
{
name: 'title',
type: 'text',
localized: true,
},
{
name: 'relationToSelf',
type: 'relationship',
relationTo: 'cyclical-relationship',
},
],
},
], ],
graphQL: { graphQL: {
queries: (GraphQL) => { queries: (GraphQL) => {

View File

@@ -960,6 +960,44 @@ describe('collections-graphql', () => {
expect(docs[0].relationHasManyField).toHaveLength(0) expect(docs[0].relationHasManyField).toHaveLength(0)
}) })
it('should query relationships with locale', async () => {
const newDoc = await payload.create({
collection: 'cyclical-relationship',
data: {
title: {
en: 'English title',
es: 'Spanish title',
},
},
locale: '*',
})
await payload.update({
collection: 'cyclical-relationship',
id: newDoc.id,
data: {
relationToSelf: newDoc.id,
},
})
const query = `query {
CyclicalRelationships(locale: es) {
docs {
title
relationToSelf {
title
}
}
}
}`
const res = await restClient
.GRAPHQL_POST({ body: JSON.stringify({ query }) })
.then((res) => res.json())
const queriedDoc = res.data.CyclicalRelationships.docs[0]
expect(queriedDoc.title).toEqual(queriedDoc.relationToSelf.title)
})
}) })
}) })

View File

@@ -1,4 +1,5 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */
/** /**
* This file was automatically generated by Payload. * This file was automatically generated by Payload.
* DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,
@@ -8,99 +9,226 @@
export interface Config { export interface Config {
collections: { collections: {
users: User users: User
point: Point
posts: Post posts: Post
'custom-ids': CustomId 'custom-ids': CustomId
relation: Relation relation: Relation
dummy: Dummy dummy: Dummy
'error-on-hooks': ErrorOnHook
'payload-api-test-ones': PayloadApiTestOne
'payload-api-test-twos': PayloadApiTestTwo
'content-type': ContentType
'cyclical-relationship': CyclicalRelationship
'payload-preferences': PayloadPreference
'payload-migrations': PayloadMigration
} }
globals: {} globals: {}
locale: 'en' | 'es'
user: User & {
collection: 'users'
}
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "users".
*/
export interface User { export interface User {
id: string id: string
updatedAt: string updatedAt: string
createdAt: string createdAt: string
email?: string email: string
resetPasswordToken?: string resetPasswordToken?: string | null
resetPasswordExpiration?: string resetPasswordExpiration?: string | null
loginAttempts?: number salt?: string | null
lockUntil?: string hash?: string | null
password?: string loginAttempts?: number | null
lockUntil?: string | null
password?: string | null
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "point".
*/
export interface Point {
id: string
/**
* @minItems 2
* @maxItems 2
*/
point?: [number, number] | null
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "posts".
*/
export interface Post { export interface Post {
id: string id: string
title?: string title?: string | null
description?: string description?: string | null
number?: number number?: number | null
min?: number min?: number | null
relationField?: string | Relation relationField?: (string | null) | Relation
relationToCustomID?: number | CustomId relationToCustomID?: (number | null) | CustomId
relationHasManyField?: string[] | Relation[] relationHasManyField?: (string | Relation)[] | null
relationMultiRelationTo?: relationMultiRelationTo?:
| { | ({
value: string | Relation
relationTo: 'relation' relationTo: 'relation'
} value: string | Relation
| { } | null)
value: string | Dummy | ({
relationTo: 'dummy' relationTo: 'dummy'
} value: string | Dummy
} | null)
relationMultiRelationToHasMany?: relationMultiRelationToHasMany?:
| ( | (
| { | {
value: string
relationTo: 'relation' relationTo: 'relation'
value: string | Relation
} }
| { | {
value: string
relationTo: 'dummy'
}
)[]
| (
| {
value: Relation
relationTo: 'relation'
}
| {
value: Dummy
relationTo: 'dummy' relationTo: 'dummy'
value: string | Dummy
} }
)[] )[]
| null
A1?: { A1?: {
A2?: string A2?: string | null
} }
B1?: { B1?: {
B2?: string B2?: string | null
} }
C1?: { C1?: {
C2Text?: string | null
C2?: { C2?: {
C3?: string C3?: string | null
} }
} }
D1: { D1: {
D2?: { D2?: {
D3?: { D3?: {
D4?: string D4?: string | null
} }
} }
} }
updatedAt: string updatedAt: string
createdAt: string createdAt: string
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "relation".
*/
export interface Relation { export interface Relation {
id: string id: string
name?: string name?: string | null
updatedAt: string updatedAt: string
createdAt: string createdAt: string
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "custom-ids".
*/
export interface CustomId { export interface CustomId {
id: number id: number
title?: string title?: string | null
updatedAt: string updatedAt: string
createdAt: string createdAt: string
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "dummy".
*/
export interface Dummy { export interface Dummy {
id: string id: string
name?: string name?: string | null
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "error-on-hooks".
*/
export interface ErrorOnHook {
id: string
title?: string | null
errorBeforeChange?: boolean | null
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-api-test-ones".
*/
export interface PayloadApiTestOne {
id: string
payloadAPI?: string | null
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-api-test-twos".
*/
export interface PayloadApiTestTwo {
id: string
payloadAPI?: string | null
relation?: (string | null) | PayloadApiTestOne
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "content-type".
*/
export interface ContentType {
id: string
contentType?: string | null
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "cyclical-relationship".
*/
export interface CyclicalRelationship {
id: string
title?: string | null
relationToSelf?: (string | null) | CyclicalRelationship
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-preferences".
*/
export interface PayloadPreference {
id: string
user: {
relationTo: 'users'
value: string | User
}
key?: string | null
value?:
| {
[k: string]: unknown
}
| unknown[]
| string
| number
| boolean
| null
updatedAt: string
createdAt: string
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-migrations".
*/
export interface PayloadMigration {
id: string
name?: string | null
batch?: number | null
updatedAt: string updatedAt: string
createdAt: string createdAt: string
} }

File diff suppressed because it is too large Load Diff