@neo4j/graphql
Version:
A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations
311 lines • 12.6 kB
JavaScript
"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