fix: GraphQL file upload fails in case of use of pointer or relation (#8721)

This commit is contained in:
Antoine Cormouls
2024-02-14 21:44:42 +01:00
committed by GitHub
parent 6f21195980
commit 1aba6382c8
4 changed files with 140 additions and 8 deletions

View File

@@ -82,6 +82,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
const parseFields = await transformTypes('create', fields, {
className,
parseGraphQLSchema,
originalFields: args.fields,
req: { config, auth, info },
});
@@ -190,6 +191,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
const parseFields = await transformTypes('update', fields, {
className,
parseGraphQLSchema,
originalFields: args.fields,
req: { config, auth, info },
});

View File

@@ -38,6 +38,7 @@ const load = parseGraphQLSchema => {
const parseFields = await transformTypes('create', fields, {
className: '_User',
parseGraphQLSchema,
originalFields: args.fields,
req: { config, auth, info },
});
@@ -114,6 +115,7 @@ const load = parseGraphQLSchema => {
const parseFields = await transformTypes('create', fields, {
className: '_User',
parseGraphQLSchema,
originalFields: args.fields,
req: { config, auth, info },
});

View File

@@ -7,7 +7,7 @@ import * as objectsMutations from '../helpers/objectsMutations';
const transformTypes = async (
inputType: 'create' | 'update',
fields,
{ className, parseGraphQLSchema, req }
{ className, parseGraphQLSchema, req, originalFields }
) => {
const {
classGraphQLCreateType,
@@ -44,13 +44,16 @@ const transformTypes = async (
fields[field] = transformers.polygon(fields[field]);
break;
case inputTypeField.type === defaultGraphQLTypes.FILE_INPUT:
fields[field] = await transformers.file(fields[field], req);
// Use `originalFields` to handle file upload since fields are a deepcopy and do not
// keep the file object
fields[field] = await transformers.file(originalFields[field], req);
break;
case parseClass.fields[field].type === 'Relation':
fields[field] = await transformers.relation(
parseClass.fields[field].targetClass,
field,
fields[field],
originalFields[field],
parseGraphQLSchema,
req
);
@@ -64,6 +67,7 @@ const transformTypes = async (
parseClass.fields[field].targetClass,
field,
fields[field],
originalFields[field],
parseGraphQLSchema,
req
);
@@ -135,7 +139,14 @@ const transformers = {
}
return parseACL;
},
relation: async (targetClass, field, value, parseGraphQLSchema, { config, auth, info }) => {
relation: async (
targetClass,
field,
value,
originalValue,
parseGraphQLSchema,
{ config, auth, info }
) => {
if (Object.keys(value).length === 0)
throw new Parse.Error(
Parse.Error.INVALID_POINTER,
@@ -151,9 +162,10 @@ const transformers = {
if (value.createAndAdd) {
nestedObjectsToAdd = (
await Promise.all(
value.createAndAdd.map(async input => {
value.createAndAdd.map(async (input, i) => {
const parseFields = await transformTypes('create', input, {
className: targetClass,
originalFields: originalValue.createAndAdd[i],
parseGraphQLSchema,
req: { config, auth, info },
});
@@ -204,7 +216,14 @@ const transformers = {
}
return op;
},
pointer: async (targetClass, field, value, parseGraphQLSchema, { config, auth, info }) => {
pointer: async (
targetClass,
field,
value,
originalValue,
parseGraphQLSchema,
{ config, auth, info }
) => {
if (Object.keys(value).length > 1 || Object.keys(value).length === 0)
throw new Parse.Error(
Parse.Error.INVALID_POINTER,
@@ -216,6 +235,7 @@ const transformers = {
const parseFields = await transformTypes('create', value.createAndLink, {
className: targetClass,
parseGraphQLSchema,
originalFields: originalValue.createAndLink,
req: { config, auth, info },
});
nestedObjectToAdd = await objectsMutations.createObject(