@payloadcms/graphql 3.0.0-canary.fb81f02 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.js +51 -2
- package/dist/bin/index.js +2 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/packages/graphql-query-complexity/QueryComplexity.d.ts +2 -2
- package/dist/packages/graphql-query-complexity/QueryComplexity.d.ts.map +1 -1
- package/dist/packages/graphql-query-complexity/QueryComplexity.js +6 -6
- package/dist/packages/graphql-query-complexity/QueryComplexity.js.map +1 -1
- package/dist/packages/graphql-query-complexity/createComplexityRule.d.ts +1 -1
- package/dist/packages/graphql-query-complexity/createComplexityRule.d.ts.map +1 -1
- package/dist/packages/graphql-query-complexity/createComplexityRule.js +1 -1
- package/dist/packages/graphql-query-complexity/createComplexityRule.js.map +1 -1
- package/dist/packages/graphql-type-json/index.js +4 -4
- package/dist/packages/graphql-type-json/index.js.map +1 -1
- package/dist/resolvers/auth/access.d.ts +1 -2
- package/dist/resolvers/auth/access.d.ts.map +1 -1
- package/dist/resolvers/auth/access.js +2 -3
- package/dist/resolvers/auth/access.js.map +1 -1
- package/dist/resolvers/auth/forgotPassword.d.ts +1 -2
- package/dist/resolvers/auth/forgotPassword.d.ts.map +1 -1
- package/dist/resolvers/auth/forgotPassword.js +1 -2
- package/dist/resolvers/auth/forgotPassword.js.map +1 -1
- package/dist/resolvers/auth/init.d.ts +1 -2
- package/dist/resolvers/auth/init.d.ts.map +1 -1
- package/dist/resolvers/auth/init.js +1 -2
- package/dist/resolvers/auth/init.js.map +1 -1
- package/dist/resolvers/auth/login.d.ts +1 -2
- package/dist/resolvers/auth/login.d.ts.map +1 -1
- package/dist/resolvers/auth/login.js +3 -4
- package/dist/resolvers/auth/login.js.map +1 -1
- package/dist/resolvers/auth/logout.d.ts +1 -2
- package/dist/resolvers/auth/logout.d.ts.map +1 -1
- package/dist/resolvers/auth/logout.js +4 -4
- package/dist/resolvers/auth/logout.js.map +1 -1
- package/dist/resolvers/auth/me.d.ts +1 -2
- package/dist/resolvers/auth/me.d.ts.map +1 -1
- package/dist/resolvers/auth/me.js +1 -2
- package/dist/resolvers/auth/me.js.map +1 -1
- package/dist/resolvers/auth/refresh.d.ts +1 -2
- package/dist/resolvers/auth/refresh.d.ts.map +1 -1
- package/dist/resolvers/auth/refresh.js +3 -4
- package/dist/resolvers/auth/refresh.js.map +1 -1
- package/dist/resolvers/auth/resetPassword.d.ts +1 -2
- package/dist/resolvers/auth/resetPassword.d.ts.map +1 -1
- package/dist/resolvers/auth/resetPassword.js +9 -6
- package/dist/resolvers/auth/resetPassword.js.map +1 -1
- package/dist/resolvers/auth/unlock.d.ts +1 -2
- package/dist/resolvers/auth/unlock.d.ts.map +1 -1
- package/dist/resolvers/auth/unlock.js +1 -2
- package/dist/resolvers/auth/unlock.js.map +1 -1
- package/dist/resolvers/auth/verifyEmail.d.ts +1 -2
- package/dist/resolvers/auth/verifyEmail.d.ts.map +1 -1
- package/dist/resolvers/auth/verifyEmail.js +7 -4
- package/dist/resolvers/auth/verifyEmail.js.map +1 -1
- package/dist/resolvers/collections/create.d.ts +1 -1
- package/dist/resolvers/collections/create.d.ts.map +1 -1
- package/dist/resolvers/collections/create.js +1 -1
- package/dist/resolvers/collections/create.js.map +1 -1
- package/dist/resolvers/collections/delete.d.ts.map +1 -1
- package/dist/resolvers/collections/delete.js +6 -2
- package/dist/resolvers/collections/delete.js.map +1 -1
- package/dist/resolvers/collections/duplicate.d.ts +1 -1
- package/dist/resolvers/collections/duplicate.d.ts.map +1 -1
- package/dist/resolvers/collections/duplicate.js +1 -1
- package/dist/resolvers/collections/duplicate.js.map +1 -1
- package/dist/resolvers/collections/find.d.ts.map +1 -1
- package/dist/resolvers/collections/find.js +6 -2
- package/dist/resolvers/collections/find.js.map +1 -1
- package/dist/resolvers/collections/findByID.d.ts.map +1 -1
- package/dist/resolvers/collections/findByID.js +6 -2
- package/dist/resolvers/collections/findByID.js.map +1 -1
- package/dist/resolvers/collections/findVersions.d.ts.map +1 -1
- package/dist/resolvers/collections/findVersions.js +6 -2
- package/dist/resolvers/collections/findVersions.js.map +1 -1
- package/dist/resolvers/collections/restoreVersion.d.ts +1 -1
- package/dist/resolvers/collections/restoreVersion.d.ts.map +1 -1
- package/dist/resolvers/collections/restoreVersion.js +1 -1
- package/dist/resolvers/collections/restoreVersion.js.map +1 -1
- package/dist/resolvers/collections/update.d.ts.map +1 -1
- package/dist/resolvers/collections/update.js +6 -2
- package/dist/resolvers/collections/update.js.map +1 -1
- package/dist/resolvers/globals/findOne.d.ts +1 -1
- package/dist/resolvers/globals/findOne.d.ts.map +1 -1
- package/dist/resolvers/globals/findOne.js +7 -3
- package/dist/resolvers/globals/findOne.js.map +1 -1
- package/dist/resolvers/globals/findVersionByID.d.ts +1 -1
- package/dist/resolvers/globals/findVersionByID.d.ts.map +1 -1
- package/dist/resolvers/globals/findVersionByID.js +7 -3
- package/dist/resolvers/globals/findVersionByID.js.map +1 -1
- package/dist/resolvers/globals/findVersions.d.ts +1 -1
- package/dist/resolvers/globals/findVersions.d.ts.map +1 -1
- package/dist/resolvers/globals/findVersions.js +1 -1
- package/dist/resolvers/globals/findVersions.js.map +1 -1
- package/dist/resolvers/globals/index.d.ts +5 -5
- package/dist/resolvers/globals/index.d.ts.map +1 -1
- package/dist/resolvers/globals/index.js +5 -5
- package/dist/resolvers/globals/index.js.map +1 -1
- package/dist/resolvers/globals/restoreVersion.d.ts +1 -1
- package/dist/resolvers/globals/restoreVersion.d.ts.map +1 -1
- package/dist/resolvers/globals/restoreVersion.js +1 -1
- package/dist/resolvers/globals/restoreVersion.js.map +1 -1
- package/dist/resolvers/globals/update.d.ts +1 -1
- package/dist/resolvers/globals/update.d.ts.map +1 -1
- package/dist/resolvers/globals/update.js +7 -3
- package/dist/resolvers/globals/update.js.map +1 -1
- package/dist/schema/buildFallbackLocaleInputType.d.ts +1 -2
- package/dist/schema/buildFallbackLocaleInputType.d.ts.map +1 -1
- package/dist/schema/buildFallbackLocaleInputType.js +2 -3
- package/dist/schema/buildFallbackLocaleInputType.js.map +1 -1
- package/dist/schema/buildLocaleInputType.d.ts +1 -2
- package/dist/schema/buildLocaleInputType.d.ts.map +1 -1
- package/dist/schema/buildLocaleInputType.js +2 -3
- package/dist/schema/buildLocaleInputType.js.map +1 -1
- package/dist/schema/buildMutationInputType.d.ts.map +1 -1
- package/dist/schema/buildMutationInputType.js +58 -14
- package/dist/schema/buildMutationInputType.js.map +1 -1
- package/dist/schema/buildObjectType.d.ts.map +1 -1
- package/dist/schema/buildObjectType.js +262 -86
- package/dist/schema/buildObjectType.js.map +1 -1
- package/dist/schema/buildPoliciesType.d.ts +1 -1
- package/dist/schema/buildPoliciesType.d.ts.map +1 -1
- package/dist/schema/buildPoliciesType.js +5 -3
- package/dist/schema/buildPoliciesType.js.map +1 -1
- package/dist/schema/buildWhereInputType.d.ts +2 -2
- package/dist/schema/buildWhereInputType.d.ts.map +1 -1
- package/dist/schema/buildWhereInputType.js +3 -4
- package/dist/schema/buildWhereInputType.js.map +1 -1
- package/dist/schema/fieldToWhereInputSchemaMap.d.ts +2 -2
- package/dist/schema/fieldToWhereInputSchemaMap.d.ts.map +1 -1
- package/dist/schema/fieldToWhereInputSchemaMap.js +31 -7
- package/dist/schema/fieldToWhereInputSchemaMap.js.map +1 -1
- package/dist/schema/initCollections.d.ts +2 -2
- package/dist/schema/initCollections.d.ts.map +1 -1
- package/dist/schema/initCollections.js +26 -22
- package/dist/schema/initCollections.js.map +1 -1
- package/dist/schema/initGlobals.d.ts +2 -2
- package/dist/schema/initGlobals.d.ts.map +1 -1
- package/dist/schema/initGlobals.js +17 -16
- package/dist/schema/initGlobals.js.map +1 -1
- package/dist/schema/isFieldNullable.d.ts +1 -2
- package/dist/schema/isFieldNullable.d.ts.map +1 -1
- package/dist/schema/isFieldNullable.js +1 -2
- package/dist/schema/isFieldNullable.js.map +1 -1
- package/dist/schema/operators.d.ts +1 -2
- package/dist/schema/operators.d.ts.map +1 -1
- package/dist/schema/operators.js +1 -2
- package/dist/schema/operators.js.map +1 -1
- package/dist/schema/recursivelyBuildNestedPaths.d.ts +2 -2
- package/dist/schema/recursivelyBuildNestedPaths.d.ts.map +1 -1
- package/dist/schema/recursivelyBuildNestedPaths.js +2 -3
- package/dist/schema/recursivelyBuildNestedPaths.js.map +1 -1
- package/dist/schema/withNullableType.d.ts +1 -2
- package/dist/schema/withNullableType.d.ts.map +1 -1
- package/dist/schema/withNullableType.js +1 -2
- package/dist/schema/withNullableType.js.map +1 -1
- package/dist/schema/withOperators.d.ts.map +1 -1
- package/dist/schema/withOperators.js +11 -6
- package/dist/schema/withOperators.js.map +1 -1
- package/dist/utilities/combineParentName.d.ts +1 -2
- package/dist/utilities/combineParentName.d.ts.map +1 -1
- package/dist/utilities/combineParentName.js +2 -3
- package/dist/utilities/combineParentName.js.map +1 -1
- package/dist/utilities/formatName.d.ts +1 -2
- package/dist/utilities/formatName.d.ts.map +1 -1
- package/dist/utilities/formatName.js +1 -2
- package/dist/utilities/formatName.js.map +1 -1
- package/dist/utilities/formatName.spec.js +1 -1
- package/dist/utilities/formatName.spec.js.map +1 -1
- package/dist/utilities/formatOptions.d.ts +1 -2
- package/dist/utilities/formatOptions.d.ts.map +1 -1
- package/dist/utilities/formatOptions.js +2 -3
- package/dist/utilities/formatOptions.js.map +1 -1
- package/license.md +22 -0
- package/package.json +18 -6
- package/dist/utilities/getCheckIfLocaleObject.d.ts +0 -5
- package/dist/utilities/getCheckIfLocaleObject.d.ts.map +0 -1
- package/dist/utilities/getCheckIfLocaleObject.js +0 -3
- package/dist/utilities/getCheckIfLocaleObject.js.map +0 -1
- package/dist/utilities/uppercase.d.ts +0 -3
- package/dist/utilities/uppercase.d.ts.map +0 -1
- package/dist/utilities/uppercase.js +0 -11
- package/dist/utilities/uppercase.js.map +0 -1
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, GraphQLUnionType } from 'graphql';
|
|
2
2
|
import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars';
|
|
3
|
-
import {
|
|
3
|
+
import { combineQueries, createDataloaderCacheKey, MissingEditorProp, toWords } from 'payload';
|
|
4
4
|
import { tabHasName } from 'payload/shared';
|
|
5
5
|
import { GraphQLJSON } from '../packages/graphql-type-json/index.js';
|
|
6
|
-
import combineParentName from '../utilities/combineParentName.js';
|
|
7
|
-
import formatName from '../utilities/formatName.js';
|
|
8
|
-
import formatOptions from '../utilities/formatOptions.js';
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import withNullableType from './withNullableType.js';
|
|
6
|
+
import { combineParentName } from '../utilities/combineParentName.js';
|
|
7
|
+
import { formatName } from '../utilities/formatName.js';
|
|
8
|
+
import { formatOptions } from '../utilities/formatOptions.js';
|
|
9
|
+
import { isFieldNullable } from './isFieldNullable.js';
|
|
10
|
+
import { withNullableType } from './withNullableType.js';
|
|
12
11
|
export function buildObjectType({ name, baseFields = {}, config, fields, forceNullable, graphqlResult, parentName }) {
|
|
13
12
|
const fieldToSchemaMap = {
|
|
14
13
|
array: (objectTypeConfig, field)=>{
|
|
@@ -94,7 +93,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
94
93
|
}),
|
|
95
94
|
collapsible: (objectTypeConfig, field)=>field.fields.reduce((objectTypeConfigWithCollapsibleFields, subField)=>{
|
|
96
95
|
const addSubField = fieldToSchemaMap[subField.type];
|
|
97
|
-
if (addSubField)
|
|
96
|
+
if (addSubField) {
|
|
97
|
+
return addSubField(objectTypeConfigWithCollapsibleFields, subField);
|
|
98
|
+
}
|
|
98
99
|
return objectTypeConfigWithCollapsibleFields;
|
|
99
100
|
}, objectTypeConfig),
|
|
100
101
|
date: (objectTypeConfig, field)=>({
|
|
@@ -130,10 +131,71 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
130
131
|
return {
|
|
131
132
|
...objectTypeConfig,
|
|
132
133
|
[field.name]: {
|
|
133
|
-
type: graphqlResult.types.groupTypes[interfaceName]
|
|
134
|
+
type: graphqlResult.types.groupTypes[interfaceName],
|
|
135
|
+
resolve: (parent, args, context)=>{
|
|
136
|
+
return {
|
|
137
|
+
...parent[field.name],
|
|
138
|
+
_id: parent._id ?? parent.id
|
|
139
|
+
};
|
|
140
|
+
}
|
|
134
141
|
}
|
|
135
142
|
};
|
|
136
143
|
},
|
|
144
|
+
join: (objectTypeConfig, field)=>{
|
|
145
|
+
const joinName = combineParentName(parentName, toWords(field.name, true));
|
|
146
|
+
const joinType = {
|
|
147
|
+
type: new GraphQLObjectType({
|
|
148
|
+
name: joinName,
|
|
149
|
+
fields: {
|
|
150
|
+
docs: {
|
|
151
|
+
type: new GraphQLList(graphqlResult.collections[field.collection].graphQL.type)
|
|
152
|
+
},
|
|
153
|
+
hasNextPage: {
|
|
154
|
+
type: GraphQLBoolean
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}),
|
|
158
|
+
args: {
|
|
159
|
+
limit: {
|
|
160
|
+
type: GraphQLInt
|
|
161
|
+
},
|
|
162
|
+
sort: {
|
|
163
|
+
type: GraphQLString
|
|
164
|
+
},
|
|
165
|
+
where: {
|
|
166
|
+
type: graphqlResult.collections[field.collection].graphQL.whereInputType
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
extensions: {
|
|
170
|
+
complexity: 10
|
|
171
|
+
},
|
|
172
|
+
async resolve (parent, args, context) {
|
|
173
|
+
const { collection } = field;
|
|
174
|
+
const { limit, sort, where } = args;
|
|
175
|
+
const { req } = context;
|
|
176
|
+
const fullWhere = combineQueries(where, {
|
|
177
|
+
[field.on]: {
|
|
178
|
+
equals: parent._id ?? parent.id
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
const results = await req.payload.find({
|
|
182
|
+
collection,
|
|
183
|
+
depth: 0,
|
|
184
|
+
fallbackLocale: req.fallbackLocale,
|
|
185
|
+
limit,
|
|
186
|
+
locale: req.locale,
|
|
187
|
+
req,
|
|
188
|
+
sort,
|
|
189
|
+
where: fullWhere
|
|
190
|
+
});
|
|
191
|
+
return results;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
return {
|
|
195
|
+
...objectTypeConfig,
|
|
196
|
+
[field.name]: joinType
|
|
197
|
+
};
|
|
198
|
+
},
|
|
137
199
|
json: (objectTypeConfig, field)=>({
|
|
138
200
|
...objectTypeConfig,
|
|
139
201
|
[field.name]: {
|
|
@@ -171,17 +233,19 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
171
233
|
const relationshipName = combineParentName(parentName, toWords(field.name, true));
|
|
172
234
|
let type;
|
|
173
235
|
let relationToType = null;
|
|
236
|
+
const graphQLCollections = config.collections.filter((collectionConfig)=>collectionConfig.graphQL !== false);
|
|
174
237
|
if (Array.isArray(relationTo)) {
|
|
175
238
|
relationToType = new GraphQLEnumType({
|
|
176
239
|
name: `${relationshipName}_RelationTo`,
|
|
177
|
-
values: relationTo.reduce((relations, relation)=>({
|
|
240
|
+
values: relationTo.filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).reduce((relations, relation)=>({
|
|
178
241
|
...relations,
|
|
179
242
|
[formatName(relation)]: {
|
|
180
243
|
value: relation
|
|
181
244
|
}
|
|
182
245
|
}), {})
|
|
183
246
|
});
|
|
184
|
-
|
|
247
|
+
// Only pass collections that are GraphQL enabled
|
|
248
|
+
const types = relationTo.filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).map((relation)=>graphqlResult.collections[relation]?.graphQL.type);
|
|
185
249
|
type = new GraphQLObjectType({
|
|
186
250
|
name: `${relationshipName}_Relationship`,
|
|
187
251
|
fields: {
|
|
@@ -191,7 +255,7 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
191
255
|
value: {
|
|
192
256
|
type: new GraphQLUnionType({
|
|
193
257
|
name: relationshipName,
|
|
194
|
-
resolveType (data
|
|
258
|
+
resolveType (data) {
|
|
195
259
|
return graphqlResult.collections[data.collection].graphQL.type.name;
|
|
196
260
|
},
|
|
197
261
|
types
|
|
@@ -210,7 +274,7 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
210
274
|
const relationshipArgs = {};
|
|
211
275
|
const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [
|
|
212
276
|
relationTo
|
|
213
|
-
]).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
|
|
277
|
+
]).filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
|
|
214
278
|
if (relationsUseDrafts) {
|
|
215
279
|
relationshipArgs.draft = {
|
|
216
280
|
type: GraphQLBoolean
|
|
@@ -242,33 +306,36 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
242
306
|
const createPopulationPromise = async (relatedDoc, i)=>{
|
|
243
307
|
let id = relatedDoc;
|
|
244
308
|
let collectionSlug = field.relationTo;
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
id = relatedDoc.value;
|
|
248
|
-
}
|
|
249
|
-
const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
|
|
250
|
-
collectionSlug: collectionSlug,
|
|
251
|
-
currentDepth: 0,
|
|
252
|
-
depth: 0,
|
|
253
|
-
docID: id,
|
|
254
|
-
draft,
|
|
255
|
-
fallbackLocale,
|
|
256
|
-
locale,
|
|
257
|
-
overrideAccess: false,
|
|
258
|
-
showHiddenFields: false,
|
|
259
|
-
transactionID: context.req.transactionID
|
|
260
|
-
}));
|
|
261
|
-
if (result) {
|
|
309
|
+
const isValidGraphQLCollection = isRelatedToManyCollections ? graphQLCollections.some((collection)=>collectionSlug.includes(collection.slug)) : graphQLCollections.some((collection)=>collectionSlug === collection.slug);
|
|
310
|
+
if (isValidGraphQLCollection) {
|
|
262
311
|
if (isRelatedToManyCollections) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
312
|
+
collectionSlug = relatedDoc.relationTo;
|
|
313
|
+
id = relatedDoc.value;
|
|
314
|
+
}
|
|
315
|
+
const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
|
|
316
|
+
collectionSlug: collectionSlug,
|
|
317
|
+
currentDepth: 0,
|
|
318
|
+
depth: 0,
|
|
319
|
+
docID: id,
|
|
320
|
+
draft,
|
|
321
|
+
fallbackLocale,
|
|
322
|
+
locale,
|
|
323
|
+
overrideAccess: false,
|
|
324
|
+
showHiddenFields: false,
|
|
325
|
+
transactionID: context.req.transactionID
|
|
326
|
+
}));
|
|
327
|
+
if (result) {
|
|
328
|
+
if (isRelatedToManyCollections) {
|
|
329
|
+
results[i] = {
|
|
330
|
+
relationTo: collectionSlug,
|
|
331
|
+
value: {
|
|
332
|
+
...result,
|
|
333
|
+
collection: collectionSlug
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
} else {
|
|
337
|
+
results[i] = result;
|
|
338
|
+
}
|
|
272
339
|
}
|
|
273
340
|
}
|
|
274
341
|
};
|
|
@@ -286,29 +353,31 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
286
353
|
relatedCollectionSlug = value.relationTo;
|
|
287
354
|
}
|
|
288
355
|
if (id) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
356
|
+
if (graphQLCollections.some((collection)=>collection.slug === relatedCollectionSlug)) {
|
|
357
|
+
const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
|
|
358
|
+
collectionSlug: relatedCollectionSlug,
|
|
359
|
+
currentDepth: 0,
|
|
360
|
+
depth: 0,
|
|
361
|
+
docID: id,
|
|
362
|
+
draft,
|
|
363
|
+
fallbackLocale,
|
|
364
|
+
locale,
|
|
365
|
+
overrideAccess: false,
|
|
366
|
+
showHiddenFields: false,
|
|
367
|
+
transactionID: context.req.transactionID
|
|
368
|
+
}));
|
|
369
|
+
if (relatedDocument) {
|
|
370
|
+
if (isRelatedToManyCollections) {
|
|
371
|
+
return {
|
|
372
|
+
relationTo: relatedCollectionSlug,
|
|
373
|
+
value: {
|
|
374
|
+
...relatedDocument,
|
|
375
|
+
collection: relatedCollectionSlug
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
return relatedDocument;
|
|
310
380
|
}
|
|
311
|
-
return relatedDocument;
|
|
312
381
|
}
|
|
313
382
|
return null;
|
|
314
383
|
}
|
|
@@ -331,7 +400,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
331
400
|
},
|
|
332
401
|
async resolve (parent, args, context) {
|
|
333
402
|
let depth = config.defaultDepth;
|
|
334
|
-
if (typeof args.depth !== 'undefined')
|
|
403
|
+
if (typeof args.depth !== 'undefined') {
|
|
404
|
+
depth = args.depth;
|
|
405
|
+
}
|
|
335
406
|
if (!field?.editor) {
|
|
336
407
|
throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor
|
|
337
408
|
;
|
|
@@ -372,7 +443,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
372
443
|
}),
|
|
373
444
|
row: (objectTypeConfig, field)=>field.fields.reduce((objectTypeConfigWithRowFields, subField)=>{
|
|
374
445
|
const addSubField = fieldToSchemaMap[subField.type];
|
|
375
|
-
if (addSubField)
|
|
446
|
+
if (addSubField) {
|
|
447
|
+
return addSubField(objectTypeConfigWithRowFields, subField);
|
|
448
|
+
}
|
|
376
449
|
return objectTypeConfigWithRowFields;
|
|
377
450
|
}, objectTypeConfig),
|
|
378
451
|
select: (objectTypeConfig, field)=>{
|
|
@@ -412,7 +485,13 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
412
485
|
return {
|
|
413
486
|
...tabSchema,
|
|
414
487
|
[tab.name]: {
|
|
415
|
-
type: graphqlResult.types.groupTypes[interfaceName]
|
|
488
|
+
type: graphqlResult.types.groupTypes[interfaceName],
|
|
489
|
+
resolve (parent, args, context) {
|
|
490
|
+
return {
|
|
491
|
+
...parent[tab.name],
|
|
492
|
+
_id: parent._id ?? parent.id
|
|
493
|
+
};
|
|
494
|
+
}
|
|
416
495
|
}
|
|
417
496
|
};
|
|
418
497
|
}
|
|
@@ -420,7 +499,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
420
499
|
...tabSchema,
|
|
421
500
|
...tab.fields.reduce((subFieldSchema, subField)=>{
|
|
422
501
|
const addSubField = fieldToSchemaMap[subField.type];
|
|
423
|
-
if (addSubField)
|
|
502
|
+
if (addSubField) {
|
|
503
|
+
return addSubField(subFieldSchema, subField);
|
|
504
|
+
}
|
|
424
505
|
return subFieldSchema;
|
|
425
506
|
}, tabSchema)
|
|
426
507
|
};
|
|
@@ -439,34 +520,125 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
439
520
|
}),
|
|
440
521
|
upload: (objectTypeConfig, field)=>{
|
|
441
522
|
const { relationTo } = field;
|
|
442
|
-
const
|
|
523
|
+
const isRelatedToManyCollections = Array.isArray(relationTo);
|
|
524
|
+
const hasManyValues = field.hasMany;
|
|
525
|
+
const relationshipName = combineParentName(parentName, toWords(field.name, true));
|
|
526
|
+
let type;
|
|
527
|
+
let relationToType = null;
|
|
528
|
+
if (Array.isArray(relationTo)) {
|
|
529
|
+
relationToType = new GraphQLEnumType({
|
|
530
|
+
name: `${relationshipName}_RelationTo`,
|
|
531
|
+
values: relationTo.reduce((relations, relation)=>({
|
|
532
|
+
...relations,
|
|
533
|
+
[formatName(relation)]: {
|
|
534
|
+
value: relation
|
|
535
|
+
}
|
|
536
|
+
}), {})
|
|
537
|
+
});
|
|
538
|
+
const types = relationTo.map((relation)=>graphqlResult.collections[relation].graphQL.type);
|
|
539
|
+
type = new GraphQLObjectType({
|
|
540
|
+
name: `${relationshipName}_Relationship`,
|
|
541
|
+
fields: {
|
|
542
|
+
relationTo: {
|
|
543
|
+
type: relationToType
|
|
544
|
+
},
|
|
545
|
+
value: {
|
|
546
|
+
type: new GraphQLUnionType({
|
|
547
|
+
name: relationshipName,
|
|
548
|
+
resolveType (data) {
|
|
549
|
+
return graphqlResult.collections[data.collection].graphQL.type.name;
|
|
550
|
+
},
|
|
551
|
+
types
|
|
552
|
+
})
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
} else {
|
|
557
|
+
({ type } = graphqlResult.collections[relationTo].graphQL);
|
|
558
|
+
}
|
|
443
559
|
// If the relationshipType is undefined at this point,
|
|
444
560
|
// it can be assumed that this blockType can have a relationship
|
|
445
561
|
// to itself. Therefore, we set the relationshipType equal to the blockType
|
|
446
562
|
// that is currently being created.
|
|
447
|
-
|
|
448
|
-
const
|
|
563
|
+
type = type || newlyCreatedBlockType;
|
|
564
|
+
const relationshipArgs = {};
|
|
565
|
+
const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [
|
|
566
|
+
relationTo
|
|
567
|
+
]).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
|
|
568
|
+
if (relationsUseDrafts) {
|
|
569
|
+
relationshipArgs.draft = {
|
|
570
|
+
type: GraphQLBoolean
|
|
571
|
+
};
|
|
572
|
+
}
|
|
449
573
|
if (config.localization) {
|
|
450
|
-
|
|
574
|
+
relationshipArgs.locale = {
|
|
451
575
|
type: graphqlResult.types.localeInputType
|
|
452
576
|
};
|
|
453
|
-
|
|
577
|
+
relationshipArgs.fallbackLocale = {
|
|
454
578
|
type: graphqlResult.types.fallbackLocaleInputType
|
|
455
579
|
};
|
|
456
580
|
}
|
|
457
|
-
const
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
args: uploadArgs,
|
|
581
|
+
const relationship = {
|
|
582
|
+
type: withNullableType(field, hasManyValues ? new GraphQLList(new GraphQLNonNull(type)) : type, forceNullable),
|
|
583
|
+
args: relationshipArgs,
|
|
461
584
|
extensions: {
|
|
462
|
-
complexity:
|
|
585
|
+
complexity: 10
|
|
463
586
|
},
|
|
464
587
|
async resolve (parent, args, context) {
|
|
465
588
|
const value = parent[field.name];
|
|
466
589
|
const locale = args.locale || context.req.locale;
|
|
467
590
|
const fallbackLocale = args.fallbackLocale || context.req.fallbackLocale;
|
|
468
|
-
|
|
591
|
+
let relatedCollectionSlug = field.relationTo;
|
|
469
592
|
const draft = Boolean(args.draft ?? context.req.query?.draft);
|
|
593
|
+
if (hasManyValues) {
|
|
594
|
+
const results = [];
|
|
595
|
+
const resultPromises = [];
|
|
596
|
+
const createPopulationPromise = async (relatedDoc, i)=>{
|
|
597
|
+
let id = relatedDoc;
|
|
598
|
+
let collectionSlug = field.relationTo;
|
|
599
|
+
if (isRelatedToManyCollections) {
|
|
600
|
+
collectionSlug = relatedDoc.relationTo;
|
|
601
|
+
id = relatedDoc.value;
|
|
602
|
+
}
|
|
603
|
+
const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
|
|
604
|
+
collectionSlug,
|
|
605
|
+
currentDepth: 0,
|
|
606
|
+
depth: 0,
|
|
607
|
+
docID: id,
|
|
608
|
+
draft,
|
|
609
|
+
fallbackLocale,
|
|
610
|
+
locale,
|
|
611
|
+
overrideAccess: false,
|
|
612
|
+
showHiddenFields: false,
|
|
613
|
+
transactionID: context.req.transactionID
|
|
614
|
+
}));
|
|
615
|
+
if (result) {
|
|
616
|
+
if (isRelatedToManyCollections) {
|
|
617
|
+
results[i] = {
|
|
618
|
+
relationTo: collectionSlug,
|
|
619
|
+
value: {
|
|
620
|
+
...result,
|
|
621
|
+
collection: collectionSlug
|
|
622
|
+
}
|
|
623
|
+
};
|
|
624
|
+
} else {
|
|
625
|
+
results[i] = result;
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
};
|
|
629
|
+
if (value) {
|
|
630
|
+
value.forEach((relatedDoc, i)=>{
|
|
631
|
+
resultPromises.push(createPopulationPromise(relatedDoc, i));
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
await Promise.all(resultPromises);
|
|
635
|
+
return results;
|
|
636
|
+
}
|
|
637
|
+
let id = value;
|
|
638
|
+
if (isRelatedToManyCollections && value) {
|
|
639
|
+
id = value.value;
|
|
640
|
+
relatedCollectionSlug = value.relationTo;
|
|
641
|
+
}
|
|
470
642
|
if (id) {
|
|
471
643
|
const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
|
|
472
644
|
collectionSlug: relatedCollectionSlug,
|
|
@@ -480,22 +652,26 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
|
|
|
480
652
|
showHiddenFields: false,
|
|
481
653
|
transactionID: context.req.transactionID
|
|
482
654
|
}));
|
|
483
|
-
|
|
655
|
+
if (relatedDocument) {
|
|
656
|
+
if (isRelatedToManyCollections) {
|
|
657
|
+
return {
|
|
658
|
+
relationTo: relatedCollectionSlug,
|
|
659
|
+
value: {
|
|
660
|
+
...relatedDocument,
|
|
661
|
+
collection: relatedCollectionSlug
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
return relatedDocument;
|
|
666
|
+
}
|
|
667
|
+
return null;
|
|
484
668
|
}
|
|
485
669
|
return null;
|
|
486
670
|
}
|
|
487
671
|
};
|
|
488
|
-
const whereFields = graphqlResult.collections[relationTo].config.fields;
|
|
489
|
-
upload.args.where = {
|
|
490
|
-
type: buildWhereInputType({
|
|
491
|
-
name: uploadName,
|
|
492
|
-
fields: whereFields,
|
|
493
|
-
parentName: uploadName
|
|
494
|
-
})
|
|
495
|
-
};
|
|
496
672
|
return {
|
|
497
673
|
...objectTypeConfig,
|
|
498
|
-
[field.name]:
|
|
674
|
+
[field.name]: relationship
|
|
499
675
|
};
|
|
500
676
|
}
|
|
501
677
|
};
|