2bb7802fb9
* 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
54 lines
1.8 KiB
TypeScript
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
|
|
}
|