mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-06 05:26:43 +00:00
Improved invite user to project (even though this function isn't actually used.)
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user