mirror of
https://github.com/documenso/documenso.git
synced 2026-07-10 21:15:15 +10:00
9ac7b94d9a
Allow organisations to manage an SSO OIDC compliant portal. This method is intended to streamline the onboarding process and paves the way to allow organisations to manage their members in a more strict way.
70 lines
1.8 KiB
TypeScript
70 lines
1.8 KiB
TypeScript
import crypto from 'crypto';
|
|
import { DateTime } from 'luxon';
|
|
|
|
import { prisma } from '@documenso/prisma';
|
|
|
|
import { USER_SIGNUP_VERIFICATION_TOKEN_IDENTIFIER } from '../../constants/email';
|
|
import { ONE_HOUR } from '../../constants/time';
|
|
import { sendConfirmationEmail } from '../auth/send-confirmation-email';
|
|
import { getMostRecentEmailVerificationToken } from './get-most-recent-email-verification-token';
|
|
|
|
type SendConfirmationTokenOptions = { email: string; force?: boolean };
|
|
|
|
export const sendConfirmationToken = async ({
|
|
email,
|
|
force = false,
|
|
}: SendConfirmationTokenOptions) => {
|
|
const token = crypto.randomBytes(20).toString('hex');
|
|
|
|
const user = await prisma.user.findFirst({
|
|
where: {
|
|
email: email,
|
|
},
|
|
});
|
|
|
|
if (!user) {
|
|
throw new Error('User not found');
|
|
}
|
|
|
|
if (user.emailVerified) {
|
|
throw new Error('Email verified');
|
|
}
|
|
|
|
const mostRecentToken = await getMostRecentEmailVerificationToken({ userId: user.id });
|
|
|
|
// If we've sent a token in the last 5 minutes, don't send another one
|
|
if (
|
|
!force &&
|
|
mostRecentToken?.createdAt &&
|
|
DateTime.fromJSDate(mostRecentToken.createdAt).diffNow('minutes').minutes > -5
|
|
) {
|
|
// return;
|
|
}
|
|
|
|
const createdToken = await prisma.verificationToken.create({
|
|
data: {
|
|
identifier: USER_SIGNUP_VERIFICATION_TOKEN_IDENTIFIER,
|
|
token: token,
|
|
expires: new Date(Date.now() + ONE_HOUR),
|
|
user: {
|
|
connect: {
|
|
id: user.id,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
if (!createdToken) {
|
|
throw new Error(`Failed to create the verification token`);
|
|
}
|
|
|
|
try {
|
|
await sendConfirmationEmail({ userId: user.id });
|
|
|
|
return { success: true };
|
|
} catch (err) {
|
|
console.log(err);
|
|
throw new Error(`Failed to send the confirmation email`);
|
|
}
|
|
};
|