Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bring 2.0.0 in line with master #264

Merged
merged 12 commits into from
Jun 16, 2021
Merged
30 changes: 30 additions & 0 deletions docs/asciidoc/type-definitions/cypher.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,36 @@ type Query {
}
----


=== `cypherParams`
Use to inject values into the cypher query from the GraphQL context function.

Inject into context:

[source, typescript]
----
const server = new ApolloServer({
typeDefs,
context: () => {
return {
cypherParams: { userId: "user-id-01" }
}
}
});
----

Use in cypher query:

[source, graphql]
----
type Query {
userPosts: [Post] @cypher(statement: """
MATCH (:User {id: $cypherParams.userId})-[:POSTED]->(p:Post)
RETURN p
""")
}
----

== Return values

The return value of the Cypher statement must be of the same type to which the directive is applied.
Expand Down
3 changes: 1 addition & 2 deletions packages/graphql/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@
"graphql-compose": "^7.25.1",
"graphql-parse-resolve-info": "^4.11.0",
"jsonwebtoken": "^8.5.1",
"pluralize": "^8.0.0",
"upper-case-first": "^2.0.2"
"pluralize": "^8.0.0"
},
"peerDependencies": {
"graphql": "^15.0.0",
Expand Down
3 changes: 3 additions & 0 deletions packages/graphql/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,8 @@
* limitations under the License.
*/

import { upperFirst } from "graphql-compose";

export { upperFirst };
export { DriverConfig, GraphQLOptionsArg, GraphQLWhereArg, DeleteInfo, GraphQLSortArg } from "./types";
export { Neo4jGraphQL, Neo4jGraphQLConstructor } from "./classes";
6 changes: 3 additions & 3 deletions packages/graphql/src/schema/make-augmented-schema.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ describe("makeAugmentedSchema", () => {

// Find
const nodeFindQuery = queryObject.fields?.find((x) => x.name.value === pluralize(camelCase(type)));
const nodeFindQueryType = ((nodeFindQuery?.type as NonNullTypeNode).type as ListTypeNode)
.type as NamedTypeNode;
const nodeFindQueryType = (((nodeFindQuery?.type as NonNullTypeNode).type as ListTypeNode)
.type as NonNullTypeNode).type as NamedTypeNode;
expect(nodeFindQueryType.name.value).toEqual(type);

// Options
Expand Down Expand Up @@ -235,7 +235,7 @@ describe("makeAugmentedSchema", () => {
type Node {
createdAt: DateTime
}

type Query {
nodes: [Node] @cypher(statement: "")
}
Expand Down
30 changes: 16 additions & 14 deletions packages/graphql/src/schema/make-augmented-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {
UnionTypeDefinitionNode,
} from "graphql";
import {
upperFirst,
SchemaComposer,
InputTypeComposer,
ObjectTypeComposer,
Expand All @@ -43,7 +44,6 @@ import pluralize from "pluralize";
import { Node, Exclude } from "../classes";
import getAuth from "./get-auth";
import { PrimitiveField, Auth, CustomEnumField } from "../types";
import { upperFirstLetter } from "../utils";
import { findResolver, createResolver, deleteResolver, cypherResolver, updateResolver } from "./resolvers";
import checkNodeImplementsInterfaces from "./check-node-implements-interfaces";
import * as Scalars from "./scalars";
Expand Down Expand Up @@ -588,9 +588,10 @@ function makeAugmentedSchema(

refNodes.forEach((n) => {
const concatFieldName = `${rel.fieldName}_${n.name}`;
const unionPrefix = `${node.name}${upperFirstLetter(rel.fieldName)}${n.name}`;
const unionPrefix = `${node.name}${upperFirst(rel.fieldName)}${n.name}`;

const updateField = `${n.name}UpdateInput`;

const nodeFieldInputName = `${unionPrefix}FieldInput`;
const nodeFieldUpdateInputName = `${unionPrefix}UpdateFieldInput`;
const nodeFieldDeleteInputName = `${unionPrefix}DeleteFieldInput`;
Expand All @@ -600,7 +601,7 @@ function makeAugmentedSchema(
[n.name]: `${n.name}Where`,
});

const createName = `${node.name}${upperFirstLetter(rel.fieldName)}${n.name}CreateFieldInput`;
const createName = `${node.name}${upperFirst(rel.fieldName)}${n.name}CreateFieldInput`;
const create = rel.typeMeta.array ? `[${createName}!]` : createName;
if (!composer.has(createName)) {
composer.createInputTC({
Expand All @@ -612,7 +613,7 @@ function makeAugmentedSchema(
});
}

const connectName = `${node.name}${upperFirstLetter(rel.fieldName)}ConnectFieldInput`;
const connectName = `${node.name}${upperFirst(rel.fieldName)}ConnectFieldInput`;
const connect = rel.typeMeta.array ? `[${connectName}!]` : `${connectName}`;
if (!composer.has(connectName)) {
composer.createInputTC({
Expand All @@ -635,7 +636,7 @@ function makeAugmentedSchema(
name: nodeFieldUpdateInputName,
fields: {
...(rel.properties ? { properties: `${rel.properties}UpdateInput` } : {}),
where: `${node.name}${upperFirstLetter(rel.fieldName)}ConnectionWhere`,
where: `${node.name}${upperFirst(rel.fieldName)}ConnectionWhere`,
update: updateField,
connect,
disconnect: rel.typeMeta.array
Expand Down Expand Up @@ -731,10 +732,11 @@ function makeAugmentedSchema(

const n = nodes.find((x) => x.name === rel.typeMeta.name) as Node;
const updateField = `${n.name}UpdateInput`;
const nodeFieldInputName = `${node.name}${upperFirstLetter(rel.fieldName)}FieldInput`;
const nodeFieldUpdateInputName = `${node.name}${upperFirstLetter(rel.fieldName)}UpdateFieldInput`;
const nodeFieldDeleteInputName = `${node.name}${upperFirstLetter(rel.fieldName)}DeleteFieldInput`;
const nodeFieldDisconnectInputName = `${node.name}${upperFirstLetter(rel.fieldName)}DisconnectFieldInput`;

const nodeFieldInputName = `${node.name}${upperFirst(rel.fieldName)}FieldInput`;
const nodeFieldUpdateInputName = `${node.name}${upperFirst(rel.fieldName)}UpdateFieldInput`;
const nodeFieldDeleteInputName = `${node.name}${upperFirst(rel.fieldName)}DeleteFieldInput`;
const nodeFieldDisconnectInputName = `${node.name}${upperFirst(rel.fieldName)}DisconnectFieldInput`;

whereInput.addFields({
...{ [rel.fieldName]: `${n.name}Where`, [`${rel.fieldName}_NOT`]: `${n.name}Where` },
Expand All @@ -753,7 +755,7 @@ function makeAugmentedSchema(
anyNonNullRelProperties = relFields.some((field) => field.typeMeta.required);
}

const createName = `${node.name}${upperFirstLetter(rel.fieldName)}CreateFieldInput`;
const createName = `${node.name}${upperFirst(rel.fieldName)}CreateFieldInput`;
const create = rel.typeMeta.array ? `[${createName}!]` : createName;
if (!composer.has(createName)) {
composer.createInputTC({
Expand All @@ -767,7 +769,7 @@ function makeAugmentedSchema(
});
}

const connectName = `${node.name}${upperFirstLetter(rel.fieldName)}ConnectFieldInput`;
const connectName = `${node.name}${upperFirst(rel.fieldName)}ConnectFieldInput`;
const connect = rel.typeMeta.array ? `[${connectName}!]` : connectName;
if (!composer.has(connectName)) {
composer.createInputTC({
Expand Down Expand Up @@ -798,7 +800,7 @@ function makeAugmentedSchema(
name: nodeFieldUpdateInputName,
fields: {
...(rel.properties ? { properties: `${rel.properties}UpdateInput` } : {}),
where: `${node.name}${upperFirstLetter(rel.fieldName)}ConnectionWhere`,
where: `${node.name}${upperFirst(rel.fieldName)}ConnectionWhere`,
update: updateField,
connect,
disconnect: rel.typeMeta.array
Expand All @@ -821,7 +823,7 @@ function makeAugmentedSchema(
composer.createInputTC({
name: nodeFieldDeleteInputName,
fields: {
where: `${node.name}${upperFirstLetter(rel.fieldName)}ConnectionWhere`,
where: `${node.name}${upperFirst(rel.fieldName)}ConnectionWhere`,
...(n.relationFields.length
? {
delete: `${n.name}DeleteInput`,
Expand All @@ -835,7 +837,7 @@ function makeAugmentedSchema(
composer.createInputTC({
name: nodeFieldDisconnectInputName,
fields: {
where: `${node.name}${upperFirstLetter(rel.fieldName)}ConnectionWhere`,
where: `${node.name}${upperFirst(rel.fieldName)}ConnectionWhere`,
...(n.relationFields.length
? {
disconnect: `${n.name}DisconnectInput`,
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/schema/resolvers/cypher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export default function cypherResolver({ field, statement }: { field: BaseField;
async function resolve(_root: any, args: any, _context: unknown) {
const context = _context as Context;
const cypherStrs: string[] = [];
let params = { ...args, auth: createAuthParam({ context }) };
let params = { ...args, auth: createAuthParam({ context }), cypherParams: context.cypherParams };

const preAuth = createAuthAndParams({ entity: field, context });
if (preAuth[0]) {
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/schema/resolvers/read.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe("Read resolver", () => {
};

const result = findResolver({ node });
expect(result.type).toEqual(`[Movie]!`);
expect(result.type).toEqual(`[Movie!]!`);
expect(result.resolve).toBeInstanceOf(Function);
expect(result.args).toMatchObject({
where: `MovieWhere`,
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/schema/resolvers/read.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export default function findResolver({ node }: { node: Node }) {
}

return {
type: `[${node.name}]!`,
type: `[${node.name}!]!`,
resolve,
args: { where: `${node.name}Where`, options: `${node.name}Options` },
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,10 @@ function createProjectionAndParams({
}
}

const initApocParamsStrs = [
"auth: $auth",
...(context.cypherParams ? ["cypherParams: $cypherParams"] : []),
];
const apocParams = Object.entries(field.args).reduce(
(r: { strs: string[]; params: any }, entry) => {
const argName = `${param}_${entry[0]}`;
Expand All @@ -224,9 +228,9 @@ function createProjectionAndParams({
params: { ...r.params, [argName]: entry[1] },
};
},
{ strs: ["auth: $auth"], params: {} }
{ strs: initApocParamsStrs, params: {} }
) as { strs: string[]; params: any };
res.params = { ...res.params, ...apocParams.params };
res.params = { ...res.params, ...apocParams.params, cypherParams: context.cypherParams };

const expectMultipleValues = referenceNode && cypherField.typeMeta.array ? "true" : "false";
const apocWhere = `${
Expand Down
1 change: 0 additions & 1 deletion packages/graphql/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@
export { default as trimmer } from "./trimmer";
export { default as execute } from "./execute";
export { default as checkNeo4jCompat } from "./verify-database";
export { default as upperFirstLetter } from "./upper-first-letter";
30 changes: 0 additions & 30 deletions packages/graphql/src/utils/upper-first-letter.test.ts

This file was deleted.

24 changes: 0 additions & 24 deletions packages/graphql/src/utils/upper-first-letter.ts

This file was deleted.

Loading