diff --git a/packages/server/modules/emails/domain/operations.ts b/packages/server/modules/emails/domain/operations.ts index 0ad590703..48caec9e4 100644 --- a/packages/server/modules/emails/domain/operations.ts +++ b/packages/server/modules/emails/domain/operations.ts @@ -6,3 +6,5 @@ export type GetPendingToken = (params: { }) => Promise export type DeleteVerifications = (email: string) => Promise + +export type DeleteOldAndInsertNewVerification = (email: string) => Promise diff --git a/packages/server/modules/emails/repositories/index.ts b/packages/server/modules/emails/repositories/index.ts index 4784d05dd..4a619ae58 100644 --- a/packages/server/modules/emails/repositories/index.ts +++ b/packages/server/modules/emails/repositories/index.ts @@ -1,6 +1,6 @@ -import { db } from '@/db/knex' import { EmailVerifications } from '@/modules/core/dbSchema' import { + DeleteOldAndInsertNewVerification, DeleteVerifications, GetPendingToken } from '@/modules/emails/domain/operations' @@ -57,22 +57,24 @@ export const deleteVerificationsFactory = /** * Delete all previous verification entries and create a new one */ -export async function deleteOldAndInsertNewVerification(email: string) { - if (!email) throw new InvalidArgumentError('E-mail address is empty') +export const deleteOldAndInsertNewVerificationFactory = + (deps: { db: Knex }): DeleteOldAndInsertNewVerification => + async (email) => { + if (!email) throw new InvalidArgumentError('E-mail address is empty') - // delete all existing verifications first - await deleteVerificationsFactory({ db })(email) + // delete all existing verifications first + await deleteVerificationsFactory({ db: deps.db })(email) - // insert new one - const EmailVerificationCols = EmailVerifications.with({ - withoutTablePrefix: true - }).col + // insert new one + const EmailVerificationCols = EmailVerifications.with({ + withoutTablePrefix: true + }).col - const newId = cryptoRandomString({ length: 20 }) - await EmailVerifications.knex().insert({ - [EmailVerificationCols.id]: newId, - [EmailVerificationCols.email]: email - }) + const newId = cryptoRandomString({ length: 20 }) + await EmailVerifications.knex(deps.db).insert({ + [EmailVerificationCols.id]: newId, + [EmailVerificationCols.email]: email + }) - return newId -} + return newId + } diff --git a/packages/server/modules/emails/services/verification/request.ts b/packages/server/modules/emails/services/verification/request.ts index ca3c4e3e2..ba6c16ac8 100644 --- a/packages/server/modules/emails/services/verification/request.ts +++ b/packages/server/modules/emails/services/verification/request.ts @@ -10,7 +10,7 @@ import { import { getUser } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { EmailVerificationRequestError } from '@/modules/emails/errors' -import { deleteOldAndInsertNewVerification } from '@/modules/emails/repositories' +import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories' import { EmailTemplateParams, renderEmail @@ -43,7 +43,9 @@ async function createNewVerification( if (user.verified) throw new EmailVerificationRequestError("User's email is already verified") - const verificationId = await deleteOldAndInsertNewVerification(user.email) + const verificationId = await deleteOldAndInsertNewVerificationFactory({ db })( + user.email + ) return { user, @@ -80,7 +82,9 @@ const createNewEmailVerificationFactory = 'Unable to resolve verification target user' ) - const verificationId = await deleteOldAndInsertNewVerification(emailRecord.email) + const verificationId = await deleteOldAndInsertNewVerificationFactory({ db })( + emailRecord.email + ) return { user, email: emailRecord,