Improved invite user to project (even though this function isn't actually used.)

This commit is contained in:
Daniel Hougaard
2024-02-22 05:00:26 +01:00
parent 41d3b9314e
commit 2ef7e8f58e
@@ -42,10 +42,10 @@ type TProjectMembershipServiceFactoryDep = {
smtpService: TSmtpService; smtpService: TSmtpService;
projectBotDAL: TProjectBotDALFactory; projectBotDAL: TProjectBotDALFactory;
projectMembershipDAL: TProjectMembershipDALFactory; projectMembershipDAL: TProjectMembershipDALFactory;
userDAL: Pick<TUserDALFactory, "findById" | "findOne" | "findUserByProjectMembershipId">; userDAL: Pick<TUserDALFactory, "findById" | "findOne" | "findUserByProjectMembershipId" | "find">;
projectRoleDAL: Pick<TProjectRoleDALFactory, "findOne">; projectRoleDAL: Pick<TProjectRoleDALFactory, "findOne">;
orgDAL: Pick<TOrgDALFactory, "findMembership" | "findOrgMembersByEmail">; orgDAL: Pick<TOrgDALFactory, "findMembership" | "findOrgMembersByEmail">;
projectDAL: Pick<TProjectDALFactory, "findById" | "findProjectGhostUser">; projectDAL: Pick<TProjectDALFactory, "findById" | "findProjectGhostUser" | "transaction">;
projectKeyDAL: Pick<TProjectKeyDALFactory, "findLatestProjectKey" | "delete" | "insertMany">; projectKeyDAL: Pick<TProjectKeyDALFactory, "findLatestProjectKey" | "delete" | "insertMany">;
licenseService: Pick<TLicenseServiceFactory, "getPlan">; licenseService: Pick<TLicenseServiceFactory, "getPlan">;
}; };
@@ -77,55 +77,70 @@ export const projectMembershipServiceFactory = ({
const invitees: TUsers[] = []; const invitees: TUsers[] = [];
for (const email of emails) { const project = await projectDAL.findById(projectId);
const invitee = await userDAL.findOne({ email }); const users = await userDAL.find({
if (!invitee || !invitee.isAccepted) $in: { email: emails }
});
await projectDAL.transaction(async (tx) => {
for (const invitee of users) {
if (!invitee.isAccepted)
throw new BadRequestError({ throw new BadRequestError({
message: "Failed to validate invitee", message: "Failed to validate invitee",
name: "Invite user to project" name: "Invite user to project"
}); });
const inviteeMembership = await projectMembershipDAL.findOne({ const inviteeMembership = await projectMembershipDAL.findOne(
{
userId: invitee.id, userId: invitee.id,
projectId projectId
}); },
if (inviteeMembership) tx
);
if (inviteeMembership) {
throw new BadRequestError({ throw new BadRequestError({
message: "Existing member of project", message: "Existing member of project",
name: "Invite user to project" name: "Invite user to project"
}); });
}
const project = await projectDAL.findById(projectId);
const inviteeMembershipOrg = await orgDAL.findMembership({ const inviteeMembershipOrg = await orgDAL.findMembership({
userId: invitee.id, userId: invitee.id,
orgId: project.orgId, orgId: project.orgId,
status: OrgMembershipStatus.Accepted status: OrgMembershipStatus.Accepted
}); });
if (!inviteeMembershipOrg)
if (!inviteeMembershipOrg) {
throw new BadRequestError({ throw new BadRequestError({
message: "Failed to validate invitee org membership", message: "Failed to validate invitee org membership",
name: "Invite user to project" name: "Invite user to project"
}); });
}
await projectMembershipDAL.create({ await projectMembershipDAL.create(
{
userId: invitee.id, userId: invitee.id,
projectId, projectId,
role: ProjectMembershipRole.Member role: ProjectMembershipRole.Member
}); },
tx
);
invitees.push(invitee);
}
const appCfg = getConfig(); const appCfg = getConfig();
await smtpService.sendMail({ await smtpService.sendMail({
template: SmtpTemplates.WorkspaceInvite, template: SmtpTemplates.WorkspaceInvite,
subjectLine: "Infisical workspace invitation", subjectLine: "Infisical workspace invitation",
recipients: [invitee.email], recipients: invitees.map((i) => i.email),
substitutions: { substitutions: {
workspaceName: project.name, workspaceName: project.name,
callback_url: `${appCfg.SITE_URL}/login` callback_url: `${appCfg.SITE_URL}/login`
} }
}); });
});
invitees.push(invitee);
}
const latestKey = await projectKeyDAL.findLatestProjectKey(actorId, projectId); const latestKey = await projectKeyDAL.findLatestProjectKey(actorId, projectId);