diff --git a/backend/src/models/User.js b/backend/src/models/User.js index 02ce04513..cac8fd7a6 100644 --- a/backend/src/models/User.js +++ b/backend/src/models/User.js @@ -4,7 +4,6 @@ module.exports = { id: { type: 'string', primary: true, default: uuid }, // TODO: should be type: 'uuid' but simplified for our tests actorId: { type: 'string', allow: [null] }, name: { type: 'string', min: 3 }, - email: { type: 'string', lowercase: true, email: true }, slug: 'string', encryptedPassword: 'string', avatar: { type: 'string', allow: [null] }, diff --git a/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.js index b62f9a609..af5ef3222 100644 --- a/backend/src/schema/resolvers/user_management.js +++ b/backend/src/schema/resolvers/user_management.js @@ -21,8 +21,8 @@ export default { // } const session = driver.session() const result = await session.run( - 'MATCH (user:User {email: $userEmail}) ' + - 'RETURN user {.id, .slug, .name, .avatar, .email, .encryptedPassword, .role, .disabled} as user LIMIT 1', + 'MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $userEmail})' + + 'RETURN user {.id, .slug, .name, .avatar, .encryptedPassword, .role, .disabled} as user LIMIT 1', { userEmail: email, }, @@ -48,7 +48,7 @@ export default { changePassword: async (_, { oldPassword, newPassword }, { driver, user }) => { const session = driver.session() let result = await session.run( - `MATCH (user:User {email: $userEmail}) + `MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $userEmail}) RETURN user {.id, .email, .encryptedPassword}`, { userEmail: user.email, @@ -68,7 +68,7 @@ export default { } else { const newEncryptedPassword = await bcrypt.hashSync(newPassword, 10) session.run( - `MATCH (user:User {email: $userEmail}) + `MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $userEmail}) SET user.encryptedPassword = $newEncryptedPassword RETURN user `, diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index e5c43aad4..95d9119b0 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -2,7 +2,7 @@ type User { id: ID! actorId: String name: String - email: String! + email: String! @cypher(statement: "MATCH (this)-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e.email") slug: String! avatar: String coverImg: String diff --git a/backend/src/seed/factories/users.js b/backend/src/seed/factories/users.js index 8bdf03b9f..c34a9b3de 100644 --- a/backend/src/seed/factories/users.js +++ b/backend/src/seed/factories/users.js @@ -21,7 +21,15 @@ export default function create() { ...args, } args = await encryptPassword(args) - return neodeInstance.create('User', args) + const [user, email] = await Promise.all([ + neodeInstance.create('User', args), + neodeInstance.create('EmailAddress', { email: args.email }), + ]) + await Promise.all([ + user.relateTo(email, 'primaryEmail'), + email.relateTo(user, 'belongsTo') + ]) + return user }, } }