Merge pull request #2920 from specklesystems/fabians/emails-ioc-7

chore(server): emails IoC 7 - initializeVerificationOnRegistrationFactory
This commit is contained in:
Alessandro Magionami
2024-09-11 09:49:08 +02:00
committed by GitHub
3 changed files with 44 additions and 23 deletions
@@ -18,3 +18,5 @@ export type DeleteOldAndInsertNewVerification = (email: string) => Promise<strin
*/
export type RequestNewEmailVerification = (emailId: string) => Promise<void>
export type RequestEmailVerification = (userId: string) => Promise<void>
+26 -1
View File
@@ -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()
}
},
@@ -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