Files
speckle-server/packages/server/modules/core/services/userEmails.ts
T
Kristaps Fabians Geikins 4b06f42db7 chore(server): run TS files directly (no compilation) (#5134)
* sort of works

* type fixes

* added option to run old way too
2025-07-23 11:20:40 +02:00

54 lines
1.8 KiB
TypeScript

import type {
CreateUserEmail,
FindEmail,
ValidateAndCreateUserEmail
} from '@/modules/core/domain/userEmails/operations'
import type { ensureNoPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails'
import { UserEmailAlreadyExistsError } from '@/modules/core/errors/userEmails'
import type { finalizeInvitedServerRegistrationFactory } from '@/modules/serverinvites/services/processing'
import type { RequestNewEmailVerification } from '@/modules/emails/domain/operations'
export const validateAndCreateUserEmailFactory =
(deps: {
createUserEmail: CreateUserEmail
ensureNoPrimaryEmailForUser: ReturnType<typeof ensureNoPrimaryEmailForUserFactory>
findEmail: FindEmail
updateEmailInvites: ReturnType<typeof finalizeInvitedServerRegistrationFactory>
requestNewEmailVerification: RequestNewEmailVerification
}): ValidateAndCreateUserEmail =>
async (params) => {
const { userEmail } = params
const { email, userId, primary } = userEmail
const validationPromises: Array<Promise<unknown>> = []
if (primary) {
validationPromises.push(deps.ensureNoPrimaryEmailForUser({ userId }))
}
validationPromises.push(
(async () => {
const existingEmail = await deps.findEmail({
email
})
if (existingEmail) {
throw new UserEmailAlreadyExistsError()
}
})()
)
await Promise.all(validationPromises)
const result = await deps.createUserEmail({ userEmail })
// Update all invites referencing the email, to point to the user
await deps.updateEmailInvites(result.email, result.userId)
// Request email verification (if needed)
if (!userEmail.verified) {
await deps.requestNewEmailVerification(result.id)
}
return result
}