@neo4j/graphql
Version:
A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations
162 lines • 6.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.withRelationInputType = withRelationInputType;
exports.withCreateFieldInputType = withCreateFieldInputType;
const constants_1 = require("../../constants");
const ConcreteEntityAdapter_1 = require("../../schema-model/entity/model-adapters/ConcreteEntityAdapter");
const InterfaceEntityAdapter_1 = require("../../schema-model/entity/model-adapters/InterfaceEntityAdapter");
const UnionEntityAdapter_1 = require("../../schema-model/entity/model-adapters/UnionEntityAdapter");
const create_input_1 = require("./create-input");
function withRelationInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, }) {
const relationshipSource = relationshipAdapter.source;
if (relationshipSource instanceof UnionEntityAdapter_1.UnionEntityAdapter) {
throw new Error("Unexpected union source");
}
const createFieldInputType = makeRelationFieldInputType({
relationshipAdapter,
composer,
userDefinedFieldDirectives,
deprecatedDirectives,
});
if (!createFieldInputType) {
return;
}
const relationInput = composer.getOrCreateITC(relationshipSource.operations.relationInputTypeName);
const relationshipField = makeRelationInputTypeRelationshipField({
relationshipAdapter,
createFieldInputType,
deprecatedDirectives,
});
relationInput.addFields(relationshipField);
return relationInput;
}
function makeRelationFieldInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, }) {
if (relationshipAdapter.target instanceof ConcreteEntityAdapter_1.ConcreteEntityAdapter) {
return withCreateFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives });
}
if (relationshipAdapter.target instanceof InterfaceEntityAdapter_1.InterfaceEntityAdapter) {
return withCreateFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives });
}
if (relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter) {
return withUnionCreateFieldInputType({
relationshipAdapter,
composer,
deprecatedDirectives,
userDefinedFieldDirectives,
});
}
}
function makeRelationInputTypeRelationshipField({ relationshipAdapter, createFieldInputType, deprecatedDirectives, }) {
if (relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter) {
return {
[relationshipAdapter.name]: {
type: createFieldInputType,
directives: deprecatedDirectives,
},
};
}
return {
[relationshipAdapter.name]: {
type: relationshipAdapter.isList ? createFieldInputType.NonNull.List : createFieldInputType,
directives: deprecatedDirectives,
},
};
}
function withUnionCreateFieldInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, }) {
const typeName = relationshipAdapter.operations.unionCreateFieldInputTypeName;
if (!(relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter)) {
throw new Error("Expected union target");
}
if (composer.has(typeName)) {
return composer.getITC(typeName);
}
const fields = makeUnionCreateFieldInputTypeFields({
relationshipAdapter,
composer,
deprecatedDirectives,
userDefinedFieldDirectives,
});
if (!Object.keys(fields).length) {
return;
}
const createInput = composer.createInputTC({
name: typeName,
fields,
});
return createInput;
}
function makeUnionCreateFieldInputTypeFields({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, }) {
const fields = {};
if (!(relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter)) {
throw new Error("Expected union target");
}
for (const memberEntity of relationshipAdapter.target.concreteEntities) {
const fieldInput = withCreateFieldInputType({
relationshipAdapter,
ifUnionMemberEntity: memberEntity,
composer,
userDefinedFieldDirectives,
});
if (fieldInput) {
fields[memberEntity.name] = {
type: relationshipAdapter.isList ? fieldInput.NonNull.List : fieldInput,
directives: deprecatedDirectives,
};
}
}
return fields;
}
function withCreateFieldInputType({ relationshipAdapter, composer, ifUnionMemberEntity, userDefinedFieldDirectives, }) {
const createName = relationshipAdapter.operations.getCreateFieldInputTypeName(ifUnionMemberEntity);
if (!relationshipAdapter.nestedOperations.has(constants_1.RelationshipNestedOperationsOption.CREATE)) {
return;
}
if (composer.has(createName)) {
return composer.getITC(createName);
}
const createFieldInput = composer.createInputTC({
name: createName,
fields: makeCreateFieldInputTypeFields({
relationshipAdapter,
composer,
ifUnionMemberEntity,
userDefinedFieldDirectives,
}),
});
return createFieldInput;
}
function makeCreateFieldInputTypeFields({ relationshipAdapter, composer, ifUnionMemberEntity, userDefinedFieldDirectives, }) {
const fields = {};
if (relationshipAdapter.hasCreateInputFields) {
fields["edge"] = relationshipAdapter.operations.edgeCreateInputTypeName;
}
if (relationshipAdapter.target instanceof ConcreteEntityAdapter_1.ConcreteEntityAdapter) {
// tODO: fix deprecatedDirectives and use the reference here instead of string
fields["node"] = `${relationshipAdapter.target.operations.createInputTypeName}!`;
}
else if (relationshipAdapter.target instanceof InterfaceEntityAdapter_1.InterfaceEntityAdapter) {
const createInput = (0, create_input_1.withCreateInputType)({
entityAdapter: relationshipAdapter.target,
userDefinedFieldDirectives,
composer,
});
if (createInput) {
fields["node"] = createInput.NonNull;
}
}
else {
if (!ifUnionMemberEntity) {
throw new Error("Member Entity required.");
}
const createInput = (0, create_input_1.withCreateInputType)({
entityAdapter: ifUnionMemberEntity,
userDefinedFieldDirectives,
composer,
});
if (createInput) {
fields["node"] = createInput.NonNull;
}
}
return fields;
}
//# sourceMappingURL=relation-input.js.map