UNPKG

@neo4j/graphql

Version:

A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations

311 lines 12.6 kB
"use strict"; /* * Copyright (c) "Neo4j" * Neo4j Sweden AB [http://neo4j.com] * * This file is part of Neo4j. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.withUpdateInputType = withUpdateInputType; exports.augmentUpdateInputTypeWithUpdateFieldInput = augmentUpdateInputTypeWithUpdateFieldInput; const constants_1 = require("../../constants"); const ConcreteEntityAdapter_1 = require("../../schema-model/entity/model-adapters/ConcreteEntityAdapter"); const UnionEntityAdapter_1 = require("../../schema-model/entity/model-adapters/UnionEntityAdapter"); const RelationshipAdapter_1 = require("../../schema-model/relationship/model-adapters/RelationshipAdapter"); const ensure_non_empty_input_1 = require("../ensure-non-empty-input"); const to_compose_1 = require("../to-compose"); const connect_input_1 = require("./connect-input"); const connection_where_input_1 = require("./connection-where-input"); const delete_input_1 = require("./delete-input"); const disconnect_input_1 = require("./disconnect-input"); const relation_input_1 = require("./relation-input"); const utils_1 = require("./utils"); function withUpdateInputType({ entityAdapter, userDefinedFieldDirectives, composer, features, }) { const inputTypeName = entityAdapter instanceof RelationshipAdapter_1.RelationshipAdapter ? entityAdapter.operations.edgeUpdateInputTypeName : // : entityAdapter.operations.updateMutationArgumentNames.update; TODO entityAdapter.operations.updateInputTypeName; if (composer.has(inputTypeName)) { return composer.getITC(inputTypeName); } const updateInputType = composer.createInputTC({ name: inputTypeName, fields: {}, }); if (entityAdapter instanceof ConcreteEntityAdapter_1.ConcreteEntityAdapter || entityAdapter instanceof RelationshipAdapter_1.RelationshipAdapter) { const additionalFields = []; if ((0, utils_1.shouldAddDeprecatedFields)(features, "mutationOperations")) { additionalFields.push((0, to_compose_1.withMathOperators)(), (0, to_compose_1.withArrayOperators)()); } updateInputType.addFields((0, to_compose_1.concreteEntityToUpdateInputFields)({ objectFields: entityAdapter.updateInputFields, userDefinedFieldDirectives, additionalFieldsCallbacks: additionalFields, features, })); } else { const hasNestedRelationships = entityAdapter.relationshipDeclarations.size > 0; const hasFields = entityAdapter.updateInputFields.length > 0; if (!hasNestedRelationships && !hasFields) { (0, ensure_non_empty_input_1.ensureNonEmptyInput)(composer, updateInputType); } const additionalFields = []; if ((0, utils_1.shouldAddDeprecatedFields)(features, "mutationOperations")) { additionalFields.push((0, to_compose_1.withMathOperators)()); } updateInputType.addFields((0, to_compose_1.concreteEntityToUpdateInputFields)({ objectFields: entityAdapter.updateInputFields, userDefinedFieldDirectives, additionalFieldsCallbacks: additionalFields, features, })); } return updateInputType; } function augmentUpdateInputTypeWithUpdateFieldInput({ relationshipAdapter, composer, userDefinedFieldDirectives, deprecatedDirectives, features, }) { if (relationshipAdapter.source instanceof UnionEntityAdapter_1.UnionEntityAdapter) { throw new Error("Unexpected union source"); } const updateFieldInput = makeUpdateInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }); if (!updateFieldInput) { return; } const updateInput = withUpdateInputType({ entityAdapter: relationshipAdapter.source, userDefinedFieldDirectives, composer, features, }); const relationshipField = makeUpdateInputTypeRelationshipField({ relationshipAdapter, updateFieldInput, deprecatedDirectives, }); updateInput.addFields(relationshipField); } function makeUpdateInputType({ relationshipAdapter, composer, userDefinedFieldDirectives, deprecatedDirectives, features, }) { if (relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter) { return withUnionUpdateInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }); } return withUpdateFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives, features }); } function makeUpdateInputTypeRelationshipField({ relationshipAdapter, updateFieldInput, deprecatedDirectives, }) { if (relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter) { return { [relationshipAdapter.name]: { type: updateFieldInput, directives: deprecatedDirectives, }, }; } return { [relationshipAdapter.name]: { type: relationshipAdapter.isList ? updateFieldInput.NonNull.List : updateFieldInput, directives: deprecatedDirectives, }, }; } function withUpdateFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, features, }) { const typeName = relationshipAdapter.operations.getUpdateFieldInputTypeName(ifUnionMemberEntity); if (!relationshipAdapter.shouldGenerateUpdateFieldInputType(ifUnionMemberEntity)) { return; } if (!relationshipAdapter.isUpdatable()) { return; } if (composer.has(typeName)) { return composer.getITC(typeName); } const updateFieldInput = composer.createInputTC({ name: typeName, fields: makeUpdateFieldInputTypeFields({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, features, }), }); return updateFieldInput; } function makeUpdateFieldInputTypeFields({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, features, }) { const fields = {}; const connectFieldInputType = (0, connect_input_1.withConnectFieldInputType)({ relationshipAdapter, ifUnionMemberEntity, composer }); if (connectFieldInputType) { fields["connect"] = { type: relationshipAdapter.isList ? connectFieldInputType.NonNull.List : connectFieldInputType, directives: [], }; } const disconnectFieldInputType = (0, disconnect_input_1.withDisconnectFieldInputType)({ relationshipAdapter, ifUnionMemberEntity, composer, features, }); if (disconnectFieldInputType) { fields["disconnect"] = { type: relationshipAdapter.isList ? disconnectFieldInputType.NonNull.List : disconnectFieldInputType, directives: [], }; } const createFieldInputType = (0, relation_input_1.withCreateFieldInputType)({ relationshipAdapter, ifUnionMemberEntity, composer, userDefinedFieldDirectives, }); if (createFieldInputType) { fields["create"] = { type: relationshipAdapter.isList ? createFieldInputType.NonNull.List : createFieldInputType, directives: [], }; } const updateFieldInputType = withUpdateConnectionFieldInputType({ relationshipAdapter, ifUnionMemberEntity, composer, userDefinedFieldDirectives, features, }); if (updateFieldInputType) { fields["update"] = { type: updateFieldInputType, directives: [], }; } const deleteFieldInputType = (0, delete_input_1.withDeleteFieldInputType)({ relationshipAdapter, ifUnionMemberEntity, composer, }); if (deleteFieldInputType) { fields["delete"] = { type: relationshipAdapter.isList ? deleteFieldInputType.NonNull.List : deleteFieldInputType, directives: [], }; } return fields; } function withUnionUpdateInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }) { const typeName = relationshipAdapter.operations.unionUpdateInputTypeName; if (composer.has(typeName)) { return composer.getITC(typeName); } const fields = makeUnionUpdateInputTypeFields({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }); if (!Object.keys(fields).length) { return; } const updateInput = composer.createInputTC({ name: typeName, fields, }); return updateInput; } function makeUnionUpdateInputTypeFields({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }) { const fields = {}; if (!(relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter)) { throw new Error("Expected union target"); } for (const memberEntity of relationshipAdapter.target.concreteEntities) { const fieldInput = withUpdateFieldInputType({ relationshipAdapter, ifUnionMemberEntity: memberEntity, composer, userDefinedFieldDirectives, features, }); if (fieldInput) { fields[memberEntity.name] = { type: relationshipAdapter.isList ? fieldInput.NonNull.List : fieldInput, directives: deprecatedDirectives, }; } } return fields; } function withUpdateConnectionFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, features, }) { const typeName = relationshipAdapter.operations.getUpdateConnectionInputTypename(ifUnionMemberEntity); if (!relationshipAdapter.nestedOperations.has(constants_1.RelationshipNestedOperationsOption.UPDATE)) { return; } if (composer.has(typeName)) { return composer.getITC(typeName); } const fields = makeUpdateConnectionFieldInputTypeFields({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, features, }); const updateFieldInput = composer.createInputTC({ name: typeName, fields }); return updateFieldInput; } function makeUpdateConnectionFieldInputTypeFields({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, features, }) { const fields = {}; if (relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter) { if (!ifUnionMemberEntity) { throw new Error("Expected member entity"); } const updateInputType = withUpdateInputType({ entityAdapter: ifUnionMemberEntity, userDefinedFieldDirectives, composer, features, }); fields["node"] = updateInputType; fields["where"] = (0, connection_where_input_1.withConnectionWhereInputType)({ relationshipAdapter, memberEntity: ifUnionMemberEntity, composer, }); } else { // TODO: we need to fix deprecatedDirectives before we can use the reference // const updateInputType = withUpdateInputType({ // entityAdapter: relationshipAdapter.target, // userDefinedFieldDirectives, // composer, // }); // fields["node"] = updateInputType; fields["node"] = relationshipAdapter.target.operations.updateInputTypeName; fields["where"] = relationshipAdapter.operations.getConnectionWhereTypename(); } if (relationshipAdapter.hasUpdateInputFields) { fields["edge"] = relationshipAdapter.operations.edgeUpdateInputTypeName; } return fields; } //# sourceMappingURL=update-input.js.map