Files
speckle-server/packages/server/modules/core/services/userEmails.ts
T
Kristaps Fabians Geikins 2bb7802fb9 feat: accept & decline workspace invite as a registered member (#2675)
* abstract base invite banner

* WIP banner actions

* WIP modify obj

* minor fix

* invite accept/decline cache mutations

* banner accept/decline basically works

* new block for accepting workspace invite

* WIP wrong account flow

* login/registration block changes

* add email invite related changes

* add new email FE

* add email w/ invite works

* final adjustments

* minor fixes

* addressing cr comments

* no-FF support

* extra workspace ff checks
2024-08-19 13:01:25 +03:00

54 lines
1.8 KiB
TypeScript

import {
CreateUserEmail,
FindEmail,
ValidateAndCreateUserEmail
} from '@/modules/core/domain/userEmails/operations'
import { ensureNoPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails'
import { UserEmailAlreadyExistsError } from '@/modules/core/errors/userEmails'
import { finalizeInvitedServerRegistrationFactory } from '@/modules/serverinvites/services/processing'
import { requestNewEmailVerification } from '@/modules/emails/services/verification/request'
export const validateAndCreateUserEmailFactory =
(deps: {
createUserEmail: CreateUserEmail
ensureNoPrimaryEmailForUser: ReturnType<typeof ensureNoPrimaryEmailForUserFactory>
findEmail: FindEmail
updateEmailInvites: ReturnType<typeof finalizeInvitedServerRegistrationFactory>
requestNewEmailVerification: typeof 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
}