GraphQL: Handle properly keys for pointer fields (#6499)

* Fix Unknow type bug on overloaded types

* check args too

* Additional fix to detect custom fields on pointer
This commit is contained in:
Antoine Cormouls
2020-03-23 09:40:04 +01:00
committed by GitHub
parent 312a4bc812
commit 255cb15c19
4 changed files with 68 additions and 19 deletions

View File

@@ -3,10 +3,32 @@ import { offsetToCursor, cursorToOffset } from 'graphql-relay';
import rest from '../../rest';
import { transformQueryInputToParse } from '../transformers/query';
const needToGetAllKeys = (fields, keys) =>
// Eslint/Prettier conflict
/* eslint-disable*/
const needToGetAllKeys = (fields, keys, parseClasses) =>
keys
? !!keys.split(',').find(keyName => !fields[keyName.split('.')[0]])
? keys.split(',').some(keyName => {
const key = keyName.split('.');
if (fields[key[0]]) {
if (fields[key[0]].type === 'Pointer') {
const subClass = parseClasses.find(
({ className: parseClassName }) =>
fields[key[0]].targetClass === parseClassName
);
if (subClass && subClass.fields[key[1]]) {
// Current sub key is not custom
return false;
}
} else if (!key[1]) {
// current key is not custom
return false;
}
}
// Key not found into Parse Schema so it's custom
return true;
})
: true;
/* eslint-enable*/
const transformOrder = order =>
order
@@ -32,11 +54,23 @@ const getObject = async (
config,
auth,
info,
parseClass
parseClasses
) => {
const options = {};
if (!needToGetAllKeys(parseClass.fields, keys)) {
options.keys = keys;
try {
if (
!needToGetAllKeys(
parseClasses.find(
({ className: parseClassName }) => className === parseClassName
).fields,
keys,
parseClasses
)
) {
options.keys = keys;
}
} catch (e) {
console.log(e);
}
if (include) {
options.include = include;
@@ -158,7 +192,8 @@ const findObjects = async (
parseClasses.find(
({ className: parseClassName }) => className === parseClassName
).fields,
keys
keys,
parseClasses
)
) {
options.keys = keys;

View File

@@ -31,9 +31,7 @@ const load = parseGraphQLSchema => {
config,
auth,
info,
parseGraphQLSchema.parseClasses.find(
({ className }) => type === className
)
parseGraphQLSchema.parseClasses
)),
};
} catch (e) {

View File

@@ -114,7 +114,8 @@ const load = function(
);
const needToGetAllKeys = objectsQueries.needToGetAllKeys(
parseClass.fields,
keys
keys,
parseGraphQLSchema.parseClasses
);
let optimizedObject = {};
if (needGet && !needToGetAllKeys) {
@@ -128,7 +129,7 @@ const load = function(
config,
auth,
info,
parseClass
parseGraphQLSchema.parseClasses
);
} else if (needToGetAllKeys) {
optimizedObject = await objectsQueries.getObject(
@@ -141,7 +142,7 @@ const load = function(
config,
auth,
info,
parseClass
parseGraphQLSchema.parseClasses
);
}
return {
@@ -232,7 +233,8 @@ const load = function(
);
const needToGetAllKeys = objectsQueries.needToGetAllKeys(
parseClass.fields,
keys
keys,
parseGraphQLSchema.parseClasses
);
let optimizedObject = {};
if (needGet && !needToGetAllKeys) {
@@ -246,7 +248,7 @@ const load = function(
config,
auth,
info,
parseClass
parseGraphQLSchema.parseClasses
);
} else if (needToGetAllKeys) {
optimizedObject = await objectsQueries.getObject(
@@ -259,7 +261,7 @@ const load = function(
config,
auth,
info,
parseClass
parseGraphQLSchema.parseClasses
);
}
return {
@@ -337,7 +339,7 @@ const load = function(
config,
auth,
info,
parseClass
parseGraphQLSchema.parseClasses
);
}
await objectsMutations.deleteObject(

View File

@@ -14,7 +14,14 @@ const getParseClassQueryConfig = function(
return (parseClassConfig && parseClassConfig.query) || {};
};
const getQuery = async (parseClass, _source, args, context, queryInfo) => {
const getQuery = async (
parseClass,
_source,
args,
context,
queryInfo,
parseClasses
) => {
let { id } = args;
const { options } = args;
const { readPreference, includeReadPreference } = options || {};
@@ -39,7 +46,7 @@ const getQuery = async (parseClass, _source, args, context, queryInfo) => {
config,
auth,
info,
parseClass
parseClasses
);
};
@@ -80,7 +87,14 @@ const load = function(
),
async resolve(_source, args, context, queryInfo) {
try {
return await getQuery(parseClass, _source, args, context, queryInfo);
return await getQuery(
parseClass,
_source,
args,
context,
queryInfo,
parseGraphQLSchema.parseClasses
);
} catch (e) {
parseGraphQLSchema.handleError(e);
}