From 554b2fa3862d4bf9643015b8d3e8ca7343a5e71f Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Wed, 16 Oct 2024 12:03:19 +0300 Subject: [PATCH] chore(server): core IoC #66 - markUserAsVerifiedFactory --- .../modules/core/domain/users/operations.ts | 2 ++ .../server/modules/core/repositories/users.ts | 28 +++++++++++-------- .../core/tests/integration/userEmails.spec.ts | 3 +- packages/server/modules/emails/rest/index.ts | 4 +-- .../emails/services/verification/finalize.ts | 4 +-- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/server/modules/core/domain/users/operations.ts b/packages/server/modules/core/domain/users/operations.ts index 178e6c55a..a2d182477 100644 --- a/packages/server/modules/core/domain/users/operations.ts +++ b/packages/server/modules/core/domain/users/operations.ts @@ -78,6 +78,8 @@ export type UpdateUserServerRole = (params: { role: ServerRoles }) => Promise +export type MarkUserAsVerified = (email: string) => Promise + export type LegacyGetUserByEmail = (params: { email: string }) => Promise>> diff --git a/packages/server/modules/core/repositories/users.ts b/packages/server/modules/core/repositories/users.ts index 95f99238f..cc5fbc62a 100644 --- a/packages/server/modules/core/repositories/users.ts +++ b/packages/server/modules/core/repositories/users.ts @@ -25,6 +25,7 @@ import { LegacyGetUser, LegacyGetUserByEmail, ListPaginatedUsersPage, + MarkUserAsVerified, SearchLimitedUsers, StoreUser, StoreUserAcl, @@ -194,21 +195,24 @@ export const getUserByEmailFactory = /** * Mark a user as verified by e-mail address, and return true on success */ -export async function markUserAsVerified(email: string) { - const UserCols = Users.with({ withoutTablePrefix: true }).col +export const markUserAsVerifiedFactory = + (deps: { db: Knex }): MarkUserAsVerified => + async (email: string) => { + const UserCols = Users.with({ withoutTablePrefix: true }).col - const usersUpdate = await Users.knex() - .whereRaw('lower(email) = lower(?)', [email]) - .update({ - [UserCols.verified]: true - }) + const usersUpdate = await tables + .users(deps.db) + .whereRaw('lower(email) = lower(?)', [email]) + .update({ + [UserCols.verified]: true + }) - const userEmailsUpdate = await markUserEmailAsVerifiedFactory({ - updateUserEmail: updateUserEmailFactory({ db }) - })({ email: email.toLowerCase().trim() }) + const userEmailsUpdate = await markUserEmailAsVerifiedFactory({ + updateUserEmail: updateUserEmailFactory({ db: deps.db }) + })({ email: email.toLowerCase().trim() }) - return !!(usersUpdate || userEmailsUpdate) -} + return !!(usersUpdate || userEmailsUpdate) + } export async function markOnboardingComplete(userId: string) { if (!userId) return false diff --git a/packages/server/modules/core/tests/integration/userEmails.spec.ts b/packages/server/modules/core/tests/integration/userEmails.spec.ts index 5bf303694..5e37fd97d 100644 --- a/packages/server/modules/core/tests/integration/userEmails.spec.ts +++ b/packages/server/modules/core/tests/integration/userEmails.spec.ts @@ -9,7 +9,7 @@ import { legacyGetPaginatedUsersFactory, legacyGetUserByEmailFactory, listUsersFactory, - markUserAsVerified, + markUserAsVerifiedFactory, storeUserAclFactory, storeUserFactory } from '@/modules/core/repositories/users' @@ -84,6 +84,7 @@ const createUser = createUserFactory({ const getUserByEmail = getUserByEmailFactory({ db }) const legacyGetUserByEmail = legacyGetUserByEmailFactory({ db }) const listUsers = listUsersFactory({ db }) +const markUserAsVerified = markUserAsVerifiedFactory({ db }) describe('Core @user-emails', () => { before(async () => { diff --git a/packages/server/modules/emails/rest/index.ts b/packages/server/modules/emails/rest/index.ts index 5e14589eb..b02f83910 100644 --- a/packages/server/modules/emails/rest/index.ts +++ b/packages/server/modules/emails/rest/index.ts @@ -7,15 +7,15 @@ import { deleteVerificationsFactory, getPendingTokenFactory } from '@/modules/emails/repositories' -import { markUserAsVerified } from '@/modules/core/repositories/users' import { db } from '@/db/knex' +import { markUserAsVerifiedFactory } from '@/modules/core/repositories/users' export = (app: Express) => { app.get('/auth/verifyemail', async (req, res) => { try { const finalizeEmailVerification = finalizeEmailVerificationFactory({ getPendingToken: getPendingTokenFactory({ db }), - markUserAsVerified, + markUserAsVerified: markUserAsVerifiedFactory({ db }), deleteVerifications: deleteVerificationsFactory({ db }) }) diff --git a/packages/server/modules/emails/services/verification/finalize.ts b/packages/server/modules/emails/services/verification/finalize.ts index fd8408cad..6b19a1ed0 100644 --- a/packages/server/modules/emails/services/verification/finalize.ts +++ b/packages/server/modules/emails/services/verification/finalize.ts @@ -1,10 +1,10 @@ import { Optional } from '@speckle/shared' -import { markUserAsVerified } from '@/modules/core/repositories/users' import { EmailVerificationFinalizationError } from '@/modules/emails/errors' import { DeleteVerifications, GetPendingToken } from '@/modules/emails/domain/operations' +import { MarkUserAsVerified } from '@/modules/core/domain/users/operations' type InitializeStateDeps = { getPendingToken: GetPendingToken @@ -27,7 +27,7 @@ const initializeState = type FinalizationState = Awaited>> type FinalizeVerificationDeps = { - markUserAsVerified: typeof markUserAsVerified + markUserAsVerified: MarkUserAsVerified deleteVerifications: DeleteVerifications }