New service for deleting memberships by email

This commit is contained in:
Daniel Hougaard
2024-02-13 18:20:17 +01:00
parent 1b82a157cc
commit 4cca82c3c8

View File

@@ -18,6 +18,7 @@ import { BadRequestError } from "@app/lib/errors";
import { groupBy } from "@app/lib/fn"; import { groupBy } from "@app/lib/fn";
import { createWsMembers } from "@app/lib/project"; import { createWsMembers } from "@app/lib/project";
import { ActorType } from "../auth/auth-type";
import { TOrgDALFactory } from "../org/org-dal"; import { TOrgDALFactory } from "../org/org-dal";
import { TProjectDALFactory } from "../project/project-dal"; import { TProjectDALFactory } from "../project/project-dal";
import { TProjectBotDALFactory } from "../project-bot/project-bot-dal"; import { TProjectBotDALFactory } from "../project-bot/project-bot-dal";
@@ -29,7 +30,8 @@ import { TProjectMembershipDALFactory } from "./project-membership-dal";
import { import {
TAddUsersToWorkspaceDTO, TAddUsersToWorkspaceDTO,
TAddUsersToWorkspaceNonE2EEDTO, TAddUsersToWorkspaceNonE2EEDTO,
TDeleteProjectMembershipDTO, TDeleteProjectMembershipOldDTO,
TDeleteProjectMembershipsDTO,
TGetProjectMembershipDTO, TGetProjectMembershipDTO,
TInviteUserToProjectDTO, TInviteUserToProjectDTO,
TUpdateProjectMembershipDTO TUpdateProjectMembershipDTO
@@ -355,21 +357,22 @@ export const projectMembershipServiceFactory = ({
return membership; return membership;
}; };
// This is old and should be removed later. Its not used anywhere, but it is exposed in our API. So to avoid breaking changes, we are keeping it for now.
const deleteProjectMembership = async ({ const deleteProjectMembership = async ({
actorId, actorId,
actor, actor,
actorOrgId, actorOrgId,
projectId, projectId,
membershipId membershipId
}: TDeleteProjectMembershipDTO) => { }: TDeleteProjectMembershipOldDTO) => {
const { permission } = await permissionService.getProjectPermission(actor, actorId, projectId, actorOrgId); const { permission } = await permissionService.getProjectPermission(actor, actorId, projectId, actorOrgId);
ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.Member); ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.Member);
const membershipUser = await userDAL.findUserByProjectMembershipId(membershipId); const member = await userDAL.findUserByProjectMembershipId(membershipId);
if (membershipUser?.ghost) { if (member?.ghost) {
throw new BadRequestError({ throw new BadRequestError({
message: "Cannot delete ghost", message: "Unauthorized member delete",
name: "Delete project membership" name: "Delete project membership"
}); });
} }
@@ -382,12 +385,65 @@ export const projectMembershipServiceFactory = ({
return membership; return membership;
}; };
const deleteProjectMemberships = async ({
actorId,
actor,
actorOrgId,
projectId,
emails
}: TDeleteProjectMembershipsDTO) => {
const { permission } = await permissionService.getProjectPermission(actor, actorId, projectId, actorOrgId);
ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.Member);
const projectMembers = await projectMembershipDAL.findMembershipsByEmail(projectId, emails);
if (projectMembers.length !== emails.length) {
throw new BadRequestError({
message: "Some users are not part of project",
name: "Delete project membership"
});
}
if (actor === ActorType.USER && projectMembers.some(({ user }) => user.id === actorId)) {
throw new BadRequestError({
message: "Cannot remove yourself from project",
name: "Delete project membership"
});
}
const memberships = await projectMembershipDAL.transaction(async (tx) => {
const deletedMemberships = await projectMembershipDAL.delete(
{
projectId,
$in: {
id: projectMembers.map(({ id }) => id)
}
},
tx
);
await projectKeyDAL.delete(
{
projectId,
$in: {
receiverId: projectMembers.map(({ user }) => user.id).filter(Boolean)
}
},
tx
);
return deletedMemberships;
});
return memberships;
};
return { return {
getProjectMemberships, getProjectMemberships,
inviteUserToProject, inviteUserToProject,
updateProjectMembership, updateProjectMembership,
addUsersToProjectNonE2EE, addUsersToProjectNonE2EE,
deleteProjectMembership, deleteProjectMemberships,
deleteProjectMembership, // TODO: Remove this
addUsersToProject addUsersToProject
}; };
}; };