From 5b58d6d40b525fddb7b26eb4ce429ecd4131f272 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Tue, 10 Sep 2024 14:35:26 +0300 Subject: [PATCH] chore(server): emails IoC 7 - initializeVerificationOnRegistrationFactory --- .../modules/emails/domain/operations.ts | 2 + packages/server/modules/emails/index.ts | 27 ++++++++++++- .../emails/services/verification/request.ts | 38 ++++++++----------- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/packages/server/modules/emails/domain/operations.ts b/packages/server/modules/emails/domain/operations.ts index 9be546701..14eea938c 100644 --- a/packages/server/modules/emails/domain/operations.ts +++ b/packages/server/modules/emails/domain/operations.ts @@ -18,3 +18,5 @@ export type DeleteOldAndInsertNewVerification = (email: string) => Promise Promise + +export type RequestEmailVerification = (userId: string) => Promise diff --git a/packages/server/modules/emails/index.ts b/packages/server/modules/emails/index.ts index bce995bc1..add8cd213 100644 --- a/packages/server/modules/emails/index.ts +++ b/packages/server/modules/emails/index.ts @@ -1,7 +1,17 @@ /* istanbul ignore file */ +import { db } from '@/db/knex' import { moduleLogger } from '@/logging/logging' +import { UsersEmitter } from '@/modules/core/events/usersEmitter' +import { findPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails' +import { getUser } from '@/modules/core/repositories/users' +import { getServerInfo } from '@/modules/core/services/generic' +import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories' +import { renderEmail } from '@/modules/emails/services/emailRendering' import * as SendingService from '@/modules/emails/services/sending' -import { initializeVerificationOnRegistration } from '@/modules/emails/services/verification/request' +import { + initializeVerificationOnRegistrationFactory, + requestEmailVerificationFactory +} from '@/modules/emails/services/verification/request' import { initializeTransporter } from '@/modules/emails/utils/transporter' import { Optional, SpeckleModule } from '@/modules/shared/helpers/typeHelper' @@ -19,6 +29,21 @@ const emailsModule: SpeckleModule = { // init event listeners if (isInitial) { + const initializeVerificationOnRegistration = + initializeVerificationOnRegistrationFactory({ + userEmitterListener: UsersEmitter.listen, + requestEmailVerification: requestEmailVerificationFactory({ + getUser, + getServerInfo, + deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory( + { db } + ), + findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db }), + sendEmail: SendingService.sendEmail, + renderEmail + }) + }) + quitVerificationListeners = initializeVerificationOnRegistration() } }, diff --git a/packages/server/modules/emails/services/verification/request.ts b/packages/server/modules/emails/services/verification/request.ts index d82aa362e..ce117d537 100644 --- a/packages/server/modules/emails/services/verification/request.ts +++ b/packages/server/modules/emails/services/verification/request.ts @@ -6,11 +6,9 @@ import { UserEmail } from '@/modules/core/domain/userEmails/types' import { UsersEmitter, UsersEvents } from '@/modules/core/events/usersEmitter' import { getEmailVerificationFinalizationRoute } from '@/modules/core/helpers/routeHelper' import { ServerInfo, UserRecord } from '@/modules/core/helpers/types' -import { findPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails' import { getUser } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { EmailVerificationRequestError } from '@/modules/emails/errors' -import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories' import { EmailTemplateParams, renderEmail @@ -19,9 +17,9 @@ import { sendEmail } from '@/modules/emails/services/sending' import { getServerOrigin } from '@/modules/shared/helpers/envHelper' import { DeleteOldAndInsertNewVerification, + RequestEmailVerification, RequestNewEmailVerification } from '@/modules/emails/domain/operations' -import { db } from '@/db/knex' const EMAIL_SUBJECT = 'Speckle Account E-mail Verification' @@ -178,8 +176,10 @@ const sendVerificationEmailFactory = * Request email verification (send out verification message) for user with specified ID */ export const requestEmailVerificationFactory = - (deps: CreateNewVerificationDeps & SendVerificationEmailDeps) => - async (userId: string) => { + ( + deps: CreateNewVerificationDeps & SendVerificationEmailDeps + ): RequestEmailVerification => + async (userId) => { const newVerificationState = await createNewVerificationFactory(deps)(userId) await sendVerificationEmailFactory(deps)(newVerificationState) } @@ -187,25 +187,19 @@ export const requestEmailVerificationFactory = /** * Listen for user:created events and trigger email verification initialization */ -export function initializeVerificationOnRegistration() { - return UsersEmitter.listen(UsersEvents.Created, async ({ user }) => { - // user might already be verified because of registration through an external identity provider - if (user.verified) return +export const initializeVerificationOnRegistrationFactory = + (deps: { + userEmitterListener: typeof UsersEmitter.listen + requestEmailVerification: RequestEmailVerification + }) => + () => { + return deps.userEmitterListener(UsersEvents.Created, async ({ user }) => { + // user might already be verified because of registration through an external identity provider + if (user.verified) return - const requestEmailVerification = requestEmailVerificationFactory({ - getUser, - getServerInfo, - deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ - db - }), - findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db }), - sendEmail, - renderEmail + await deps.requestEmailVerification(user.id) }) - - await requestEmailVerification(user.id) - }) -} + } type RequestNewEmailVerificationDeps = CreateNewEmailVerificationFactoryDeps