From b0d20ede718185e44c6ad624114fdc09590be63f Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 19 Nov 2019 20:56:12 +0100 Subject: [PATCH] Fix #2294 Ideally we would not have this inconsistent edge case that we filter through the user type. Much better would be a graphql query like: ```graphql { User(filter: { primary_email: { email: "something@example.org" } }) { id name slug } } ``` --- .../src/middleware/permissionsMiddleware.js | 4 +--- backend/src/schema/resolvers/users.js | 20 +++++++++++++++---- backend/src/schema/resolvers/users.spec.js | 15 ++++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index b0d07c8ec7..4622c3f242 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -100,7 +100,7 @@ const noEmailFilter = rule({ const publicRegistration = rule()(() => !!CONFIG.PUBLIC_REGISTRATION) // Permissions -const permissions = shield( +export default shield( { Query: { '*': deny, @@ -176,5 +176,3 @@ const permissions = shield( fallbackRule: allow, }, ) - -export default permissions diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 3024bf5a54..02ed8dbac2 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -49,10 +49,22 @@ export default { User: async (object, args, context, resolveInfo) => { const { email } = args if (email) { - const e = await instance.first('EmailAddress', { email }) - let user = e.get('belongsTo') - user = await user.toJson() - return [user.node] + let session + try { + session = context.driver.session() + const readTxResult = await session.readTransaction(txc => { + const result = txc.run( + ` + MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $args.email}) + RETURN user`, + { args }, + ) + return result + }) + return readTxResult.records.map(r => r.get('user').properties) + } finally { + session.close() + } } return neo4jgraphql(object, args, context, resolveInfo) }, diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js index 36b77d6114..483c702148 100644 --- a/backend/src/schema/resolvers/users.spec.js +++ b/backend/src/schema/resolvers/users.spec.js @@ -70,6 +70,21 @@ describe('User', () => { data: { User: [{ name: 'Johnny' }] }, }) }) + + it('non-existing email address, issue #2294', async () => { + // see: https://github.com/Human-Connection/Human-Connection/issues/2294 + await expect( + query({ + query: userQuery, + variables: { + email: 'this-email-does-not-exist@example.org', + }, + }), + ).resolves.toMatchObject({ + data: { User: [] }, + errors: undefined, + }) + }) }) }) })