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 }
throw new BadRequestError({ });
message: "Failed to validate invitee",
name: "Invite user to project" await projectDAL.transaction(async (tx) => {
for (const invitee of users) {
if (!invitee.isAccepted)
throw new BadRequestError({
message: "Failed to validate invitee",
name: "Invite user to project"
});
const inviteeMembership = await projectMembershipDAL.findOne(
{
userId: invitee.id,
projectId
},
tx
);
if (inviteeMembership) {
throw new BadRequestError({
message: "Existing member of project",
name: "Invite user to project"
});
}
const inviteeMembershipOrg = await orgDAL.findMembership({
userId: invitee.id,
orgId: project.orgId,
status: OrgMembershipStatus.Accepted
}); });
const inviteeMembership = await projectMembershipDAL.findOne({ if (!inviteeMembershipOrg) {
userId: invitee.id, throw new BadRequestError({
projectId message: "Failed to validate invitee org membership",
}); name: "Invite user to project"
if (inviteeMembership) });
throw new BadRequestError({ }
message: "Existing member of project",
name: "Invite user to project"
});
const project = await projectDAL.findById(projectId); await projectMembershipDAL.create(
const inviteeMembershipOrg = await orgDAL.findMembership({ {
userId: invitee.id, userId: invitee.id,
orgId: project.orgId, projectId,
status: OrgMembershipStatus.Accepted role: ProjectMembershipRole.Member
}); },
if (!inviteeMembershipOrg) tx
throw new BadRequestError({ );
message: "Failed to validate invitee org membership",
name: "Invite user to project"
});
await projectMembershipDAL.create({ invitees.push(invitee);
userId: invitee.id, }
projectId,
role: ProjectMembershipRole.Member
});
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);