From 31661071ba248e2c8c11182c75be21baec8ab6ca Mon Sep 17 00:00:00 2001 From: Alessandro Magionami Date: Wed, 24 Jul 2024 17:17:37 +0200 Subject: [PATCH] fix(useremails): fix login with primary email --- .../core/domain/userEmails/operations.ts | 2 ++ .../modules/core/repositories/userEmails.ts | 11 +++++++++++ .../server/modules/core/services/users.js | 19 ++++++++++++------- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/server/modules/core/domain/userEmails/operations.ts b/packages/server/modules/core/domain/userEmails/operations.ts index 32e1ed1b6..9695cf000 100644 --- a/packages/server/modules/core/domain/userEmails/operations.ts +++ b/packages/server/modules/core/domain/userEmails/operations.ts @@ -37,3 +37,5 @@ export type FindPrimaryEmailForUser = ( } | { email: string } ) => Promise + +export type FindEmail = (query: Partial) => Promise diff --git a/packages/server/modules/core/repositories/userEmails.ts b/packages/server/modules/core/repositories/userEmails.ts index 353625346..74d03b559 100644 --- a/packages/server/modules/core/repositories/userEmails.ts +++ b/packages/server/modules/core/repositories/userEmails.ts @@ -3,6 +3,7 @@ import crs from 'crypto-random-string' import { CreateUserEmail, DeleteUserEmail, + FindEmail, FindPrimaryEmailForUser, UpdateUserEmail } from '@/modules/core/domain/userEmails/operations' @@ -58,3 +59,13 @@ export const findPrimaryEmailForUserFactory = }) .first() } + +export const findEmailFactory = + ({ db }: { db: Knex }): FindEmail => + async (query) => { + return db(UserEmails.name) + .where({ + ...query + }) + .first() + } diff --git a/packages/server/modules/core/services/users.js b/packages/server/modules/core/services/users.js index adf98d9c7..fdb356138 100644 --- a/packages/server/modules/core/services/users.js +++ b/packages/server/modules/core/services/users.js @@ -34,9 +34,13 @@ const { getServerInfo } = require('@/modules/core/services/generic') const { sanitizeImageUrl } = require('@/modules/shared/helpers/sanitization') const { createUserEmailFactory, - findPrimaryEmailForUserFactory + findPrimaryEmailForUserFactory, + findEmailFactory } = require('@/modules/core/repositories/userEmails') const { db } = require('@/db/knex') +const { + findUserByTargetFactory +} = require('@/modules/serverinvites/repositories/serverInvites') const _changeUserRole = async ({ userId, role }) => await Acl().where({ userId }).update({ role }) @@ -54,9 +58,6 @@ const _ensureAtleastOneAdminRemains = async (userId) => { } } -const userByEmailQuery = (email) => - Users().whereRaw('lower("users"."email") = lower(?)', [email]) - module.exports = { /* Users @@ -99,8 +100,10 @@ module.exports = { } delete user.password - const usr = await userByEmailQuery(user.email).select('id').first() - if (usr) throw new UserInputError('Email taken. Try logging in?') + const userEmail = await findEmailFactory({ db })({ + email: user.email + }) + if (userEmail) throw new UserInputError('Email taken. Try logging in?') const [newUser] = (await Users().insert(user, UsersSchema.cols)) || [] if (!newUser) throw new Error("Couldn't create user") @@ -185,8 +188,10 @@ module.exports = { }, async getUserByEmail({ email }) { - const user = await userByEmailQuery(email) + const user = await Users() .leftJoin(UserEmails.name, UserEmails.col.userId, UsersSchema.col.id) + .where({ primary: true }) + .whereRaw('lower("user_emails"."email") = lower(?)', [email]) .columns([ ...Object.values(omit(UsersSchema.col, ['email', 'verified'])), knex.raw(`(array_agg("user_emails"."email"))[1] as email`),