Merge pull request #2919 from specklesystems/fabians/emails-ioc-6

chore(server): emails IoC 6 - sendVerificationEmailFactory
This commit is contained in:
Alessandro Magionami
2024-09-11 09:48:26 +02:00
committed by GitHub
10 changed files with 75 additions and 28 deletions
@@ -18,12 +18,16 @@ import { validateAndCreateUserEmailFactory } from '@/modules/core/services/userE
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 { sendEmail } from '@/modules/emails/services/sending'
const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
export = {
@@ -56,6 +56,8 @@ const {
const {
deleteOldAndInsertNewVerificationFactory
} = require('@/modules/emails/repositories')
const { renderEmail } = require('@/modules/emails/services/emailRendering')
const { sendEmail } = require('@/modules/emails/services/sending')
const _changeUserRole = async ({ userId, role }) =>
await Acl().where({ userId }).update({ role })
@@ -77,7 +79,9 @@ const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
module.exports = {
@@ -28,12 +28,16 @@ import {
import { requestNewEmailVerificationFactory } from '@/modules/emails/services/verification/request'
import { getServerInfo } from '@/modules/core/services/generic'
import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories'
import { renderEmail } from '@/modules/emails/services/emailRendering'
import { sendEmail } from '@/modules/emails/services/sending'
const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
const createUserEmail = validateAndCreateUserEmailFactory({
@@ -39,12 +39,16 @@ import {
import { requestNewEmailVerificationFactory } from '@/modules/emails/services/verification/request'
import { getServerInfo } from '@/modules/core/services/generic'
import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories'
import { renderEmail } from '@/modules/emails/services/emailRendering'
import { sendEmail } from '@/modules/emails/services/sending'
const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
const createUserEmail = validateAndCreateUserEmailFactory({
@@ -33,12 +33,16 @@ import { requestNewEmailVerificationFactory } from '@/modules/emails/services/ve
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 { sendEmail } from '@/modules/emails/services/sending'
const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
const createUserEmail = validateAndCreateUserEmailFactory({
@@ -7,13 +7,17 @@ import {
deleteOldAndInsertNewVerificationFactory,
getPendingTokenFactory
} from '@/modules/emails/repositories'
import { renderEmail } from '@/modules/emails/services/emailRendering'
import { sendEmail } from '@/modules/emails/services/sending'
import { requestEmailVerificationFactory } from '@/modules/emails/services/verification/request'
const requestEmailVerification = requestEmailVerificationFactory({
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db })
findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db }),
sendEmail,
renderEmail
})
export = {
@@ -152,29 +152,36 @@ function buildEmailTemplateParams(verificationId: string): EmailTemplateParams {
}
}
async function sendVerificationEmail(state: VerificationRequestContext) {
const emailTemplateParams = buildEmailTemplateParams(state.verificationId)
const { html, text } = await renderEmail(
emailTemplateParams,
state.serverInfo,
// im deliberately setting this to null, so that the email will not show the unsubscribe bit
null
)
await sendEmail({
to: state.email.email,
subject: EMAIL_SUBJECT,
text,
html
})
type SendVerificationEmailDeps = {
sendEmail: typeof sendEmail
renderEmail: typeof renderEmail
}
const sendVerificationEmailFactory =
(deps: SendVerificationEmailDeps) => async (state: VerificationRequestContext) => {
const emailTemplateParams = buildEmailTemplateParams(state.verificationId)
const { html, text } = await deps.renderEmail(
emailTemplateParams,
state.serverInfo,
// im deliberately setting this to null, so that the email will not show the unsubscribe bit
null
)
await deps.sendEmail({
to: state.email.email,
subject: EMAIL_SUBJECT,
text,
html
})
}
/**
* Request email verification (send out verification message) for user with specified ID
*/
export const requestEmailVerificationFactory =
(deps: CreateNewVerificationDeps) => async (userId: string) => {
(deps: CreateNewVerificationDeps & SendVerificationEmailDeps) =>
async (userId: string) => {
const newVerificationState = await createNewVerificationFactory(deps)(userId)
await sendVerificationEmail(newVerificationState)
await sendVerificationEmailFactory(deps)(newVerificationState)
}
/**
@@ -191,7 +198,9 @@ export function initializeVerificationOnRegistration() {
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({
db
}),
findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db })
findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db }),
sendEmail,
renderEmail
})
await requestEmailVerification(user.id)
@@ -201,10 +210,12 @@ export function initializeVerificationOnRegistration() {
type RequestNewEmailVerificationDeps = CreateNewEmailVerificationFactoryDeps
export const requestNewEmailVerificationFactory =
(deps: RequestNewEmailVerificationDeps): RequestNewEmailVerification =>
(
deps: RequestNewEmailVerificationDeps & SendVerificationEmailDeps
): RequestNewEmailVerification =>
async (emailId) => {
const createNewEmailVerification = createNewEmailVerificationFactory(deps)
const newVerificationState = await createNewEmailVerification(emailId)
await sendVerificationEmail(newVerificationState)
await sendVerificationEmailFactory(deps)(newVerificationState)
}
@@ -27,6 +27,8 @@ import { db } from '@/db/knex'
import { requestEmailVerificationFactory } from '@/modules/emails/services/verification/request'
import { getServerInfo } from '@/modules/core/services/generic'
import { findPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails'
import { sendEmail } from '@/modules/emails/services/sending'
import { renderEmail } from '@/modules/emails/services/emailRendering'
const mailerMock = EmailSendingServiceMock
const getPendingToken = getPendingTokenFactory({ db })
@@ -37,7 +39,9 @@ const requestEmailVerification = requestEmailVerificationFactory({
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({
db
}),
findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db })
findPrimaryEmailForUser: findPrimaryEmailForUserFactory({ db }),
sendEmail,
renderEmail
})
const cleanup = async () => {
@@ -69,12 +69,16 @@ import { validateAndCreateUserEmailFactory } from '@/modules/core/services/userE
import { getServerInfo } from '@/modules/core/services/generic'
import { requestNewEmailVerificationFactory } from '@/modules/emails/services/verification/request'
import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories'
import { renderEmail } from '@/modules/emails/services/emailRendering'
import { sendEmail } from '@/modules/emails/services/sending'
const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
const buildCollectAndValidateResourceTargets = () =>
@@ -125,12 +125,16 @@ import { getServerInfo } from '@/modules/core/services/generic'
import { mapWorkspaceRoleToInitialProjectRole } from '@/modules/workspaces/domain/logic'
import { updateStreamRoleAndNotify } from '@/modules/core/services/streams/management'
import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories'
import { renderEmail } from '@/modules/emails/services/emailRendering'
import { sendEmail } from '@/modules/emails/services/sending'
const requestNewEmailVerification = requestNewEmailVerificationFactory({
findEmail: findEmailFactory({ db }),
getUser,
getServerInfo,
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db })
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
renderEmail,
sendEmail
})
const buildCollectAndValidateResourceTargets = () =>