diff --git a/packages/api/amplify_api/lib/src/graphql/factories/graphql_request_factory.dart b/packages/api/amplify_api/lib/src/graphql/factories/graphql_request_factory.dart index b10432c6d3..659eefb5d0 100644 --- a/packages/api/amplify_api/lib/src/graphql/factories/graphql_request_factory.dart +++ b/packages/api/amplify_api/lib/src/graphql/factories/graphql_request_factory.dart @@ -281,7 +281,10 @@ class GraphQLRequestFactory { /// /// When the model has a parent via a belongsTo, the id from the parent is added /// as a field similar to "blogID" where the value is `post.blog.id`. - Map buildInputVariableForMutations(Model model) { + Map buildInputVariableForMutations( + Model model, { + required GraphQLRequestOperation operation, + }) { final schema = getModelSchemaByModelName(model.getInstanceType().modelName(), null); final modelJson = model.toJson(); @@ -303,10 +306,17 @@ class GraphQLRequestFactory { } } - // Remove any relational fields or readonly. + // Remove some fields from input. final fieldsToRemove = schema.fields!.entries .where( - (entry) => entry.value.association != null || entry.value.isReadOnly, + (entry) => + // relational fields + entry.value.association != null || + // read-only + entry.value.isReadOnly || + // null values on create operations + (operation == GraphQLRequestOperation.create && + modelJson[entry.value.name] == null), ) .map((entry) => entry.key) .toSet(); diff --git a/packages/api/amplify_api/lib/src/graphql/factories/model_mutations_factory.dart b/packages/api/amplify_api/lib/src/graphql/factories/model_mutations_factory.dart index 91fa8e9dd9..385d8575c3 100644 --- a/packages/api/amplify_api/lib/src/graphql/factories/model_mutations_factory.dart +++ b/packages/api/amplify_api/lib/src/graphql/factories/model_mutations_factory.dart @@ -22,8 +22,10 @@ class ModelMutationsFactory extends ModelMutationsInterface { APIAuthorizationType? authorizationMode, Map? headers, }) { - final input = - GraphQLRequestFactory.instance.buildInputVariableForMutations(model); + final input = GraphQLRequestFactory.instance.buildInputVariableForMutations( + model, + operation: GraphQLRequestOperation.create, + ); // Does not use buildVariablesForMutationRequest because creations don't have conditions. final variables = {'input': input}; @@ -96,8 +98,10 @@ class ModelMutationsFactory extends ModelMutationsInterface { }) { final condition = GraphQLRequestFactory.instance .queryPredicateToGraphQLFilter(where, model.getInstanceType()); - final input = - GraphQLRequestFactory.instance.buildInputVariableForMutations(model); + final input = GraphQLRequestFactory.instance.buildInputVariableForMutations( + model, + operation: GraphQLRequestOperation.update, + ); final variables = GraphQLRequestFactory.instance .buildVariablesForMutationRequest(input: input, condition: condition); diff --git a/packages/api/amplify_api/test/graphql_helpers_test.dart b/packages/api/amplify_api/test/graphql_helpers_test.dart index 50f883dd60..63b4a5d699 100644 --- a/packages/api/amplify_api/test/graphql_helpers_test.dart +++ b/packages/api/amplify_api/test/graphql_helpers_test.dart @@ -378,8 +378,6 @@ void main() { 'id': id, 'name': name, 'createdAt': time, - 'file': null, - 'files': null } }; const expectedDoc = @@ -393,6 +391,18 @@ void main() { expect(req.decodePath, 'createBlog'); }); + test( + 'ModelMutations.create() should not include null fields in input variable', + () { + const name = 'Test Blog'; + + final Blog blog = Blog(name: name); + final GraphQLRequest req = ModelMutations.create(blog); + final inputVariable = req.variables['input'] as Map; + + expect(inputVariable.containsKey('file'), isFalse); + }); + test( 'ModelMutations.create() should build a valid request for a model with a parent', () { @@ -413,8 +423,6 @@ void main() { 'id': postId, 'title': title, 'rating': rating, - 'created': null, - 'likeCount': null, 'blogID': blogId } };