mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-16 03:31:27 +00:00
102 lines
2.5 KiB
TypeScript
102 lines
2.5 KiB
TypeScript
import * as Sentry from '@sentry/node';
|
|
import { IUser } from '../models';
|
|
import { createOrganization } from './organization';
|
|
import { addMembershipsOrg } from './membershipOrg';
|
|
import { OWNER, ACCEPTED } from '../variables';
|
|
import { sendMail } from '../helpers/nodemailer';
|
|
import { TokenService } from '../services';
|
|
import { TOKEN_EMAIL_CONFIRMATION } from '../variables';
|
|
|
|
/**
|
|
* Send magic link to verify email to [email]
|
|
* for user and workspace.
|
|
* @param {Object} obj
|
|
* @param {String} obj.email - email
|
|
* @returns {Boolean} success - whether or not operation was successful
|
|
*/
|
|
const sendEmailVerification = async ({ email }: { email: string }) => {
|
|
try {
|
|
const token = await TokenService.createToken({
|
|
type: TOKEN_EMAIL_CONFIRMATION,
|
|
email
|
|
});
|
|
|
|
// send mail
|
|
await sendMail({
|
|
template: 'emailVerification.handlebars',
|
|
subjectLine: 'Infisical confirmation code',
|
|
recipients: [email],
|
|
substitutions: {
|
|
code: token
|
|
}
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser(null);
|
|
Sentry.captureException(err);
|
|
throw new Error(
|
|
"Ouch. We weren't able to send your email verification code"
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Validate [code] sent to [email]
|
|
* @param {Object} obj
|
|
* @param {String} obj.email - emai
|
|
* @param {String} obj.code - code that was sent to [email]
|
|
*/
|
|
const checkEmailVerification = async ({
|
|
email,
|
|
code
|
|
}: {
|
|
email: string;
|
|
code: string;
|
|
}) => {
|
|
try {
|
|
await TokenService.validateToken({
|
|
type: TOKEN_EMAIL_CONFIRMATION,
|
|
email,
|
|
token: code
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser(null);
|
|
Sentry.captureException(err);
|
|
throw new Error("Oops. We weren't able to verify");
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Initialize default organization named [organizationName] with workspace
|
|
* for user [user]
|
|
* @param {Object} obj
|
|
* @param {String} obj.organizationName - name of organization to initialize
|
|
* @param {IUser} obj.user - user who we are initializing for
|
|
*/
|
|
const initializeDefaultOrg = async ({
|
|
organizationName,
|
|
user
|
|
}: {
|
|
organizationName: string;
|
|
user: IUser;
|
|
}) => {
|
|
try {
|
|
// create organization with user as owner and initialize a free
|
|
// subscription
|
|
const organization = await createOrganization({
|
|
email: user.email,
|
|
name: organizationName
|
|
});
|
|
|
|
await addMembershipsOrg({
|
|
userIds: [user._id.toString()],
|
|
organizationId: organization._id.toString(),
|
|
roles: [OWNER],
|
|
statuses: [ACCEPTED]
|
|
});
|
|
} catch (err) {
|
|
throw new Error(`Failed to initialize default organization and workspace [err=${err}]`);
|
|
}
|
|
};
|
|
|
|
export { sendEmailVerification, checkEmailVerification, initializeDefaultOrg };
|